better structure
This commit is contained in:
+106
-18
@@ -1,31 +1,119 @@
|
||||
#[macro_export]
|
||||
macro_rules! __oml {
|
||||
($( ($tag:ident $($k:ident = $v:expr)*) {$($inner:tt)*} )+) => {{
|
||||
let mut comps: Vec<Box<dyn Component>> = Vec::new();
|
||||
$(
|
||||
// comps.push(Box::new($tag(ComponentParams { children: osui::__oml!($($inner)*) })));
|
||||
comps.push(oml!(($tag $($k = $v)*) {$($inner)*}));
|
||||
)*
|
||||
() => { Vec::new() };
|
||||
|
||||
// Props, With components (PC)
|
||||
($tag:ident ($($k:ident = $v:expr),*) {$($inner:tt)*}) => {{
|
||||
vec![oml!($tag ($($k = $v),*) {$($inner)*})]
|
||||
}};
|
||||
|
||||
($tag:ident ($($k:ident = $v:expr),*) {$($inner:tt)*} $($rest:tt)+) => {{
|
||||
let mut comps: Vec<Box<dyn osui::Component>> = osui::__oml!($($rest)+);
|
||||
comps.insert(0, oml!($tag ($($k = $v),*) {$($inner)*}));
|
||||
comps
|
||||
}};
|
||||
|
||||
// Components (C)
|
||||
($tag:ident {$($inner:tt)*}) => {{
|
||||
vec![oml!($tag {$($inner)*})]
|
||||
}};
|
||||
|
||||
($tag:ident {$($inner:tt)*} $($rest:tt)+) => {{
|
||||
let mut comps: Vec<Box<dyn osui::Component>> = osui::__oml!($($rest)+);
|
||||
comps.insert(0, oml!($tag {$($inner)*}));
|
||||
comps
|
||||
}};
|
||||
|
||||
// Expression, With components (EC)
|
||||
($tag:ident ($expr:expr; $($k:ident = $v:expr),*) {$($inner:tt)*}) => {{
|
||||
vec![oml!($tag ($expr; $($k = $v),*) {$($inner)*})]
|
||||
}};
|
||||
|
||||
($tag:ident ($expr:expr; $($k:ident = $v:expr),*) {$($inner:tt)*} $($rest:tt)+) => {{
|
||||
let mut comps: Vec<Box<dyn osui::Component>> = osui::__oml!($($rest)+);
|
||||
comps.insert(0, oml!($tag ($expr; $($k = $v),*) {$($inner)*}));
|
||||
comps
|
||||
}};
|
||||
|
||||
// Expression (E)
|
||||
($tag:ident ($expr:expr; $($k:ident = $v:expr),*)) => {{
|
||||
vec![oml!($tag ($expr; $($k = $v),*))]
|
||||
}};
|
||||
|
||||
($tag:ident ($expr:expr; $($k:ident = $v:expr),*) $($rest:tt)+) => {{
|
||||
let mut comps: Vec<Box<dyn osui::Component>> = osui::__oml!($($rest)+);
|
||||
comps.insert(0, oml!($tag ($expr; $($k = $v),*)));
|
||||
comps
|
||||
}};
|
||||
|
||||
// Props (P)
|
||||
($tag:ident ($($k:ident = $v:expr),*)) => {{
|
||||
vec![oml!($tag ($($k = $v),*))]
|
||||
}};
|
||||
|
||||
($tag:ident ($($k:ident = $v:expr),*) $($rest:tt)+) => {{
|
||||
let mut comps: Vec<Box<dyn osui::Component>> = osui::__oml!($($rest)+);
|
||||
comps.insert(0, oml!($tag ($($k = $v),*)));
|
||||
comps
|
||||
}};
|
||||
|
||||
// Pre-Defined (D)
|
||||
($expr:expr;) => {{
|
||||
vec![oml!($expr;)]
|
||||
}};
|
||||
|
||||
($expr:expr; $($rest:tt)+) => {{
|
||||
let mut comps: Vec<Box<dyn osui::Component>> = osui::__oml!($($rest)+);
|
||||
comps.insert(0, oml!($expr));
|
||||
comps
|
||||
}};
|
||||
() => { Vec::new() };
|
||||
}
|
||||
|
||||
#[macro_export]
|
||||
macro_rules! oml {
|
||||
( ($tag:ident) {} ) => {
|
||||
Box::new($tag(ComponentParams { children: Vec::new() }))
|
||||
};
|
||||
|
||||
( ($tag:ident) {$($inner:tt)*} ) => {
|
||||
Box::new($tag(ComponentParams { children: osui::__oml!($($inner)*) }))
|
||||
};
|
||||
|
||||
( ($tag:ident $($k:ident = $v:expr)+ ) {$($inner:tt)*} ) => {{
|
||||
let mut c = $tag(ComponentParams { children: osui::__oml!($($inner)*) });
|
||||
// Props (P)
|
||||
($tag:ident ($($k:ident = $v:expr),*)) => {{
|
||||
let mut c = $tag(osui::ComponentParams { children: Vec::new(), expr: String::new() });
|
||||
$(
|
||||
c.$k = $v;
|
||||
)+
|
||||
)*
|
||||
Box::new(c)
|
||||
}};
|
||||
|
||||
// Expression, With components (EC)
|
||||
( $tag:ident ($expr:expr; $($k:ident = $v:expr),* ) {$($inner:tt)*} ) => {{
|
||||
let mut c = $tag(osui::ComponentParams { children: osui::__oml!($($inner)*), expr: String::from($expr) });
|
||||
$(
|
||||
c.$k = $v;
|
||||
)*
|
||||
Box::new(c)
|
||||
}};
|
||||
|
||||
// Expression (E)
|
||||
( $tag:ident ($expr:expr; $($k:ident = $v:expr),*) ) => {{
|
||||
let mut c = $tag(osui::ComponentParams { children: Vec::new(), expr: String::from($expr) });
|
||||
$(
|
||||
c.$k = $v;
|
||||
)*
|
||||
Box::new(c)
|
||||
}};
|
||||
|
||||
// Components (C)
|
||||
( $tag:ident {$($inner:tt)*} ) => {
|
||||
Box::new($tag(osui::ComponentParams { children: osui::__oml!($($inner)*), expr: String::new() }))
|
||||
};
|
||||
|
||||
// Props, With components (PC)
|
||||
( $tag:ident ($($k:ident = $v:expr),*) {$($inner:tt)*} ) => {{
|
||||
let mut c = $tag(osui::ComponentParams { children: osui::__oml!($($inner)*), expr: String::new() });
|
||||
$(
|
||||
c.$k = $v;
|
||||
)*
|
||||
Box::new(c)
|
||||
}};
|
||||
|
||||
// Pre-Defined (D)
|
||||
($expr:expr;) => {{
|
||||
$expr
|
||||
}};
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user