#[macro_export]
macro_rules! impl_validate_fields {
(
$name:ident {
$( $field_name:ident : $field_type:ty $(as $rename:literal)? => $schema:expr ),* $(,)?
}
) => {
$crate::impl_validate_fields!(@keyed $name {
$(
$field_name : $field_type => [
$crate::__vld_resolve_key!(
$crate::__private::field_key(stringify!($field_name)) $(, $rename)?
)
] $schema
),*
});
};
(
@keyed $name:ident {
$( $field_name:ident : $field_type:ty => [$key:expr] $schema:expr ),* $(,)?
}
) => {
impl $name {
pub fn validate_fields<__VldInputT: $crate::schema::VldInput + ?Sized>(
input: &__VldInputT,
) -> ::std::result::Result<
::std::vec::Vec<$crate::object::FieldResult>,
$crate::error::VldError,
> {
let __vld_json = <__VldInputT as $crate::schema::VldInput>::to_json_value(input)?;
Self::validate_fields_value(&__vld_json)
}
pub fn validate_fields_value(
__vld_json: &$crate::serde_json::Value,
) -> ::std::result::Result<
::std::vec::Vec<$crate::object::FieldResult>,
$crate::error::VldError,
> {
#[allow(unused_imports)]
use $crate::schema::VldSchema as _;
let __vld_obj = $crate::__private::expect_object(__vld_json)?;
::std::result::Result::Ok(::std::vec![
$(
$crate::__private::field_result(
__vld_obj,
$key,
$crate::__vld_cached!($schema),
)
),*
])
}
pub fn parse_lenient<__VldInputT: $crate::schema::VldInput + ?Sized>(
input: &__VldInputT,
) -> ::std::result::Result<
$crate::object::ParseResult<$name>,
$crate::error::VldError,
> {
let __vld_json = <__VldInputT as $crate::schema::VldInput>::to_json_value(input)?;
Self::parse_lenient_value(&__vld_json)
}
pub fn parse_lenient_value(
__vld_json: &$crate::serde_json::Value,
) -> ::std::result::Result<
$crate::object::ParseResult<$name>,
$crate::error::VldError,
> {
#[allow(unused_imports)]
use $crate::schema::VldSchema as _;
let __vld_obj = $crate::__private::expect_object(__vld_json)?;
let mut __vld_results: ::std::vec::Vec<$crate::object::FieldResult> =
::std::vec::Vec::new();
$(
#[allow(non_snake_case)]
let $field_name: $field_type = $crate::__private::lenient_field(
__vld_obj,
$key,
$crate::__vld_cached!($schema),
&mut __vld_results,
);
)*
::std::result::Result::Ok($crate::object::ParseResult::new(
$name { $( $field_name, )* },
__vld_results,
))
}
}
};
}
#[macro_export]
macro_rules! impl_rules {
(
$name:ident {
$( $field:ident $(as $rename:literal)? => $schema:expr ),* $(,)?
}
) => {
impl $name {
pub fn validate(&self) -> ::std::result::Result<(), $crate::error::VldError> {
#[allow(unused_imports)]
use $crate::schema::VldSchema as _;
let mut __vld_errors = $crate::error::VldError::new();
#[allow(unused_mut)]
let mut __vld_failed = false;
$(
{
let __vld_key: &str = $crate::__vld_resolve_key!(
$crate::__private::field_key(stringify!($field)) $(, $rename)?
);
let __vld_result = match $crate::serde_json::to_value(&self.$field) {
::std::result::Result::Ok(ref __vld_val) => {
$crate::schema::VldSchema::parse_value($crate::__vld_cached!($schema), __vld_val)
.map(|_| ())
}
::std::result::Result::Err(e) => ::std::result::Result::Err(
$crate::error::VldError::from_code(
$crate::error::IssueCode::SerializeError {
detail: e.to_string(),
},
),
),
};
if let ::std::result::Result::Err(e) = __vld_result {
__vld_failed = true;
__vld_errors.issues.extend(
e.with_prefix($crate::error::PathSegment::Field(
::std::string::String::from(__vld_key),
))
.issues,
);
}
}
)*
if !__vld_failed {
::std::result::Result::Ok(())
} else {
::std::result::Result::Err(__vld_errors)
}
}
pub fn is_valid(&self) -> bool {
self.validate().is_ok()
}
}
};
}