weaveconfig 0.1.2

A unified configuration tool for monorepos
Documentation
use anyhow::Error;
use serde_json::{Map, Value};

pub fn merge_values_consume(v1: &mut Value, v2: Value) -> Result<(), Error> {
    match (v1, v2) {
        (Value::Object(ref mut o1), Value::Object(o2)) => {
            merge_map_consume(o1, o2)?;
            Ok(())
        }
        (v1, v2) => {
            if v1 != &v2 {
                return Err(anyhow::anyhow!("Conflicting values: {:?} and {:?}", v1, v2));
            }
            Ok(())
        }
    }
}

pub fn merge_map_consume(m1: &mut Map<String, Value>, m2: Map<String, Value>) -> Result<(), Error> {
    for (k, v) in m2 {
        if let Some(existing_value) = m1.get_mut(&k) {
            merge_values_consume(existing_value, v)?;
        } else {
            m1.insert(k, v);
        }
    }
    Ok(())
}