parse method

CliConfig parse(
  1. List<String> args
)

Parse command-line arguments into a CliConfig.

Implementation

CliConfig parse(List<String> args) {
  String? command;
  final positional = <String>[];
  final flags = <String, String>{};
  final options = <String, String>{};
  bool verbose = false;
  bool quiet = false;
  bool jsonOutput = false;
  String? model;
  String? apiKey;
  int? maxTokens;
  String? systemPrompt;
  List<String> allowedTools = [];
  PermissionMode? permissionMode;
  String? workDir;
  String? sessionId;
  bool continueSession = false;
  bool printOnly = false;
  bool dangerouslySkipPermissions = false;
  final mcpServers = <String>[];
  bool listen = false;
  int? listenPort;
  String? outputFormat;

  int i = 0;
  while (i < args.length) {
    final arg = args[i];

    if (arg == '--') {
      // Everything after -- is positional.
      positional.addAll(args.sublist(i + 1));
      break;
    }

    if (arg.startsWith('-')) {
      final flagDef = CliFlags.lookup(arg);
      if (flagDef == null) {
        flags[arg.replaceFirst(RegExp(r'^-{1,2}'), '')] = 'true';
        i++;
        continue;
      }

      String? value;
      if (flagDef.takesValue) {
        if (i + 1 >= args.length) {
          throw ArgumentError('Flag $arg requires a value');
        }
        value = args[++i];
      }

      switch (flagDef.long) {
        case 'model':
          model = value;
        case 'api-key':
          apiKey = value;
        case 'max-tokens':
          maxTokens = int.tryParse(value ?? '');
        case 'system-prompt':
          systemPrompt = value;
        case 'permission-mode':
          permissionMode = _parsePermissionMode(value!);
        case 'allowed-tools':
          allowedTools = value!.split(',').map((s) => s.trim()).toList();
        case 'work-dir':
          workDir = value;
        case 'session':
          sessionId = value;
        case 'continue':
          continueSession = true;
        case 'json':
          jsonOutput = true;
        case 'verbose':
          verbose = true;
        case 'quiet':
          quiet = true;
        case 'print':
          printOnly = true;
        case 'dangerous-skip-permissions':
          dangerouslySkipPermissions = true;
        case 'mcp':
          mcpServers.add(value!);
        case 'listen':
          listen = true;
        case 'listen-port':
          listenPort = int.tryParse(value ?? '');
        case 'output-format':
          outputFormat = value;
        case 'version':
          flags['version'] = 'true';
        case 'help':
          flags['help'] = 'true';
        default:
          if (value != null) {
            options[flagDef.long] = value;
          } else {
            flags[flagDef.long] = 'true';
          }
      }
    } else {
      // First non-flag is treated as a subcommand if no command yet.
      if (command == null && _isSubcommand(arg)) {
        command = arg;
      } else {
        positional.add(arg);
      }
    }
    i++;
  }

  return CliConfig(
    command: command,
    positionalArgs: positional,
    flags: flags,
    options: options,
    verbose: verbose,
    quiet: quiet,
    jsonOutput: jsonOutput,
    model: model,
    apiKey: apiKey,
    maxTokens: maxTokens,
    systemPrompt: systemPrompt,
    allowedTools: allowedTools,
    permissionMode: permissionMode,
    workDir: workDir,
    sessionId: sessionId,
    continueSession: continueSession,
    printOnly: printOnly,
    dangerouslySkipPermissions: dangerouslySkipPermissions,
    mcpServers: mcpServers,
    listen: listen,
    listenPort: listenPort,
    outputFormat: outputFormat,
  );
}