mod default_val;
#[cfg(feature = "openapi")]
mod json_schema;
pub use default_val::ZDefault;
use serde_json::Value;
use crate::error::VldError;
use crate::schema::VldSchema;
macro_rules! option_wrapper {
($(#[$doc:meta])* $name:ident $(, missing = $missing:expr)?) => {
$(#[$doc])*
pub struct $name<T: VldSchema> {
inner: T,
}
impl<T: VldSchema> $name<T> {
pub fn new(inner: T) -> Self {
Self { inner }
}
pub fn inner_schema(&self) -> &T {
&self.inner
}
}
impl<T: VldSchema> VldSchema for $name<T> {
type Output = Option<T::Output>;
fn parse_value(&self, value: &Value) -> Result<Option<T::Output>, VldError> {
if value.is_null() {
return Ok(None);
}
self.inner.parse_value(value).map(Some)
}
fn output_json(&self, o: &Self::Output) -> Option<Value> {
match o {
Some(v) => self.inner.output_json(v),
None => Some(Value::Null),
}
}
$(
fn parse_missing(&self) -> Result<Option<T::Output>, VldError> {
$missing
}
)?
}
};
}
option_wrapper! {
ZOptional
}
option_wrapper! {
ZNullable, missing = Err(VldError::from_code(crate::error::IssueCode::MissingField))
}
option_wrapper! {
ZNullish
}