You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
56 lines
1.1 KiB
Rust
56 lines
1.1 KiB
Rust
use crate::util::use_absolute;
|
|
use proc_macro::TokenStream;
|
|
use quote::quote;
|
|
use syn::{parse_macro_input, token, Expr, Ident, Path};
|
|
|
|
mod compile;
|
|
mod parse;
|
|
|
|
pub fn invoke(input: TokenStream) -> TokenStream {
|
|
let input = parse_macro_input!(input as Body);
|
|
use_absolute! {
|
|
core::iter::FromIterator as FromIterator,
|
|
uwui::view::Template as Template,
|
|
uwui::view::View as View,
|
|
}
|
|
|
|
let output = quote! {
|
|
match (()) {
|
|
(()) => {
|
|
< #Template as #FromIterator<#View<_>> >::from_iter([
|
|
#input
|
|
])
|
|
}
|
|
}
|
|
};
|
|
output.into()
|
|
}
|
|
|
|
struct Body {
|
|
elements: Vec<Component>,
|
|
}
|
|
|
|
struct Component {
|
|
name: Path,
|
|
params: Option<Params>,
|
|
body: Option<Body>,
|
|
}
|
|
|
|
enum Params {
|
|
/// `name: value` style parameter list
|
|
Named(Vec<NamedParam>),
|
|
/// tuple style unnamed parameter list
|
|
Anon(Vec<Expr>),
|
|
}
|
|
|
|
struct NamedParam {
|
|
pub name: Ident,
|
|
pub colon: token::Colon,
|
|
pub val: Expr,
|
|
}
|
|
|
|
struct EventHandler {
|
|
pub name: Ident,
|
|
pub callback: Expr,
|
|
}
|