1use quote::ToTokens;
2
3pub trait Either<T> {
6 fn either(self) -> T;
8}
9
10impl<T> Either<T> for Result<T, T> {
11 fn either(self) -> T {
12 match self {
13 Ok(a) => a,
14 Err(a) => a,
15 }
16 }
17}
18
19pub trait Required<T> {
21 fn required(self, component_name: &syn::Ident, prop_name: &str) -> crate::Result<T>;
23}
24
25impl<T> Required<T> for Option<T> {
26 fn required(self, component_name: &syn::Ident, prop_name: &str) -> crate::Result<T> {
27 match self {
28 Some(t) => Ok(t),
29 None => Err(crate::errors::missing_property(component_name, prop_name)),
30 }
31 }
32}
33
34pub fn component_or_expression(
36 expr: &syn::Expr,
37 manager: &crate::generator::Manager,
38) -> proc_macro2::TokenStream {
39 let expr_ts: proc_macro::TokenStream = expr.to_token_stream().into();
40 let frame_comp = syn::parse::<crate::component::ComponentInput>(expr_ts);
41 match frame_comp {
42 Ok(frame_comp) => manager.generate(frame_comp).either(),
43 Err(_) => expr.to_token_stream(),
44 }
45}
46
47pub fn blockify(expr: syn::Expr) -> proc_macro2::TokenStream {
49 match expr {
50 syn::Expr::Block(e) => e.into_token_stream(),
51 o => quote::quote! { { #o; } },
52 }
53}