Skip to main content

ic_query/nns/node/report/text/
list.rs

1use 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}