run method
Parses args
and invokes Command.run
on the chosen command.
This always returns a Future in case the command is asynchronous. The
Future will throw a UsageException
if args
was invalid.
Implementation
@override
Future<void> run(Iterable<String> args) async {
// Enable hierarchical logging
pkg_logging.hierarchicalLoggingEnabled = true;
try {
// Parse arguments
final argResults = argParser.parse(args);
if (argResults['help'] as bool) {
throw UsageException(usage, usage);
}
// Handle debug mode
if (argResults['debug'] as bool) {
debugMode = true;
print('Debug mode enabled');
}
// Set up logging
final logLevel = argResults['level'] as String?;
final logCategory = argResults['category'] as String?;
pkg_logging.Level? cliLevel;
if (logLevel != null && logLevel.isNotEmpty) {
cliLevel = pkg_logging.Level.LEVELS.firstWhere(
(lvl) => lvl.name.toUpperCase() == logLevel.toUpperCase(),
orElse: () => pkg_logging.Level.WARNING,
);
}
setLualikeLogging(
enabled: debugMode,
level: cliLevel,
category: logCategory,
);
// Note: execution mode is handled by individual commands
// Handle special case where no arguments provided
if (args.isEmpty) {
if (stdin.hasTerminal) {
// Terminal mode: show version and enter interactive mode
final versionCmd = VersionCommand();
await versionCmd.run();
final interactiveCmd = InteractiveCommandWrapper(
debugMode: debugMode,
);
await interactiveCmd.run();
} else {
// Non-terminal mode: read from stdin
final stdinCmd = StdinCommand([], args.toList());
await stdinCmd.run();
}
return;
}
// Handle special case for single '-' argument (stdin)
if (args.length == 1 && args.first == '-') {
final stdinCmd = StdinCommand([], args.toList());
await stdinCmd.run();
return;
}
// Handle version flag
if (argResults['version'] as bool) {
final versionCmd = VersionCommand();
await versionCmd.run();
}
// Handle LUA_INIT using BaseCommand functionality
final baseCmd = _LuaInitCommand();
await baseCmd.handleLuaInit();
// Handle require files (-l)
final requireFiles = argResults['require'] as List<String>;
for (final file in requireFiles) {
final requireCmd = RequireCommand(file, args.toList());
await requireCmd.run();
}
// Handle execute strings (-e)
final executeStrings = argResults['execute'] as List<String>;
for (final code in executeStrings) {
final executeCmd = ExecuteCommand(code, args.toList());
await executeCmd.run();
}
// Handle script file and arguments
final restArgs = argResults.rest;
if (restArgs.isNotEmpty) {
final scriptPath = restArgs.first;
final scriptArgs = restArgs.skip(1).toList();
final scriptCmd = ScriptCommand(scriptPath, scriptArgs, args.toList());
await scriptCmd.run();
}
// Handle interactive mode (-i)
if (argResults['interactive'] as bool) {
final interactiveCmd = InteractiveCommandWrapper(debugMode: debugMode);
await interactiveCmd.run();
}
} catch (e) {
if (e is UsageException) {
print(usage);
exit(1);
}
rethrow;
}
}