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}