use quote::ToTokens;
pub trait Either<T> {
fn either(self) -> T;
}
impl<T> Either<T> for Result<T, T> {
fn either(self) -> T {
match self {
Ok(a) => a,
Err(a) => a,
}
}
}
pub trait Required<T> {
fn required(self, component_name: &syn::Ident, prop_name: &str) -> crate::Result<T>;
}
impl<T> Required<T> for Option<T> {
fn required(self, component_name: &syn::Ident, prop_name: &str) -> crate::Result<T> {
match self {
Some(t) => Ok(t),
None => Err(crate::errors::missing_property(component_name, prop_name)),
}
}
}
pub fn component_or_expression(
expr: &syn::Expr,
manager: &crate::generator::Manager,
) -> proc_macro2::TokenStream {
let expr_ts: proc_macro::TokenStream = expr.to_token_stream().into();
let frame_comp = syn::parse::<crate::component::ComponentInput>(expr_ts);
match frame_comp {
Ok(frame_comp) => manager.generate(frame_comp).either(),
Err(_) => expr.to_token_stream(),
}
}
pub fn blockify(expr: syn::Expr) -> proc_macro2::TokenStream {
match expr {
syn::Expr::Block(e) => e.into_token_stream(),
o => quote::quote! { { #o; } },
}
}