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}