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.
71 lines
2.1 KiB
Rust
71 lines
2.1 KiB
Rust
use crate::template::Params;
|
|
use proc_macro2::TokenStream;
|
|
use quote::{quote, ToTokens};
|
|
|
|
use super::{Body, Component, NamedParam};
|
|
|
|
impl ToTokens for Body {
|
|
fn to_tokens(&self, tokens: &mut TokenStream) {
|
|
let elements = self.elements.iter();
|
|
let code = quote! {
|
|
#(#elements),*
|
|
};
|
|
tokens.extend(code);
|
|
}
|
|
}
|
|
|
|
impl ToTokens for Component {
|
|
fn to_tokens(&self, tokens: &mut TokenStream) {
|
|
let name = &self.name;
|
|
let params = match self.params.as_ref() {
|
|
Some(p) => match p {
|
|
Params::Anon(params) => quote! {
|
|
::core::convert::Into::<<#name as crate::view::Construct<_>>::Params>::into(
|
|
(#(::core::convert::Into::<_>::into(#params)),*,)
|
|
)
|
|
},
|
|
Params::Named(params) => quote! {
|
|
{
|
|
let mut __uwui_params = <
|
|
<#name as crate::view::Construct::<_>>::Params as ::core::default::Default
|
|
>::default();
|
|
#(__uwui_params.#params)*
|
|
__uwui_params
|
|
}
|
|
},
|
|
},
|
|
None => quote! {
|
|
<<#name as crate::view::Construct<_>>::Params as ::core::default::Default>::default()
|
|
},
|
|
};
|
|
|
|
let initializer = if let Some(body) = self.body.as_ref() {
|
|
let body = body.elements.as_slice();
|
|
quote! {
|
|
crate::view::View::<_>::new_group::<#name, _>(
|
|
#params,
|
|
[
|
|
#(#body),*
|
|
]
|
|
)
|
|
}
|
|
} else {
|
|
quote! {
|
|
crate::view::View::<_>::new::<#name>(#params)
|
|
}
|
|
};
|
|
|
|
tokens.extend(initializer);
|
|
}
|
|
}
|
|
|
|
impl ToTokens for NamedParam {
|
|
fn to_tokens(&self, tokens: &mut TokenStream) {
|
|
let (name, val) = (&self.name, &self.val);
|
|
let code = quote! {
|
|
#name = ::core::convert::Into::<_>::into(#val);
|
|
};
|
|
tokens.extend(code);
|
|
}
|
|
}
|