diff --git a/src/tools/disks/zpool_status.rs b/src/tools/disks/zpool_status.rs index 54d67eeb..4351ca60 100644 --- a/src/tools/disks/zpool_status.rs +++ b/src/tools/disks/zpool_status.rs @@ -179,25 +179,9 @@ fn parse_zpool_status(input: &str) -> Result, Error> { } pub fn vdev_list_to_tree(vdev_list: &[ZFSPoolVDevState]) -> Result { - indented_list_to_tree(vdev_list, |vdev, node| { - node.insert("name".to_string(), Value::String(vdev.name.clone())); - node.insert("lvl".to_string(), Value::Number(vdev.lvl.into())); - if let Some(ref state) = vdev.state { - node.insert("state".to_string(), Value::String(state.clone())); - } - if let Some(ref msg) = vdev.msg { - node.insert("msg".to_string(), Value::String(msg.clone())); - } - if let Some(read) = vdev.read { - node.insert("read".to_string(), Value::Number(read.into())); - } - if let Some(write) = vdev.write { - node.insert("write".to_string(), Value::Number(write.into())); - } - if let Some(cksum) = vdev.cksum { - node.insert("cksum".to_string(), Value::Number(cksum.into())); - } - vdev.lvl + indented_list_to_tree(vdev_list, |vdev| { + let node = serde_json::to_value(vdev).unwrap(); + (node, vdev.lvl) }) } @@ -205,7 +189,7 @@ fn indented_list_to_tree<'a, T, F, I>(items: I, to_node: F) -> Result, - F: Fn(&T, &mut serde_json::Map) -> u64, + F: Fn(&T) -> (Value, u64), { use serde_json::Map; use std::mem::replace; @@ -219,8 +203,13 @@ where cur_node.insert("name".to_string(), Value::String("root".to_string())); for item in items { - let mut node = Map::new(); - let vdev_level = 1 + to_node(&item, &mut node); + let (node, node_level) = to_node(&item); + let vdev_level = 1 + node_level; + let mut node = match node { + Value::Object(map) => map, + _ => bail!("to_node returned wrong type"), + }; + node.insert("leaf".to_string(), Value::Bool(true)); // if required, go back up (possibly multiple levels):