#[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)]
pub 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)))?,
)*
})
}
}
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
};
}