"""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 .lifecycle import LifecycleService from .network import NetworkManager from .state import StateStore from .system import CommandRunner @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 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) lifecycle = LifecycleService(settings, state_store, images, network, process) installer = Installer(settings, runner, state_store, emit=emit) return Application( settings=settings, state_store=state_store, installer=installer, lifecycle=lifecycle, )