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

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);
}
}