use serde_json::Value;
use stillwater::Validation;
use crate::error::SchemaErrors;
use crate::interop::ToJsonSchema;
use crate::path::JsonPath;
pub trait SchemaLike: Send + Sync {
type Output;
fn validate(&self, value: &Value, path: &JsonPath) -> Validation<Self::Output, SchemaErrors>;
fn validate_to_value(&self, value: &Value, path: &JsonPath) -> Validation<Value, SchemaErrors>;
fn validate_with_context(
&self,
value: &Value,
path: &JsonPath,
_context: &crate::validation::ValidationContext,
) -> Validation<Self::Output, SchemaErrors> {
self.validate(value, path)
}
fn validate_to_value_with_context(
&self,
value: &Value,
path: &JsonPath,
_context: &crate::validation::ValidationContext,
) -> Validation<Value, SchemaErrors> {
self.validate_to_value(value, path)
}
fn collect_refs(&self, _refs: &mut Vec<String>) {
}
}
pub trait ValueValidator: Send + Sync {
fn validate_value(&self, value: &Value, path: &JsonPath) -> Validation<Value, SchemaErrors>;
fn validate_value_with_context(
&self,
value: &Value,
path: &JsonPath,
_context: &crate::validation::ValidationContext,
) -> Validation<Value, SchemaErrors> {
self.validate_value(value, path)
}
fn collect_refs(&self, _refs: &mut Vec<String>) {
}
fn to_json_schema(&self) -> Value;
}
impl<S: SchemaLike + ToJsonSchema> ValueValidator for S {
fn validate_value(&self, value: &Value, path: &JsonPath) -> Validation<Value, SchemaErrors> {
self.validate_to_value(value, path)
}
fn validate_value_with_context(
&self,
value: &Value,
path: &JsonPath,
context: &crate::validation::ValidationContext,
) -> Validation<Value, SchemaErrors> {
self.validate_to_value_with_context(value, path, context)
}
fn collect_refs(&self, refs: &mut Vec<String>) {
SchemaLike::collect_refs(self, refs);
}
fn to_json_schema(&self) -> Value {
ToJsonSchema::to_json_schema(self)
}
}