#![warn(missing_docs)]
pub use declarative::{block, view};
#[macro_export]
macro_rules! construct {
(? $type:ty) => { <$type>::default() };
(? ~$struct_literal:expr) => { $struct_literal };
(? $struct_literal:expr) => { $struct_literal.start() };
(~$builder:expr) => { $builder };
( $builder:expr) => { $builder.build() };
(~$type:ty => $($methods:tt)*) => { <$type>::builder() $($methods)* };
( $type:ty => $($methods:tt)*) => { <$type>::builder() $($methods)*.build() };
}
#[macro_export]
macro_rules! clone {
[if [$($_:tt)+] { $($foo:tt)* } else { $($bar:tt)* }] => { $($foo)* };
[if [ ] { $($foo:tt)* } else { $($bar:tt)* }] => { $($bar)* };
($last:expr => $($tt:tt)*) => {{ $($tt)* $last }};
( => $($tt:tt)*) => { $($tt)* };
[.$field:ident] => { $field };
[.$field:ident $(.$rest:ident)+] => { $crate::clone![$(.$rest)+] };
[$($let:ident $(.$field:ident)* $(as $name:ident)? $(= $expr:expr)?),+ $(,)? $(; $last:expr)?] => {
$crate::clone!($($last)? => $($crate::clone! {
if [$($field)* $($name)?] {
$crate::clone![if [$($expr)?] {
compile_error!("cannot use fields or `as` while custom cloning");
} else {
let $crate::clone! {
if [$($name)?] { $($name)? } else { $crate::clone![$(.$field)*] }
} = $let $(.$field)* .clone();
}]
} else {
let $let = $crate::clone! {
if [$($expr)?] { $($expr)? } else { $let.clone() }
};
}
})+)
};
}