From bcccf301f08c25eb3c0bf4fbd36ef38f7b997504 Mon Sep 17 00:00:00 2001 From: a-kenji Date: Fri, 31 May 2024 15:21:07 +0200 Subject: [PATCH] clan: add dynamic completions for fact generation services --- pkgs/clan-cli/clan_cli/completions.py | 46 ++++++++++++++++++++++++ pkgs/clan-cli/clan_cli/facts/generate.py | 10 ++++-- 2 files changed, 54 insertions(+), 2 deletions(-) diff --git a/pkgs/clan-cli/clan_cli/completions.py b/pkgs/clan-cli/clan_cli/completions.py index 21e9fc1c..d8e9d064 100644 --- a/pkgs/clan-cli/clan_cli/completions.py +++ b/pkgs/clan-cli/clan_cli/completions.py @@ -6,6 +6,9 @@ from collections.abc import Callable, Iterable from types import ModuleType from typing import Any +from .cmd import run +from .nix import nix_eval + """ This module provides dynamic completions. The completions should feel fast. @@ -72,6 +75,49 @@ def complete_machines( return machines_dict +def complete_services_for_machine( + prefix: str, parsed_args: argparse.Namespace, **kwargs: Any +) -> Iterable[str]: + """ + Provides completion functionality for machine facts generation services. + """ + 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.facts.services", + "--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 add_dynamic_completer( action: argparse.Action, completer: Callable[..., Iterable[str]], diff --git a/pkgs/clan-cli/clan_cli/facts/generate.py b/pkgs/clan-cli/clan_cli/facts/generate.py index efcef4ba..16b8c131 100644 --- a/pkgs/clan-cli/clan_cli/facts/generate.py +++ b/pkgs/clan-cli/clan_cli/facts/generate.py @@ -9,7 +9,11 @@ from tempfile import TemporaryDirectory from clan_cli.cmd import run -from ..completions import add_dynamic_completer, complete_machines +from ..completions import ( + add_dynamic_completer, + complete_machines, + complete_services_for_machine, +) from ..errors import ClanError from ..git import commit_files from ..machines.inventory import get_all_machines, get_selected_machines @@ -226,12 +230,14 @@ def register_generate_parser(parser: argparse.ArgumentParser) -> None: ) add_dynamic_completer(machines_parser, complete_machines) - parser.add_argument( + service_parser = parser.add_argument( "--service", type=str, help="service to generate facts for, if empty, generate facts for every service", default=None, ) + add_dynamic_completer(service_parser, complete_services_for_machine) + parser.add_argument( "--regenerate", type=bool,