aboutsummaryrefslogtreecommitdiff
path: root/macros/src/factory_type_alias.rs
blob: 64afe572bbfa44347f40c5b2f534827b2d0d2d1a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
use quote::ToTokens;
use syn::parse::{Parse, ParseStream};
use syn::punctuated::Punctuated;
use syn::{parse, ItemType, Token, Type};

use crate::fn_trait::FnTrait;

pub struct FactoryTypeAlias
{
    pub type_alias: ItemType,
    pub factory_interface: FnTrait,
    pub arg_types: Punctuated<Type, Token![,]>,
    pub return_type: Type,
}

impl Parse for FactoryTypeAlias
{
    fn parse(input: ParseStream) -> syn::Result<Self>
    {
        let type_alias = match input.parse::<ItemType>() {
            Ok(type_alias) => Ok(type_alias),
            Err(_) => Err(input.error("Expected a type alias")),
        }?;

        let aliased_fn_trait =
            parse::<FnTrait>(type_alias.ty.as_ref().to_token_stream().into())?;

        Ok(Self {
            type_alias,
            factory_interface: aliased_fn_trait.clone(),
            arg_types: aliased_fn_trait.inputs,
            return_type: aliased_fn_trait.output,
        })
    }
}