1#![doc = include_str!("../README.md")]
2#![warn(missing_docs)]
3
4use schemars::schema::{RootSchema, Schema};
5use serde_json::Value;
6use thiserror::Error;
7
8mod diff_walker;
9mod types;
10
11pub use types::*;
12
13pub fn diff(lhs: Value, rhs: Value) -> Result<Vec<Change>, Error> {
17 let lhs_root: RootSchema = serde_json::from_value(lhs)?;
18 let rhs_root: RootSchema = serde_json::from_value(rhs)?;
19
20 let mut changes = vec![];
21 let mut walker = diff_walker::DiffWalker::new(
22 |change: Change| {
23 changes.push(change);
24 },
25 lhs_root,
26 rhs_root,
27 );
28 walker.diff(
29 "",
30 &mut Schema::Object(walker.lhs_root.schema.clone()),
31 &mut Schema::Object(walker.rhs_root.schema.clone()),
32 )?;
33 Ok(changes)
34}