diff options
author | HampusM <hampus@hampusmat.com> | 2022-09-24 13:13:20 +0200 |
---|---|---|
committer | HampusM <hampus@hampusmat.com> | 2022-09-24 13:13:20 +0200 |
commit | 695f90bf900015df1e2728445f833dabced838a9 (patch) | |
tree | c68f2b483e3d20f400d27d4df159b2aec94d072f /macros/src/factory | |
parent | 3ed020425bfd1fc5fedfa89a7ce20207bedcf5bc (diff) |
refactor: reorganize modules in the macros crate
Diffstat (limited to 'macros/src/factory')
-rw-r--r-- | macros/src/factory/declare_default_args.rs | 56 | ||||
-rw-r--r-- | macros/src/factory/macro_args.rs | 44 | ||||
-rw-r--r-- | macros/src/factory/mod.rs | 3 | ||||
-rw-r--r-- | macros/src/factory/type_alias.rs | 35 |
4 files changed, 138 insertions, 0 deletions
diff --git a/macros/src/factory/declare_default_args.rs b/macros/src/factory/declare_default_args.rs new file mode 100644 index 0000000..6450583 --- /dev/null +++ b/macros/src/factory/declare_default_args.rs @@ -0,0 +1,56 @@ +use syn::parse::Parse; +use syn::punctuated::Punctuated; +use syn::{Token, Type}; + +use crate::macro_flag::MacroFlag; +use crate::util::iterator_ext::IteratorExt; + +pub const FACTORY_MACRO_FLAGS: &[&str] = &["threadsafe"]; + +pub struct DeclareDefaultFactoryMacroArgs +{ + pub interface: Type, + pub flags: Punctuated<MacroFlag, Token![,]>, +} + +impl Parse for DeclareDefaultFactoryMacroArgs +{ + fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> + { + let interface = input.parse().unwrap(); + + if !input.peek(Token![,]) { + return Ok(Self { + interface, + flags: Punctuated::new(), + }); + } + + input.parse::<Token![,]>().unwrap(); + + let flags = Punctuated::<MacroFlag, Token![,]>::parse_terminated(input)?; + + for flag in &flags { + let flag_str = flag.flag.to_string(); + + if !FACTORY_MACRO_FLAGS.contains(&flag_str.as_str()) { + return Err(input.error(format!( + "Unknown flag '{}'. Expected one of [ {} ]", + flag_str, + FACTORY_MACRO_FLAGS.join(",") + ))); + } + } + + let flag_names = flags + .iter() + .map(|flag| flag.flag.to_string()) + .collect::<Vec<_>>(); + + if let Some(dupe_flag_name) = flag_names.iter().find_duplicate() { + return Err(input.error(format!("Duplicate flag '{}'", dupe_flag_name))); + } + + Ok(Self { interface, flags }) + } +} diff --git a/macros/src/factory/macro_args.rs b/macros/src/factory/macro_args.rs new file mode 100644 index 0000000..dd80c1c --- /dev/null +++ b/macros/src/factory/macro_args.rs @@ -0,0 +1,44 @@ +use syn::parse::Parse; +use syn::punctuated::Punctuated; +use syn::Token; + +use crate::macro_flag::MacroFlag; +use crate::util::iterator_ext::IteratorExt; + +pub const FACTORY_MACRO_FLAGS: &[&str] = &["threadsafe", "async"]; + +pub struct FactoryMacroArgs +{ + pub flags: Punctuated<MacroFlag, Token![,]>, +} + +impl Parse for FactoryMacroArgs +{ + fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> + { + let flags = Punctuated::<MacroFlag, Token![,]>::parse_terminated(input)?; + + for flag in &flags { + let flag_str = flag.flag.to_string(); + + if !FACTORY_MACRO_FLAGS.contains(&flag_str.as_str()) { + return Err(input.error(format!( + "Unknown flag '{}'. Expected one of [ {} ]", + flag_str, + FACTORY_MACRO_FLAGS.join(",") + ))); + } + } + + let flag_names = flags + .iter() + .map(|flag| flag.flag.to_string()) + .collect::<Vec<_>>(); + + if let Some(dupe_flag_name) = flag_names.iter().find_duplicate() { + return Err(input.error(format!("Duplicate flag '{}'", dupe_flag_name))); + } + + Ok(Self { flags }) + } +} diff --git a/macros/src/factory/mod.rs b/macros/src/factory/mod.rs new file mode 100644 index 0000000..a8947c5 --- /dev/null +++ b/macros/src/factory/mod.rs @@ -0,0 +1,3 @@ +pub mod declare_default_args; +pub mod macro_args; +pub mod type_alias; diff --git a/macros/src/factory/type_alias.rs b/macros/src/factory/type_alias.rs new file mode 100644 index 0000000..64afe57 --- /dev/null +++ b/macros/src/factory/type_alias.rs @@ -0,0 +1,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, + }) + } +} |