macro_rules! stacked_get_mut {
($value:ident [$inx0:expr] $([$inx1:expr])*) => { ... };
}Expand description
Applies get_mut and stack_err_with(...)? in a chain, this is compatible
with many things.
use serde_json::Value;
use stacked_errors::{ensure, stacked_get, stacked_get_mut, Result, StackableErr};
let s = r#"{
"Id": "id example",
"Created": 2023,
"Args": [
"--entry-name",
"--uuid"
],
"State": {
"Status": "running",
"Running": true
}
}"#;
fn ex0(s: &str) -> Result<()> {
let mut value: Value = serde_json::from_str(s).stack()?;
*stacked_get_mut!(value["Id"]) = "other".into();
*stacked_get_mut!(value["Created"]) = 0.into();
*stacked_get_mut!(value["Args"][1]) = "--other".into();
*stacked_get_mut!(value["State"]["Status"]) = "stopped".into();
*stacked_get_mut!(value["State"]["Running"]) = false.into();
// when creating a new field
stacked_get_mut!(value["State"])["OtherField"] = "hello".into();
ensure!(stacked_get!(value["Id"]) == "other");
ensure!(stacked_get!(value["Created"]) == 0);
ensure!(stacked_get!(value["Args"][1]) == "--other");
ensure!(stacked_get!(value["State"]["Status"]) == "stopped");
ensure!(stacked_get!(value["State"]["Running"]) == false);
ensure!(stacked_get!(value["State"]["OtherField"]) == "hello");
Ok(())
}
ex0(s).unwrap();
fn ex1(s: &str) -> Result<()> {
let mut value: Value = serde_json::from_str(s).stack()?;
let _ = stacked_get_mut!(value["State"]["nonexistent"]);
Ok(())
}
assert!(ex1(s).is_err());