ic_query/nns/node/report/text/
list.rs1use crate::{
2 nns::{
3 node::report::NnsNodeListReport,
4 render::{compact_text, text_or_dash},
5 },
6 table::{ColumnAlign, render_table},
7 text_value::sanitize_text,
8};
9
10const COMPACT_PRINCIPAL_CHARS: usize = 5;
11
12#[must_use]
13pub fn nns_node_list_report_text(report: &NnsNodeListReport) -> String {
14 let mut lines = Vec::new();
15 lines.push(format!(
16 "nodes: {} count {} fetched_at {}",
17 sanitize_text(&report.network),
18 report.node_count,
19 sanitize_text(&report.fetched_at)
20 ));
21 if report.nodes.is_empty() {
22 lines.push("nodes: none".to_string());
23 return lines.join("\n");
24 }
25 let headers = ["NODE", "OPERATOR", "PROVIDER", "SUBNET", "KIND", "DC"];
26 let rows = report
27 .nodes
28 .iter()
29 .map(|node| {
30 [
31 compact_text(&node.node_principal, COMPACT_PRINCIPAL_CHARS),
32 compact_text(&node.node_operator_principal, COMPACT_PRINCIPAL_CHARS),
33 compact_text(&node.node_provider_principal, COMPACT_PRINCIPAL_CHARS),
34 compact_text(&node.subnet_principal, COMPACT_PRINCIPAL_CHARS),
35 node.subnet_kind.clone(),
36 text_or_dash(Some(&node.data_center_id)),
37 ]
38 })
39 .collect::<Vec<_>>();
40 let alignments = [
41 ColumnAlign::Left,
42 ColumnAlign::Left,
43 ColumnAlign::Left,
44 ColumnAlign::Left,
45 ColumnAlign::Left,
46 ColumnAlign::Left,
47 ];
48 lines.push(render_table(&headers, &rows, &alignments));
49 lines.join("\n")
50}
51
52#[must_use]
53pub fn nns_node_list_report_verbose_text(report: &NnsNodeListReport) -> String {
54 let mut lines = Vec::new();
55 lines.push(format!(
56 "source_endpoint: {}",
57 sanitize_text(&report.source_endpoint)
58 ));
59 lines.push(format!("fetched_by: {}", sanitize_text(&report.fetched_by)));
60 if report.nodes.is_empty() {
61 lines.push("nodes: none".to_string());
62 return lines.join("\n");
63 }
64 let headers = [
65 "NODE",
66 "OPERATOR",
67 "PROVIDER",
68 "SUBNET",
69 "KIND",
70 "DC",
71 "REGISTRY_VERSION",
72 "FETCHED_AT",
73 ];
74 let rows = report
75 .nodes
76 .iter()
77 .map(|node| {
78 [
79 node.node_principal.clone(),
80 node.node_operator_principal.clone(),
81 node.node_provider_principal.clone(),
82 node.subnet_principal.clone(),
83 node.subnet_kind.clone(),
84 text_or_dash(Some(&node.data_center_id)),
85 report.registry_version.to_string(),
86 report.fetched_at.clone(),
87 ]
88 })
89 .collect::<Vec<_>>();
90 let alignments = [
91 ColumnAlign::Left,
92 ColumnAlign::Left,
93 ColumnAlign::Left,
94 ColumnAlign::Left,
95 ColumnAlign::Left,
96 ColumnAlign::Left,
97 ColumnAlign::Right,
98 ColumnAlign::Left,
99 ];
100 lines.push(render_table(&headers, &rows, &alignments));
101 lines.join("\n")
102}