#[macro_export]
macro_rules! form {
(
$(#[$meta:meta])*
$vis:vis struct $name:ident {
$(
$(#[$fmeta:meta])*
$fvis:vis $field:ident : $ty:ty $(= $wire:literal)?
),* $(,)?
}
$( ignore = [ $($ignored:literal),* $(,)? ]; )?
) => {
$(#[$meta])*
$vis struct $name {
$(
$(#[$fmeta])*
$fvis $field: $ty,
)*
}
const _: () = {
#[doc(hidden)]
#[derive(Default)]
$vis struct __FormNetBuilder {
$( $field: <$ty as $crate::FromField>::Slot, )*
}
impl $crate::FormBuilder for __FormNetBuilder {
type Output = $name;
fn text(&mut self, name: &str, value: &str) -> ::core::result::Result<(), $crate::FormError> {
$(
if name == $crate::__form_wire!($field $(, $wire)?) {
return <$ty as $crate::FromField>::accept_text(&mut self.$field, value)
.map_err(|e| $crate::__value_error(e, ::core::stringify!($field)));
}
)*
$( $( if name == $ignored { return ::core::result::Result::Ok(()); } )* )?
::core::result::Result::Err($crate::__unknown())
}
fn file(&mut self, name: &str, file: $crate::FileValue<'_>) -> ::core::result::Result<(), $crate::FormError> {
$(
if name == $crate::__form_wire!($field $(, $wire)?) {
return <$ty as $crate::FromField>::accept_file(&mut self.$field, file)
.map_err(|e| $crate::__value_error(e, ::core::stringify!($field)));
}
)*
$( $( if name == $ignored { return ::core::result::Result::Ok(()); } )* )?
let _ = file;
::core::result::Result::Err($crate::__unknown())
}
fn finish(self) -> ::core::result::Result<$name, $crate::FormError> {
::core::result::Result::Ok($name {
$(
$field: <$ty as $crate::FromField>::finish(self.$field)
.map_err(|e| $crate::__value_error(e, ::core::stringify!($field)))?,
)*
})
}
fn file_field(&self, name: &str) -> ::core::option::Option<bool> {
$( if name == $crate::__form_wire!($field $(, $wire)?) { return ::core::option::Option::Some(true); } )*
$( $( if name == $ignored { return ::core::option::Option::Some(false); } )* )?
::core::option::Option::None
}
fn finish_all(
self,
__form_net_errors: &mut $crate::__Vec<$crate::FormError>,
) -> ::core::option::Option<$name> {
let __form_net_before = __form_net_errors.len();
$(
let $field = match <$ty as $crate::FromField>::finish(self.$field) {
::core::result::Result::Ok(v) => ::core::option::Option::Some(v),
::core::result::Result::Err(e) => {
$crate::__push_field_error(__form_net_errors, e, ::core::stringify!($field));
::core::option::Option::None
}
};
)*
if __form_net_errors.len() > __form_net_before {
return ::core::option::Option::None;
}
::core::option::Option::Some($name { $( $field: $field?, )* })
}
}
impl $crate::FromForm for $name {
type Builder = __FormNetBuilder;
}
};
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! __form_wire {
($field:ident) => {
::core::stringify!($field)
};
($field:ident, $wire:literal) => {
$wire
};
}