put new cli parser to use in CLIAppBase
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
package lib;
|
||||
|
||||
import lib.args.CLIArgs;
|
||||
import lib.args.ArgType;
|
||||
import kernel.ps.IProcess;
|
||||
import kernel.ps.ProcessHandle;
|
||||
|
||||
@@ -8,9 +10,9 @@ using tink.CoreApi;
|
||||
abstract class CLIAppBase implements IProcess {
|
||||
private var handle:ProcessHandle;
|
||||
|
||||
private final _subcommandsSync:Map<String, (Array<String>) -> Bool> = [];
|
||||
private final _subcommandsAsync:Map<String, (Array<String>) -> Future<Bool>> = [];
|
||||
private final _subcommandsSynopsis:Array<String> = [];
|
||||
private final _subcommandsSync:Map<String, (CLIArgs) -> Bool> = [];
|
||||
private final _subcommandsAsync:Map<String, (CLIArgs) -> Future<Bool>> = [];
|
||||
private final _subcommandsArgs:Map<String, Array<ArgType>> = [];
|
||||
|
||||
public final function run(handle:ProcessHandle) {
|
||||
this.handle = handle;
|
||||
@@ -26,10 +28,19 @@ abstract class CLIAppBase implements IProcess {
|
||||
var args = handle.args.slice(1);
|
||||
|
||||
if (_subcommandsSync.exists(subcommand)) {
|
||||
var result = _subcommandsSync[subcommand](args);
|
||||
return handle.close(result);
|
||||
var argParser = new CLIArgs(_subcommandsArgs.get(subcommand));
|
||||
if (!argParser.parse(args)) {
|
||||
handle.writeLine(argParser.getError());
|
||||
return handle.close(false);
|
||||
}
|
||||
return handle.close(_subcommandsSync[subcommand](argParser));
|
||||
} else if (_subcommandsAsync.exists(subcommand)) {
|
||||
_subcommandsAsync[subcommand](args).handle(handle.close);
|
||||
var argParser = new CLIArgs(_subcommandsArgs.get(subcommand));
|
||||
if (!argParser.parse(args)) {
|
||||
handle.writeLine(argParser.getError());
|
||||
return handle.close(false);
|
||||
}
|
||||
_subcommandsAsync[subcommand](argParser).handle(handle.close);
|
||||
} else {
|
||||
handle.writeLine("Unknown subcommand: " + subcommand);
|
||||
printHelp();
|
||||
@@ -37,21 +48,21 @@ abstract class CLIAppBase implements IProcess {
|
||||
}
|
||||
}
|
||||
|
||||
private function registerSyncSubcommand(command:String, callback:(Array<String>) -> Bool, synopsis:String = null) {
|
||||
private function registerSyncSubcommand(command:String, callback:(CLIArgs) -> Bool, args:Array<ArgType> = null) {
|
||||
_subcommandsSync.set(command, callback);
|
||||
_subcommandsSynopsis.push(command + " " + (synopsis ?? ""));
|
||||
_subcommandsArgs.set(command, args ?? []);
|
||||
}
|
||||
|
||||
private function registerAsyncSubcommand(command:String, callback:(Array<String>) -> Future<Bool>, synopsis:String = null) {
|
||||
private function registerAsyncSubcommand(command:String, callback:(CLIArgs) -> Future<Bool>, args:Array<ArgType> = null) {
|
||||
_subcommandsAsync.set(command, callback);
|
||||
_subcommandsSynopsis.push(command + " " + (synopsis ?? ""));
|
||||
_subcommandsArgs.set(command, args ?? []);
|
||||
}
|
||||
|
||||
private function printHelp() {
|
||||
handle.writeLine("Usage: <subcommand> [args]");
|
||||
handle.writeLine("Subcommands:");
|
||||
for (subcommand in _subcommandsSynopsis) {
|
||||
handle.writeLine(" " + subcommand);
|
||||
for (k => v in this._subcommandsArgs) {
|
||||
handle.writeLine(' $k ${CLIArgs.getSynopsis(v)}');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user