stacked_get_mut

Macro stacked_get_mut 

Source
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());