#[macro_export]
macro_rules! extract_bindings {
(
$self:ident,
$bindings:ident,
{
{
{
if
($($predicate:tt)*)
{ $($e:tt)* }
$($rest:tt)*
}
[$($expanded:tt)*]
}
}
) => {
extract_bindings! {$self, $bindings, {
{
{
$($rest)*
$($e)*
}
[$($expanded)*
]
}
}}
};
(
$self:ident,
$bindings:ident,
{
{
{
for
$($predicate:ident),+ in ($($iter:tt)*)
{ $($e:tt)* }
$($rest:tt)*
}
[$($expanded:tt)*]
}
}
) => {
extract_bindings! {$self, $bindings, {
{
{
$($rest)*
$($e)*
}
[$($expanded)*
]
}
}}
};
(
$self:ident,
$bindings:ident,
{
{
{
$tag:ident $(#$id_name:ident)? $(.$class_name:ident)*
$([$($attr_name:ident : {$($attr_value:tt)*} ),*])?
$($(@$ev:ident : {$($evcode:tt)*} ),+ )?
$(={ $($binding:tt)* })?
{ $($e:tt)* }
$($rest:tt)*
}
[$($expanded:tt)*]
}
}
) => {
extract_bindings! {$self, $bindings, {
{
{
$($rest)*
$($e)*
}
[$($expanded)*
$(
{
replace_self!($self, $($binding)*)
}
)?
]
}
}}
};
(
$self:ident,
$bindings:ident,
{
{
{
@{$($comp:tt)+}
$($rest:tt)*
}
[$($expanded:tt)*]
}
}
) => {
extract_bindings! {$self, $bindings, {
{
{
$($rest)*
}
[$($expanded)*]
}
}}
};
(
$self:ident,
$bindings:ident,
{
{
{
{ $($code:tt)* }
$($rest:tt)*
}
[$($expanded:tt)*]
}
}
) => {
extract_bindings! {$self, $bindings, {
{
{
$($rest)*
}
[$($expanded)*]
}
}}
};
() => {
vec![]
};
(
$self:ident,
$bindings:ident,
{
{
{}
[$({ $($binding:tt)* })*]
}
}
) => {
let mut bindings = $bindings.blocking_write().clone();
bindings.reverse();
$(
use comet::prelude::wasm_bindgen::JsCast;
let elem = bindings.pop().unwrap();
let input_elem: comet::prelude::web_sys::HtmlInputElement = elem.dyn_into().unwrap();
$($binding)* = input_elem.value();
)*
};
(
$self:ident,
$bindings:ident,
$( $e:tt )*
) => {
extract_bindings! {$self, $bindings, {
{
{
$( $e )*
}
[]
}
}}
};
}