aboutsummaryrefslogtreecommitdiff
path: root/macros/src/factory_type_alias.rs
diff options
context:
space:
mode:
Diffstat (limited to 'macros/src/factory_type_alias.rs')
-rw-r--r--macros/src/factory_type_alias.rs75
1 files changed, 13 insertions, 62 deletions
diff --git a/macros/src/factory_type_alias.rs b/macros/src/factory_type_alias.rs
index 8ea7baa..64afe57 100644
--- a/macros/src/factory_type_alias.rs
+++ b/macros/src/factory_type_alias.rs
@@ -1,17 +1,20 @@
+use quote::ToTokens;
use syn::parse::{Parse, ParseStream};
-use syn::{GenericArgument, ItemType, Path, Type, TypeParamBound, TypeTuple};
+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: Path,
- pub arg_types: TypeTuple,
+ pub factory_interface: FnTrait,
+ pub arg_types: Punctuated<Type, Token![,]>,
pub return_type: Type,
}
impl Parse for FactoryTypeAlias
{
- #[allow(clippy::match_wildcard_for_single_variants)]
fn parse(input: ParseStream) -> syn::Result<Self>
{
let type_alias = match input.parse::<ItemType>() {
@@ -19,66 +22,14 @@ impl Parse for FactoryTypeAlias
Err(_) => Err(input.error("Expected a type alias")),
}?;
- let aliased_trait = match &type_alias.ty.as_ref() {
- Type::TraitObject(alias_type) => Ok(alias_type),
- &_ => Err(input.error("Expected the aliased type to be a trait")),
- }?;
-
- if aliased_trait.bounds.len() != 1 {
- return Err(input.error("Expected the aliased trait to have a single bound."));
- }
-
- let bound_path = &match aliased_trait.bounds.first().unwrap() {
- TypeParamBound::Trait(trait_bound) => Ok(trait_bound),
- &_ => {
- Err(input.error("Expected the bound of the aliased trait to be a trait"))
- }
- }?
- .path;
-
- if bound_path.segments.is_empty()
- || bound_path.segments.last().unwrap().ident != "IFactory"
- {
- return Err(input
- .error("Expected the bound of the aliased trait to be 'dyn IFactory'"));
- }
-
- let angle_bracketed_args = match &bound_path.segments.last().unwrap().arguments {
- syn::PathArguments::AngleBracketed(angle_bracketed_args) => {
- Ok(angle_bracketed_args)
- }
- &_ => {
- Err(input.error("Expected angle bracketed arguments for 'dyn IFactory'"))
- }
- }?;
-
- let arg_types = match &angle_bracketed_args.args[0] {
- GenericArgument::Type(arg_types_type) => match arg_types_type {
- Type::Tuple(arg_types) => Ok(arg_types),
- &_ => Err(input.error(concat!(
- "Expected the first angle bracketed argument ",
- "of 'dyn IFactory' to be a type tuple"
- ))),
- },
- &_ => Err(input.error(concat!(
- "Expected the first angle bracketed argument ",
- "of 'dyn IFactory' to be a type"
- ))),
- }?;
-
- let return_type = match &angle_bracketed_args.args[1] {
- GenericArgument::Type(arg_type) => Ok(arg_type),
- &_ => Err(input.error(concat!(
- "Expected the second angle bracketed argument ",
- "of 'dyn IFactory' to be a type"
- ))),
- }?;
+ let aliased_fn_trait =
+ parse::<FnTrait>(type_alias.ty.as_ref().to_token_stream().into())?;
Ok(Self {
- type_alias: type_alias.clone(),
- factory_interface: bound_path.clone(),
- arg_types: arg_types.clone(),
- return_type: return_type.clone(),
+ type_alias,
+ factory_interface: aliased_fn_trait.clone(),
+ arg_types: aliased_fn_trait.inputs,
+ return_type: aliased_fn_trait.output,
})
}
}