diff --git a/pkgs/clan-cli/clan_cli/completions.py b/pkgs/clan-cli/clan_cli/completions.py index d8e9d064..4a0f02f1 100644 --- a/pkgs/clan-cli/clan_cli/completions.py +++ b/pkgs/clan-cli/clan_cli/completions.py @@ -118,6 +118,32 @@ def complete_services_for_machine( return services_dict +def complete_secrets( + prefix: str, parsed_args: argparse.Namespace, **kwargs: Any +) -> Iterable[str]: + """ + Provides completion functionality for clan secrets + """ + from pathlib import Path + + from .secrets.secrets import ListSecretsOptions, list_secrets + + if (clan_dir_result := clan_dir(None)) is not None: + flake = clan_dir_result + else: + flake = "." + + options = ListSecretsOptions( + flake=Path(flake), + pattern=None, + ) + + secrets = list_secrets(options.flake, options.pattern) + + secrets_dict = {name: "secret" for name in secrets} + return secrets_dict + + def add_dynamic_completer( action: argparse.Action, completer: Callable[..., Iterable[str]], diff --git a/pkgs/clan-cli/clan_cli/secrets/secrets.py b/pkgs/clan-cli/clan_cli/secrets/secrets.py index 7ee2e852..bb989a4b 100644 --- a/pkgs/clan-cli/clan_cli/secrets/secrets.py +++ b/pkgs/clan-cli/clan_cli/secrets/secrets.py @@ -9,6 +9,7 @@ from pathlib import Path from typing import IO from .. import tty +from ..completions import add_dynamic_completer, complete_secrets from ..errors import ClanError from ..git import commit_files from .folders import ( @@ -153,8 +154,12 @@ def remove_command(args: argparse.Namespace) -> None: remove_secret(Path(args.flake), args.secret) -def add_secret_argument(parser: argparse.ArgumentParser) -> None: - parser.add_argument("secret", help="the name of the secret", type=secret_name_type) +def add_secret_argument(parser: argparse.ArgumentParser, autocomplete: bool) -> None: + secrets_parser = parser.add_argument( + "secret", help="the name of the secret", type=secret_name_type + ) + if autocomplete: + add_dynamic_completer(secrets_parser, complete_secrets) def machines_folder(flake_dir: Path, group: str) -> Path: @@ -323,11 +328,11 @@ def register_secrets_parser(subparser: argparse._SubParsersAction) -> None: parser_list.set_defaults(func=list_command) parser_get = subparser.add_parser("get", help="get a secret") - add_secret_argument(parser_get) + add_secret_argument(parser_get, True) parser_get.set_defaults(func=get_command) parser_set = subparser.add_parser("set", help="set a secret") - add_secret_argument(parser_set) + add_secret_argument(parser_set, False) parser_set.add_argument( "--group", type=str, @@ -359,10 +364,10 @@ def register_secrets_parser(subparser: argparse._SubParsersAction) -> None: parser_set.set_defaults(func=set_command) parser_rename = subparser.add_parser("rename", help="rename a secret") - add_secret_argument(parser_rename) + add_secret_argument(parser_rename, True) parser_rename.add_argument("new_name", type=str, help="the new name of the secret") parser_rename.set_defaults(func=rename_command) parser_remove = subparser.add_parser("remove", help="remove a secret") - add_secret_argument(parser_remove) + add_secret_argument(parser_remove, True) parser_remove.set_defaults(func=remove_command)