use serde_json::Value;
use crate::error::{IssueCode, VldError};
use crate::schema::DynSchema;
pub(crate) struct OptionalDynSchema(pub(crate) Box<dyn DynSchema + Send + Sync>);
impl DynSchema for OptionalDynSchema {
fn dyn_parse(&self, value: &Value) -> Result<Value, VldError> {
if value.is_null() {
return Ok(self.0.dyn_parse(value).unwrap_or(Value::Null));
}
self.0.dyn_parse(value)
}
#[cfg(feature = "openapi")]
fn dyn_json_schema(&self) -> Value {
crate::openapi::nullable_schema(self.0.dyn_json_schema())
}
#[cfg(feature = "openapi")]
fn dyn_is_required(&self) -> bool {
false
}
#[cfg(feature = "openapi")]
fn dyn_collect_nested_schemas(&self, out: &mut Vec<crate::schema::NestedSchemaEntry>) {
self.0.dyn_collect_nested_schemas(out);
}
}
pub(crate) struct RequiredDynSchema(pub(crate) Box<dyn DynSchema + Send + Sync>);
impl DynSchema for RequiredDynSchema {
fn dyn_parse(&self, value: &Value) -> Result<Value, VldError> {
if value.is_null() {
return Err(VldError::from_code(IssueCode::MissingField));
}
self.0.dyn_parse(value)
}
#[cfg(feature = "openapi")]
fn dyn_json_schema(&self) -> Value {
self.0.dyn_json_schema()
}
#[cfg(feature = "openapi")]
fn dyn_is_required(&self) -> bool {
true
}
#[cfg(feature = "openapi")]
fn dyn_collect_nested_schemas(&self, out: &mut Vec<crate::schema::NestedSchemaEntry>) {
self.0.dyn_collect_nested_schemas(out);
}
}