mod array;
mod combinators;
mod numeric;
mod object;
mod ref_schema;
mod string;
mod traits;
pub use array::ArraySchema;
pub use combinators::CombinatorSchema;
pub use numeric::IntegerSchema;
pub use object::ObjectSchema;
pub use ref_schema::RefSchema;
pub use string::StringSchema;
pub use traits::{SchemaLike, ValueValidator};
pub struct Schema;
impl Schema {
pub fn string() -> StringSchema {
StringSchema::new()
}
pub fn integer() -> IntegerSchema {
IntegerSchema::new()
}
pub fn object() -> ObjectSchema {
ObjectSchema::new()
}
pub fn array<S: SchemaLike>(item_schema: S) -> ArraySchema<S> {
ArraySchema::new(item_schema)
}
pub fn one_of<I>(schemas: I) -> CombinatorSchema
where
I: IntoIterator<Item = Box<dyn ValueValidator>>,
{
use crate::schema::combinators::ValidatorFn;
use std::sync::Arc;
let validators: Vec<Arc<dyn ValueValidator>> = schemas
.into_iter()
.map(|schema| Arc::from(schema) as Arc<dyn ValueValidator>)
.collect();
let validator_fns: Vec<ValidatorFn> = validators
.iter()
.map(|validator| {
let v = Arc::clone(validator);
Arc::new(
move |value: &serde_json::Value, path: &crate::path::JsonPath| {
v.validate_value(value, path)
},
) as ValidatorFn
})
.collect();
CombinatorSchema::OneOf {
schemas: validator_fns,
validators,
}
}
pub fn any_of<I>(schemas: I) -> CombinatorSchema
where
I: IntoIterator<Item = Box<dyn ValueValidator>>,
{
use crate::schema::combinators::ValidatorFn;
use std::sync::Arc;
let validators: Vec<Arc<dyn ValueValidator>> = schemas
.into_iter()
.map(|schema| Arc::from(schema) as Arc<dyn ValueValidator>)
.collect();
let validator_fns: Vec<ValidatorFn> = validators
.iter()
.map(|validator| {
let v = Arc::clone(validator);
Arc::new(
move |value: &serde_json::Value, path: &crate::path::JsonPath| {
v.validate_value(value, path)
},
) as ValidatorFn
})
.collect();
CombinatorSchema::AnyOf {
schemas: validator_fns,
validators,
}
}
pub fn all_of<I>(schemas: I) -> CombinatorSchema
where
I: IntoIterator<Item = Box<dyn ValueValidator>>,
{
use crate::schema::combinators::ValidatorFn;
use std::sync::Arc;
let validators: Vec<Arc<dyn ValueValidator>> = schemas
.into_iter()
.map(|schema| Arc::from(schema) as Arc<dyn ValueValidator>)
.collect();
let validator_fns: Vec<ValidatorFn> = validators
.iter()
.map(|validator| {
let v = Arc::clone(validator);
Arc::new(
move |value: &serde_json::Value, path: &crate::path::JsonPath| {
v.validate_value(value, path)
},
) as ValidatorFn
})
.collect();
CombinatorSchema::AllOf {
schemas: validator_fns,
validators,
}
}
pub fn optional(inner: Box<dyn ValueValidator>) -> CombinatorSchema {
use crate::schema::combinators::ValidatorFn;
use std::sync::Arc;
let validator = Arc::from(inner) as Arc<dyn ValueValidator>;
let validator_fn: ValidatorFn = {
let v = Arc::clone(&validator);
Arc::new(
move |value: &serde_json::Value, path: &crate::path::JsonPath| {
v.validate_value(value, path)
},
)
};
CombinatorSchema::Optional {
inner: validator_fn,
validator,
}
}
pub fn ref_(name: impl Into<String>) -> RefSchema {
RefSchema::new(name)
}
}