use crate::{
tests::util::{cbor_to_diag, diag_to_cbor, log_try_init},
CborPath,
};
use cbor_data::{Cbor, CborBuilder, ItemKind, Writer, CborOwned};
use std::borrow::Cow;
fn clear(cbor_path: &CborPath, cbor: &Cbor) -> (Option<CborOwned>, usize) {
let mut num_cleared_values = 0;
let new_value = cbor_path.write(cbor, |old_value| {
let new_value = match old_value.kind() {
ItemKind::Pos(_) | ItemKind::Neg(_) => {
num_cleared_values += 1;
CborBuilder::new().write_pos(0, None)
}
ItemKind::Float(_) => {
num_cleared_values += 1;
CborBuilder::new().write_lit(cbor_data::Literal::L2(0), None)
}
ItemKind::Str(_)
| ItemKind::Bytes(_)
| ItemKind::Bool(_)
| ItemKind::Null
| ItemKind::Undefined
| ItemKind::Simple(_) => CborBuilder::new().write_item(old_value),
ItemKind::Array(_) => {
num_cleared_values += 1;
CborBuilder::new().write_array(None, |_| ())
}
ItemKind::Dict(_) => {
num_cleared_values += 1;
CborBuilder::new().write_dict(None, |_| ())
}
};
log::trace!("old_value:{old_value}, new_value:{new_value}");
Ok(Some(Cow::Owned(new_value)))
}).unwrap();
(new_value, num_cleared_values)
}
#[test]
fn clear_values() {
log_try_init();
let cbor = diag_to_cbor(
r#"{"obj":{"a":1, "b":2}, "arr":[1,2,3], "str": "foo", "bool": true, "int": 42, "float": 3.14}"#,
);
let cbor_path = CborPath::builder().wildcard().build();
let (new_value, num_cleared_values) = clear(&cbor_path, &cbor);
let new_value = new_value.unwrap();
log::trace!("new_value:{new_value:?}");
log::trace!("new_value:{}", cbor_to_diag(&new_value));
assert_eq!(
r#"{"obj":{},"arr":[],"str":"foo","bool":true,"int":0,"float":0.0_1}"#,
cbor_to_diag(&new_value)
);
assert_eq!(4, num_cleared_values);
}