Skip to main content

alopex_cli/output/
server.rs

1//! Server management output helpers.
2
3use crate::models::{Column, DataType, Row, Value};
4
5pub fn status_columns() -> Vec<Column> {
6    vec![
7        Column::new("Version", DataType::Text),
8        Column::new("Uptime (s)", DataType::Text),
9        Column::new("Connections", DataType::Text),
10        Column::new("QPS", DataType::Text),
11    ]
12}
13
14pub fn status_row(
15    version: Option<&str>,
16    uptime_secs: Option<u64>,
17    connections: Option<u64>,
18    qps: Option<f64>,
19) -> Row {
20    Row::new(vec![
21        Value::Text(opt_text(version)),
22        Value::Text(opt_u64(uptime_secs)),
23        Value::Text(opt_u64(connections)),
24        Value::Text(opt_f64(qps)),
25    ])
26}
27
28pub fn metrics_columns() -> Vec<Column> {
29    vec![
30        Column::new("QPS", DataType::Text),
31        Column::new("Avg Latency (ms)", DataType::Text),
32        Column::new("P99 Latency (ms)", DataType::Text),
33        Column::new("Memory (MB)", DataType::Text),
34        Column::new("Active Connections", DataType::Text),
35    ]
36}
37
38pub fn metrics_row(
39    qps: Option<f64>,
40    avg_latency_ms: Option<f64>,
41    p99_latency_ms: Option<f64>,
42    memory_usage_mb: Option<u64>,
43    active_connections: Option<u64>,
44) -> Row {
45    Row::new(vec![
46        Value::Text(opt_f64(qps)),
47        Value::Text(opt_f64(avg_latency_ms)),
48        Value::Text(opt_f64(p99_latency_ms)),
49        Value::Text(opt_u64(memory_usage_mb)),
50        Value::Text(opt_u64(active_connections)),
51    ])
52}
53
54pub fn health_columns() -> Vec<Column> {
55    vec![
56        Column::new("Status", DataType::Text),
57        Column::new("Message", DataType::Text),
58    ]
59}
60
61pub fn health_row(status: Option<&str>, message: Option<&str>) -> Row {
62    Row::new(vec![
63        Value::Text(opt_text(status)),
64        Value::Text(opt_text(message)),
65    ])
66}
67
68pub fn compaction_columns() -> Vec<Column> {
69    vec![
70        Column::new("Status", DataType::Text),
71        Column::new("Message", DataType::Text),
72    ]
73}
74
75pub fn compaction_row(success: Option<bool>, message: Option<&str>) -> Row {
76    let result = match success {
77        Some(true) => "OK",
78        Some(false) => "Failed",
79        None => "N/A",
80    };
81    Row::new(vec![
82        Value::Text(result.to_string()),
83        Value::Text(opt_text(message)),
84    ])
85}
86
87fn opt_text(value: Option<&str>) -> String {
88    value.unwrap_or("N/A").to_string()
89}
90
91fn opt_u64(value: Option<u64>) -> String {
92    value
93        .map(|value| value.to_string())
94        .unwrap_or_else(|| "N/A".to_string())
95}
96
97fn opt_f64(value: Option<f64>) -> String {
98    value
99        .map(|value| format!("{:.2}", value))
100        .unwrap_or_else(|| "N/A".to_string())
101}