json_schema_diff/
lib.rs

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
13/// Take two JSON schemas, and compare them.
14///
15/// `lhs` (left-hand side) is the old schema, `rhs` (right-hand side) is the new schema.
16pub 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}