macro_rules! stacked_get {
($value:tt [$inx0:expr] $([$inx1:expr])*) => { ... };
}Expand description
Applies get and stack_err_with(...)? in a chain, this is compatible with
many things.
The target can be any expression if it is parenthesized, e.x.
stacked_get!((self.value)["x"]).
use serde_json::Value;
use stacked_errors::{ensure, stacked_get, 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 value: Value = serde_json::from_str(s).stack()?;
// the normal `Index`ing of `Values` panics, this
// returns a formatted error
ensure!(stacked_get!(value["Id"]) == "id example");
ensure!(stacked_get!(value["Created"]) == 2023);
ensure!(stacked_get!(value["Args"][1]) == "--uuid");
ensure!(stacked_get!(value["State"]["Status"]) == "running");
ensure!(stacked_get!(value["State"]["Running"]) == true);
struct Holder {
value: Value,
}
let holder = Holder { value };
ensure!(stacked_get!((holder.value)["State"]["Status"]) == "running");
Ok(())
}
ex0(s).unwrap();
fn ex1(s: &str) -> Result<()> {
let value: Value = serde_json::from_str(s).stack()?;
let _ = stacked_get!(value["State"]["nonexistent"]);
Ok(())
}
assert!(ex1(s).is_err());