api: improve message serialisation

This commit is contained in:
Johannes Kirschbauer
2024-05-23 09:33:57 +02:00
parent fc8a64ef49
commit 691ae9fb15
9 changed files with 91 additions and 30 deletions

View File

@@ -1,12 +1,14 @@
from collections.abc import Callable
from typing import Any
from typing import Any, TypeVar
T = TypeVar("T")
class _MethodRegistry:
def __init__(self) -> None:
self._registry: dict[str, Callable] = {}
def register(self, fn: Callable) -> Callable:
def register(self, fn: Callable[..., T]) -> Callable[..., T]:
self._registry[fn.__name__] = fn
return fn

View File

@@ -44,6 +44,7 @@ def type_to_dict(t: Any, scope: str = "") -> dict:
elif issubclass(origin, dict):
return {
"type": "object",
"additionalProperties": type_to_dict(t.__args__[1], scope),
}
raise BaseException(f"Error api type not yet supported {t!s}")

View File

@@ -1,4 +1,5 @@
import argparse
import dataclasses
import json
import logging
from pathlib import Path
@@ -11,18 +12,24 @@ from ..nix import nix_config, nix_eval
log = logging.getLogger(__name__)
@dataclasses.dataclass
class MachineInfo:
machine_name: str
machine_description: str | None
machine_icon: str | None
@API.register
def list_machines(
debug: bool,
flake_url: Path | str,
) -> list[str]:
def list_machines(debug: bool, flake_url: Path | str) -> dict[str, MachineInfo]:
config = nix_config()
system = config["system"]
cmd = nix_eval(
[
f"{flake_url}#clanInternals.machines.{system}",
"--apply",
"builtins.attrNames",
"""builtins.mapAttrs (name: attrs: {
inherit (attrs.config.clanCore) machineDescription machineIcon machineName;
})""",
"--json",
]
)
@@ -33,12 +40,20 @@ def list_machines(
proc = run(cmd)
res = proc.stdout.strip()
return json.loads(res)
machines_dict = json.loads(res)
return {k: MachineInfo(**v) for k, v in machines_dict.items()}
def list_command(args: argparse.Namespace) -> None:
for machine in list_machines(args.debug, Path(args.flake)):
print(machine)
flake_path = Path(args.flake).resolve()
print("Listing all machines:\n")
print("Source: ", flake_path)
print("-" * 40)
for name, machine in list_machines(args.debug, flake_path).items():
description = machine.machine_description or "[no description]"
print(f"{name}\n: {description}\n")
print("-" * 40)
def register_list_parser(parser: argparse.ArgumentParser) -> None: