Expand description

merge-struct is a simple library for deep merging two serializable structs.

Examples

Deserialize two structs and merge them

use std::collections::BTreeMap;
use serde_json;
use serde::{Deserialize, Serialize};
use merge_struct::merge;

#[derive(Serialize, Deserialize)]
struct Data {
  is_root: Option<bool>,
  folders: Vec<Folder>,
  entries: Option<BTreeMap<String, Entry>>, // btree so test results will be ordered and stable between runs
}
#[derive(Serialize, Deserialize)]
struct Folder {
    name: String,
    num_files: Option<u32>,
}
#[derive(Serialize, Deserialize)]
struct Entry {
    name: String,
    size: u32,
}

let left: Data = serde_json::from_str(
    r###"
{
    "is_root": false,
    "entries": {
        "/var/log/f2": {
            "name":"f2",
            "size": 5
        }
    },
    "folders": [
        {
            "name": "/var/log",
            "num_files": 20
        }
    ]
}
"###,
)
.unwrap();
let right: Data = serde_json::from_str(
    r###"
{
    "folders":[],
    "entries": {
        "/var/log/f1": {
            "name":"f1",
            "size": 12
        }
    }
}
"###,
)
.unwrap();
let res = merge(&left, &right);

Functions

deep merge two structs that are serializable. based on turning them into json::Value and merging that.