use comfy_table::{ContentArrangement, Table};
use nodeset::NodeSet;
use crate::openapi_client::types::Group;
pub fn print_table(group_vec: &[Group]) {
let mut table = Table::new();
table.set_content_arrangement(ContentArrangement::Dynamic);
table.set_header(vec![
"Group Name",
"Description",
"# members",
"Members",
"Tags",
]);
for group in group_vec {
let mut group_members = group
.members
.as_ref()
.and_then(|m| m.ids.clone())
.unwrap_or_default();
group_members.sort();
let node_group: NodeSet =
group_members.join(", ").parse().unwrap_or_default();
table.add_row(vec![
group.label.clone(),
group.description.clone().unwrap_or_default(),
group_members.len().to_string(),
node_group.to_string(),
group.tags.clone().unwrap_or_default().join("\n"),
]);
}
table.column_mut(3).map(|c| c.set_delimiter(','));
println!("{table}");
}
#[cfg(test)]
mod tests {
use super::*;
use serde_json::json;
fn from_json(value: serde_json::Value) -> Group {
serde_json::from_value(value).unwrap()
}
#[test]
fn print_empty_list_does_not_panic() {
print_table(&[]);
}
#[test]
fn print_group_with_no_members_does_not_panic() {
let g = from_json(json!({
"label": "empty",
"description": "no members",
}));
print_table(&[g]);
}
#[test]
fn print_group_with_xname_members_renders_via_nodeset() {
let g = from_json(json!({
"label": "compute",
"description": "compute nodes",
"members": {
"ids": ["x3000c0s1b0n0", "x3000c0s1b0n1", "x3000c0s1b0n2"]
},
}));
print_table(&[g]);
}
#[test]
fn print_group_with_unparseable_members_falls_back_to_default() {
let g = from_json(json!({
"label": "oddballs",
"members": { "ids": ["foo", "bar", "baz"] },
}));
print_table(&[g]);
}
#[test]
fn print_group_with_tags_renders_them_newline_separated() {
let g = from_json(json!({
"label": "gpu",
"tags": ["a100", "epyc", "ib-2x"],
"members": { "ids": ["x3000c0s1b0n0"] },
}));
print_table(&[g]);
}
}