You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
40 lines
1.2 KiB
40 lines
1.2 KiB
import {Unit, Logging} from "@extollo/lib"
|
|
import {Singleton, Inject} from "@extollo/di"
|
|
import {CommandLine} from "./CommandLine"
|
|
import {UsageDirective} from "../directive/UsageDirective";
|
|
import {Directive} from "../Directive";
|
|
import {ShellDirective} from "../directive/ShellDirective";
|
|
|
|
@Singleton()
|
|
export class CommandLineApplication extends Unit {
|
|
private static replacement?: typeof Unit
|
|
public static setReplacement(unitClass?: typeof Unit) {
|
|
this.replacement = unitClass
|
|
}
|
|
|
|
@Inject()
|
|
protected readonly cli!: CommandLine
|
|
|
|
@Inject()
|
|
protected readonly logging!: Logging
|
|
|
|
constructor() { super() }
|
|
|
|
public async up() {
|
|
this.cli.registerDirective(UsageDirective)
|
|
this.cli.registerDirective(ShellDirective)
|
|
|
|
const argv = process.argv.slice(2)
|
|
const match = this.cli.getDirectives()
|
|
.map(dirCls => this.make<Directive>(dirCls))
|
|
.firstWhere(dir => dir.matchesKeyword(argv[0]))
|
|
|
|
if ( match ) {
|
|
await match.invoke(argv.slice(1))
|
|
} else {
|
|
const usage = this.make<UsageDirective>(UsageDirective)
|
|
await usage.handle(process.argv)
|
|
}
|
|
}
|
|
}
|