Skip to main content

dotm/
list.rs

1use crate::config::RootConfig;
2use crate::loader::ConfigLoader;
3use anyhow::Result;
4
5pub fn render_packages(root: &RootConfig, verbose: bool) -> String {
6    let mut names: Vec<&String> = root.packages.keys().collect();
7    names.sort();
8
9    let mut out = String::new();
10    for name in names {
11        if verbose {
12            let pkg = &root.packages[name];
13            out.push_str(name);
14            if let Some(ref desc) = pkg.description {
15                out.push_str(&format!(" — {desc}"));
16            }
17            out.push('\n');
18            if !pkg.depends.is_empty() {
19                out.push_str(&format!("  depends: {}\n", pkg.depends.join(", ")));
20            }
21            if !pkg.suggests.is_empty() {
22                out.push_str(&format!("  suggests: {}\n", pkg.suggests.join(", ")));
23            }
24            if let Some(ref target) = pkg.target {
25                out.push_str(&format!("  target: {target}\n"));
26            }
27            if pkg.system {
28                out.push_str("  system: true\n");
29            }
30        } else {
31            out.push_str(name);
32            if let Some(ref desc) = root.packages[name].description {
33                out.push_str(&format!(" — {desc}"));
34            }
35            out.push('\n');
36        }
37    }
38    out
39}
40
41pub fn render_roles(loader: &ConfigLoader, verbose: bool) -> Result<String> {
42    let roles = loader.list_roles()?;
43    let mut out = String::new();
44    for name in &roles {
45        out.push_str(name);
46        if verbose {
47            if let Ok(role) = loader.load_role(name) {
48                out.push_str(&format!(" [{}]", role.packages.join(", ")));
49            }
50        }
51        out.push('\n');
52    }
53    Ok(out)
54}
55
56pub fn render_hosts(loader: &ConfigLoader, verbose: bool) -> Result<String> {
57    let hosts = loader.list_hosts()?;
58    let mut out = String::new();
59    for name in &hosts {
60        out.push_str(name);
61        if verbose {
62            if let Ok(host) = loader.load_host(name) {
63                out.push_str(&format!(" [{}]", host.roles.join(", ")));
64            }
65        }
66        out.push('\n');
67    }
68    Ok(out)
69}
70
71pub fn render_tree(loader: &ConfigLoader) -> Result<String> {
72    let hosts = loader.list_hosts()?;
73    let mut out = String::new();
74
75    for (hi, host_name) in hosts.iter().enumerate() {
76        let is_last_host = hi == hosts.len() - 1;
77        let host_prefix = if is_last_host { "└── " } else { "├── " };
78        out.push_str(&format!("{host_prefix}{host_name}\n"));
79
80        if let Ok(host) = loader.load_host(host_name) {
81            for (ri, role_name) in host.roles.iter().enumerate() {
82                let is_last_role = ri == host.roles.len() - 1;
83                let branch = if is_last_host { "    " } else { "│   " };
84                let role_prefix = if is_last_role { "└── " } else { "├── " };
85                out.push_str(&format!("{branch}{role_prefix}{role_name}\n"));
86
87                if let Ok(role) = loader.load_role(role_name) {
88                    for (pi, pkg_name) in role.packages.iter().enumerate() {
89                        let is_last_pkg = pi == role.packages.len() - 1;
90                        let inner_branch = if is_last_role { "    " } else { "│   " };
91                        let pkg_prefix = if is_last_pkg { "└── " } else { "├── " };
92                        out.push_str(&format!("{branch}{inner_branch}{pkg_prefix}{pkg_name}\n"));
93                    }
94                }
95            }
96        }
97    }
98    Ok(out)
99}