graphql_schema_diff/
lib.rs

1#![doc = include_str!("../README.md")]
2#![allow(unused_crate_dependencies)]
3#![deny(missing_docs)]
4
5mod change;
6mod state;
7mod traverse_schemas;
8
9pub use change::{Change, ChangeKind};
10
11use self::state::*;
12use cynic_parser::type_system as ast;
13use std::collections::HashMap;
14
15/// Diff two GraphQL schemas.
16pub fn diff(source: &str, target: &str) -> Result<Vec<Change>, cynic_parser::Error> {
17    let [source, target] = [source, target].map(|sdl| -> Result<_, cynic_parser::Error> {
18        if sdl.trim().is_empty() {
19            Ok(None)
20        } else {
21            Ok(Some(cynic_parser::parse_type_system_document(sdl)?))
22        }
23    });
24    let [source, target] = [source?, target?];
25
26    let mut state = DiffState::default();
27
28    traverse_schemas::traverse_schemas([source.as_ref(), target.as_ref()], &mut state);
29
30    Ok(state.into_changes())
31}