tab function

Tab tab(
  1. dynamic runner
)

Implementation

coal.Tab tab(CommandRunner runner) {
  final command = CompleteCommand(runner), tab = command.tab;
  runner.addCommand(command);

  void optionComplete(coal.Complete complete, Option option) {
    if (option.allowed != null) {
      for (final value in option.allowed!) {
        final description = option.allowedHelp?[value] ?? '';
        complete(value, description);
      }
    }
  }

  coal.Option createOption(coal.Command command, String name, Option option) {
    if (option.isFlag) {
      return tab.option(name, option.help ?? '', null, alias: option.abbr);
    }

    return command.option(
      name,
      option.help ?? '',
      (complete, _) => optionComplete(complete, option),
      alias: option.abbr,
    );
  }

  void optionCompletions(coal.Command def, ArgParser parser) {
    for (final MapEntry(:key, :value) in parser.options.entries) {
      final option = createOption(def, key, value);
      for (final alias in value.aliases) {
        def.option(alias, option.description, option.handler);
      }
    }
  }

  void subCommandCompletions(coal.Command def, Command command) {
    for (final MapEntry(:key, :value) in command.subcommands.entries) {
      final def = tab.command(key, value.description);
      optionCompletions(def, value.argParser);
      subCommandCompletions(def, value);
    }
  }

  optionCompletions(tab, runner.argParser);
  for (final MapEntry(:key, :value) in runner.commands.entries) {
    final command = tab.command(key, value.description);
    if (key == 'complete') {
      command.argument('shell', (complete, _) {
        complete('bash', 'Bash completion');
        complete('zsh', 'Zsh completion');
        complete('fish', 'Fish completion');
        complete('powershell', 'PowerShell completion');
      });
      continue;
    }

    optionCompletions(command, value.argParser);
    subCommandCompletions(command, value);
  }

  return tab;
}