2019-06-12 10:41:46 -04:00
|
|
|
#[doc(hidden)]
|
|
|
|
#[macro_export]
|
|
|
|
macro_rules! __internal_builder_method {
|
|
|
|
($this:expr,) => {
|
|
|
|
$this
|
|
|
|
};
|
|
|
|
($this:expr, .$name:ident!($($args:expr),*) $($rest:tt)*) => {
|
|
|
|
$crate::__internal_builder_method!($name!($this, $($args),*), $($rest)*)
|
|
|
|
};
|
|
|
|
($this:expr, .$name:ident($($args:expr),*) $($rest:tt)*) => {
|
|
|
|
$crate::__internal_builder_method!($this.$name($($args),*), $($rest)*)
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2019-06-15 19:59:22 -04:00
|
|
|
#[doc(hidden)]
|
2018-02-25 06:58:20 -05:00
|
|
|
#[macro_export]
|
2019-06-15 19:59:22 -04:00
|
|
|
macro_rules! __internal_builder {
|
|
|
|
($default:ty, $name:ident => $make:expr, $kind:expr => $t:ty) => {
|
|
|
|
$crate::__internal_builder!($default, $name => $make, $kind => $t, {})
|
|
|
|
};
|
|
|
|
($default:ty, $name:ident => $make:expr, $kind:expr => $t:ty, { $($methods:tt)* }) => {{
|
|
|
|
let a: $t = {
|
|
|
|
let $name = $kind;
|
|
|
|
$make
|
|
|
|
};
|
2019-06-12 10:41:46 -04:00
|
|
|
let b = $crate::DomBuilder::new(a);
|
|
|
|
let c = $crate::__internal_builder_method!(b, $($methods)*);
|
|
|
|
$crate::DomBuilder::into_dom(c)
|
2018-02-25 06:58:20 -05:00
|
|
|
}};
|
|
|
|
|
2019-06-15 19:59:22 -04:00
|
|
|
($default:ty, $name:ident => $make:expr, $kind:expr) => {
|
|
|
|
$crate::__internal_builder!($default, $name => $make, $kind => $default)
|
2018-05-24 06:22:47 -04:00
|
|
|
};
|
2019-06-15 19:59:22 -04:00
|
|
|
($default:ty, $name:ident => $make:expr, $kind:expr, { $($methods:tt)* }) => {
|
|
|
|
$crate::__internal_builder!($default, $name => $make, $kind => $default, { $($methods)* })
|
2018-05-24 06:22:47 -04:00
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#[macro_export]
|
|
|
|
macro_rules! html {
|
|
|
|
($($args:tt)+) => {
|
2019-06-15 19:59:22 -04:00
|
|
|
$crate::__internal_builder!($crate::HtmlElement, kind => $crate::create_element(kind), $($args)+)
|
2018-05-24 06:22:47 -04:00
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#[macro_export]
|
|
|
|
macro_rules! svg {
|
|
|
|
($($args:tt)+) => {
|
2019-06-15 19:59:22 -04:00
|
|
|
$crate::__internal_builder!($crate::SvgElement, kind => $crate::create_element_ns(kind, $crate::SVG_NAMESPACE), $($args)+)
|
2018-02-25 06:58:20 -05:00
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#[macro_export]
|
|
|
|
macro_rules! stylesheet {
|
|
|
|
($rule:expr) => {
|
2019-06-11 09:29:46 -04:00
|
|
|
$crate::stylesheet!($rule, {})
|
2018-02-25 06:58:20 -05:00
|
|
|
};
|
2019-06-12 10:41:46 -04:00
|
|
|
($rule:expr, { $($methods:tt)* }) => {{
|
|
|
|
let a = $crate::StylesheetBuilder::new($rule);
|
|
|
|
$crate::__internal_builder_method!(a, $($methods)*).done()
|
|
|
|
}};
|
2018-02-25 06:58:20 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
#[macro_export]
|
|
|
|
macro_rules! class {
|
2019-06-12 10:41:46 -04:00
|
|
|
($($methods:tt)*) => {{
|
|
|
|
let a = $crate::ClassBuilder::new();
|
|
|
|
$crate::__internal_builder_method!(a, $($methods)*).done()
|
|
|
|
}};
|
2018-02-25 06:58:20 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2018-03-08 08:51:14 -05:00
|
|
|
// TODO this is pretty inefficient, it iterates over the token tree one token at a time
|
|
|
|
#[doc(hidden)]
|
2018-02-25 06:58:20 -05:00
|
|
|
#[macro_export]
|
2018-03-08 08:51:14 -05:00
|
|
|
macro_rules! __internal_clone_split {
|
|
|
|
(($($x:ident)*), $t:ident => $y:expr) => {{
|
|
|
|
$(let $x = ::std::clone::Clone::clone(&$x);)*
|
|
|
|
let $t = ::std::clone::Clone::clone(&$t);
|
2018-02-25 06:58:20 -05:00
|
|
|
$y
|
|
|
|
}};
|
2018-03-08 08:51:14 -05:00
|
|
|
(($($x:ident)*), $t:ident, $($after:tt)*) => {
|
2019-06-11 09:29:46 -04:00
|
|
|
$crate::__internal_clone_split!(($($x)* $t), $($after)*)
|
2018-03-08 08:51:14 -05:00
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2019-06-11 09:29:46 -04:00
|
|
|
// TODO move into gloo ?
|
2018-03-08 08:51:14 -05:00
|
|
|
#[macro_export]
|
|
|
|
macro_rules! clone {
|
2019-06-11 09:29:46 -04:00
|
|
|
($($input:tt)*) => { $crate::__internal_clone_split!((), $($input)*) };
|
2018-02-25 06:58:20 -05:00
|
|
|
}
|