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 let Some(strategy) = pkg.strategy {
28                out.push_str(&format!("  strategy: {strategy:?}\n"));
29            }
30            if pkg.system {
31                out.push_str("  system: true\n");
32            }
33        } else {
34            out.push_str(name);
35            if let Some(ref desc) = root.packages[name].description {
36                out.push_str(&format!(" — {desc}"));
37            }
38            out.push('\n');
39        }
40    }
41    out
42}
43
44pub fn render_roles(loader: &ConfigLoader, verbose: bool) -> Result<String> {
45    let roles = loader.list_roles()?;
46    let mut out = String::new();
47    for name in &roles {
48        out.push_str(name);
49        if verbose {
50            if let Ok(role) = loader.load_role(name) {
51                out.push_str(&format!(" [{}]", role.packages.join(", ")));
52            }
53        }
54        out.push('\n');
55    }
56    Ok(out)
57}
58
59pub fn render_hosts(loader: &ConfigLoader, verbose: bool) -> Result<String> {
60    let hosts = loader.list_hosts()?;
61    let mut out = String::new();
62    for name in &hosts {
63        out.push_str(name);
64        if verbose {
65            if let Ok(host) = loader.load_host(name) {
66                out.push_str(&format!(" [{}]", host.roles.join(", ")));
67            }
68        }
69        out.push('\n');
70    }
71    Ok(out)
72}
73
74pub fn render_tree(loader: &ConfigLoader) -> Result<String> {
75    let hosts = loader.list_hosts()?;
76    let mut out = String::new();
77
78    for (hi, host_name) in hosts.iter().enumerate() {
79        let is_last_host = hi == hosts.len() - 1;
80        let host_prefix = if is_last_host { "└── " } else { "├── " };
81        out.push_str(&format!("{host_prefix}{host_name}\n"));
82
83        if let Ok(host) = loader.load_host(host_name) {
84            for (ri, role_name) in host.roles.iter().enumerate() {
85                let is_last_role = ri == host.roles.len() - 1;
86                let branch = if is_last_host { "    " } else { "│   " };
87                let role_prefix = if is_last_role { "└── " } else { "├── " };
88                out.push_str(&format!("{branch}{role_prefix}{role_name}\n"));
89
90                if let Ok(role) = loader.load_role(role_name) {
91                    for (pi, pkg_name) in role.packages.iter().enumerate() {
92                        let is_last_pkg = pi == role.packages.len() - 1;
93                        let inner_branch = if is_last_role { "    " } else { "│   " };
94                        let pkg_prefix = if is_last_pkg { "└── " } else { "├── " };
95                        out.push_str(&format!("{branch}{inner_branch}{pkg_prefix}{pkg_name}\n"));
96                    }
97                }
98            }
99        }
100    }
101    Ok(out)
102}