Skip to main content

podbox/codegen/quadlet/
mod.rs

1//! Quadlet unit generation for `podbox enable`.
2//!
3//! Slim dispatcher module; the `.container` section emitters live in
4//! [`container`], device passthrough in [`devices`], and companion units
5//! in [`services`].
6
7mod container;
8mod devices;
9mod services;
10
11pub use devices::{emit_hardware_devices, emit_secrets};
12pub use services::{
13    generate_build, generate_compositor_service, generate_dbus_proxy_service,
14    generate_host_service, generate_socket,
15};
16
17use crate::config::Config;
18use crate::env::HostEnv;
19use crate::xdg::ResolvedXdgDirs;
20
21/// Generate the `.container` Quadlet file.
22///
23/// Pure function: all paths via HostEnv and ResolvedXdgDirs.
24pub fn generate_container(config: &Config, env: &HostEnv, xdg: &ResolvedXdgDirs) -> String {
25    let name = &config.container.name;
26    let home_in_container = "/home/%u";
27    let mut lines: Vec<String> = Vec::new();
28
29    container::emit_unit(&mut lines, config, name);
30    container::emit_container_image(&mut lines, config, name, home_in_container, env);
31    container::emit_network(&mut lines, config);
32    container::emit_volumes(&mut lines, config, xdg, env, name, home_in_container);
33    container::emit_env(&mut lines, config, name, env);
34    devices::emit_gpu(&mut lines, config, env);
35    devices::emit_hardware_devices(&mut lines, config);
36    devices::emit_secrets(&mut lines, config);
37    container::emit_auto_update(&mut lines, config);
38    container::emit_podman_args(&mut lines, config);
39    container::emit_service_section(&mut lines, config);
40    container::emit_install_section(&mut lines, config);
41
42    lines.join("\n")
43}