brisk_it/
utils_impl.rs

1use quote::ToTokens;
2
3/// This trait is mainly used for Result<T,T> to return the
4/// Ok or Err value.
5pub trait Either<T> {
6    /// Return the Ok or Err value.
7    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
19/// This trait is used for Option to check if required properties have been set.
20pub trait Required<T> {
21    /// Check if the property was set, or return a missing property error.
22    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
34/// Check if `expr` is an expression or a component. If component, expand it to an expression.
35pub 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
47/// Make sure an expression is in a block
48pub 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}