diff --git a/pkgs/clan-cli/clan_cli/completions.py b/pkgs/clan-cli/clan_cli/completions.py index 0fd4663b0..4157010a2 100644 --- a/pkgs/clan-cli/clan_cli/completions.py +++ b/pkgs/clan-cli/clan_cli/completions.py @@ -118,6 +118,49 @@ def complete_services_for_machine( return services_dict +def complete_backup_providers_for_machine( + prefix: str, parsed_args: argparse.Namespace, **kwargs: Any +) -> Iterable[str]: + """ + Provides completion functionality for machine backup providers. + """ + services: list[str] = [] + # TODO: consolidate, if multiple machines are used + machines: list[str] = parsed_args.machines + + def run_cmd() -> None: + try: + if (clan_dir_result := clan_dir(None)) is not None: + flake = clan_dir_result + else: + flake = "." + services_result = json.loads( + run( + nix_eval( + flags=[ + f"{flake}#nixosConfigurations.{machines[0]}.config.clanCore.backups.providers", + "--apply", + "builtins.attrNames", + ], + ), + ).stdout.strip() + ) + + services.extend(services_result) + except subprocess.CalledProcessError: + pass + + thread = threading.Thread(target=run_cmd) + thread.start() + thread.join(timeout=COMPLETION_TIMEOUT) + + if thread.is_alive(): + return iter([]) + + services_dict = {name: "service" for name in services} + return services_dict + + def complete_secrets( prefix: str, parsed_args: argparse.Namespace, **kwargs: Any ) -> Iterable[str]: