use pointer::RefResolver;
use serde_json::Value;
use subschema::{SchemaKeyword, Subschema};
use thiserror::Error;
mod applicator;
mod assertion;
mod pointer;
mod subschema;
mod utils;
#[derive(Debug, Error)]
pub enum SchemaError<'a> {
#[error("Unkown instance type <{0}>.")]
UnkownInstanceType(&'a str),
#[error("Expected {expected}, but received <{value}>.")]
UnexpectedValue { expected: &'a str, value: &'a Value },
#[error("Unknown keyword <{0}>.")]
UnkownKeyword(&'a str),
#[error(transparent)]
RegexError(#[from] regex::Error),
#[error("Failed to resolve pointer <{0}>")]
UnresolvableRef(&'a str),
}
#[derive(Debug, Error)]
#[error("Node {instance} failed to validate against subschema {subschema:?}")]
pub struct ValidationError<'i, 's> {
instance: &'i Value,
subschema: &'s Subschema<'s>,
}
pub struct Schema<'a> {
root_subschema: Subschema<'a>,
}
impl<'a> Schema<'a> {
pub fn from_json(input: &'a Value) -> Result<Self, SchemaError<'a>> {
let ref_resolver = RefResolver::new(input);
let root_subschema = Subschema::from_json(input, &ref_resolver)?;
Ok(Schema { root_subschema })
}
pub fn validate<'i>(&'a self, instance: &'i Value) -> Result<(), ValidationError<'i, 'a>> {
self.root_subschema.validate(instance)
}
}