corvus_json_schema/
lib.rs1mod compiler;
23mod dialect;
24mod document;
25mod eval;
26mod formats;
27mod instance;
28mod loader;
29#[rustfmt::skip]
30mod metaschemas;
31mod node;
32mod numbers;
33mod options;
34mod pattern;
35mod results;
36mod uri;
37
38use std::sync::Arc;
39
40use serde_json::Value;
41
42pub use dialect::Dialect;
43pub use document::{JsonDocument, JsonDocumentArray, JsonDocumentObject, JsonDocumentValue, JsonParseError};
44pub use instance::{ArrayView, Instance, Kind, ObjectView, View};
45pub use options::{
46 CompileOptions, DocumentResolver, FormatValidator, SchemaCompilationError, SchemaEvaluationDepthError,
47};
48pub use results::{
49 Annotation, JsonSchemaResultsCollector, ResultsLevel, SchemaResult, collect_annotations, encode_pointer_segment,
50 enumerate_annotations, schema_location_fragment,
51};
52
53pub const VERSION: &str = env!("CARGO_PKG_VERSION");
55
56#[derive(Clone)]
58pub struct Validator {
59 program: Arc<eval::Program>,
60}
61
62impl std::fmt::Debug for Validator {
63 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
64 f.debug_struct("Validator").field("nodes", &self.program.nodes.len()).finish()
65 }
66}
67
68pub fn compile(schema: &Value) -> Result<Validator, SchemaCompilationError> {
71 compile_with(schema, &CompileOptions::default())
72}
73
74pub fn compile_with(schema: &Value, options: &CompileOptions) -> Result<Validator, SchemaCompilationError> {
76 let compiled = compiler::SchemaCompiler::compile(schema.clone(), options)?;
77 Ok(Validator::from_compiled(compiled, options))
78}
79
80pub fn compile_from_uri(uri: &str, options: &CompileOptions) -> Result<Validator, SchemaCompilationError> {
83 let compiled = compiler::SchemaCompiler::compile_from_uri(uri, options)?;
84 Ok(Validator::from_compiled(compiled, options))
85}
86
87impl Validator {
88 fn from_compiled(c: compiler::CompiledSchema, options: &CompileOptions) -> Validator {
89 let program = eval::Program::new(
90 c.nodes,
91 c.root,
92 c.uses_dynamic_scope,
93 options.max_depth,
94 options.formats.clone(),
95 c.documents,
96 c.annotation_sources,
97 options.assert_format.is_some(),
98 );
99 Validator { program: Arc::new(program) }
100 }
101
102 #[inline]
105 pub fn is_valid(&self, instance: &Value) -> bool {
106 eval::Evaluator::new(&self.program, None).validate(instance)
107 }
108
109 pub fn validate(&self, instance: &Value) -> Result<bool, SchemaEvaluationDepthError> {
111 let mut e = eval::Evaluator::new(&self.program, None);
112 let ok = e.validate(instance);
113 if e.depth_exceeded { Err(SchemaEvaluationDepthError) } else { Ok(ok) }
114 }
115
116 pub fn evaluate(
118 &self,
119 instance: &Value,
120 collector: &mut JsonSchemaResultsCollector,
121 ) -> Result<bool, SchemaEvaluationDepthError> {
122 self.evaluate_instance(instance, collector)
123 }
124
125 pub fn validate_instance<'a, I: Instance<'a>>(&self, instance: I) -> Result<bool, SchemaEvaluationDepthError> {
128 let mut e = eval::Evaluator::new(&self.program, None);
129 let ok = e.validate(instance);
130 if e.depth_exceeded { Err(SchemaEvaluationDepthError) } else { Ok(ok) }
131 }
132
133 pub fn evaluate_instance<'a, I: Instance<'a>>(
135 &self,
136 instance: I,
137 collector: &mut JsonSchemaResultsCollector,
138 ) -> Result<bool, SchemaEvaluationDepthError> {
139 let mut e = eval::Evaluator::new(&self.program, Some(collector));
140 let ok = e.evaluate(instance);
141 if e.depth_exceeded { Err(SchemaEvaluationDepthError) } else { Ok(ok) }
142 }
143}