"""Application composition root for the uvm command-line executable.""" from __future__ import annotations from collections.abc import Callable from dataclasses import dataclass from .config import Settings from .firecracker.process import FirecrackerProcessManager from .images import ImageStore from .install import Installer from .known_hosts import KnownHostsManager from .lifecycle import LifecycleService from .network import NetworkManager from .state import StateStore from .system import CommandRunner from .tools import ToolService @dataclass(slots=True) class Application: """Concrete host services used by the CLI; this is not a public SDK.""" settings: Settings state_store: StateStore installer: Installer lifecycle: LifecycleService tools: ToolService | None = None def build_application(emit: Callable[[str], None] | None = print) -> Application: settings = Settings.from_environment() runner = CommandRunner(emit=emit) state_store = StateStore(settings) images = ImageStore(settings, runner) network = NetworkManager(settings, runner) process = FirecrackerProcessManager(settings) known_hosts = KnownHostsManager(settings) lifecycle = LifecycleService(settings, state_store, images, network, process, known_hosts=known_hosts) installer = Installer(settings, runner, state_store, emit=emit) return Application( settings=settings, state_store=state_store, installer=installer, lifecycle=lifecycle, tools=ToolService(settings, state_store, lifecycle), )