use beet_core::prelude::*;
use proc_macro2::TokenStream;
use quote::quote;
use send_wrapper::SendWrapper;
use syn::Expr;
#[derive(Debug, Clone, Deref, Component, ToTokens)]
#[component(immutable)]
pub struct NodeExpr(pub SendWrapper<Expr>);
impl NodeExpr {
pub fn new(value: Expr) -> Self { Self(SendWrapper::new(value)) }
pub fn new_block(value: syn::Block) -> Self {
Self::new(syn::Expr::Block(syn::ExprBlock {
block: value,
attrs: Vec::new(),
label: None,
}))
}
pub fn new_ident(ident: syn::Ident) -> Self {
Self::new(syn::Expr::Path(syn::ExprPath {
attrs: Vec::new(),
qself: None,
path: ident.into(),
}))
}
pub fn borrow(&self) -> &syn::Expr { &*self.0 }
pub fn inner_parsed(&self) -> Expr {
match self.borrow().clone() {
syn::Expr::Block(mut block) => {
block.attrs.push(syn::parse_quote! {
#[allow(unused_braces)]
});
Expr::Block(block)
}
expr => expr,
}
}
pub fn bundle_tokens(&self) -> TokenStream {
let parsed = self.inner_parsed();
quote! {#parsed.into_bundle()}
}
pub fn insert_deferred(&self) -> TokenStream {
let parsed = self.inner_parsed();
quote! { OnSpawnDeferred::insert(#parsed.into_bundle()) }
}
pub fn merge_deferred(items: &Vec<Self>) -> TokenStream {
let components = items.iter().map(|item| {
let parsed = item.inner_parsed();
quote! {
#parsed.into_bundle()
}
});
if components.len() == 1 {
quote! {OnSpawnDeferred::insert(#(#components),*)}
} else {
quote! {OnSpawnDeferred::insert((#(#components),*))}
}
}
}