diff options
Diffstat (limited to 'macros/src/dependency_type.rs')
-rw-r--r-- | macros/src/dependency_type.rs | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/macros/src/dependency_type.rs b/macros/src/dependency_type.rs new file mode 100644 index 0000000..35f810e --- /dev/null +++ b/macros/src/dependency_type.rs @@ -0,0 +1,40 @@ +use proc_macro2::Ident; +use syn::{GenericArgument, PathArguments, Type, TypePath}; + +pub struct DependencyType +{ + pub interface: Type, + pub ptr: Ident, +} + +impl DependencyType +{ + pub fn from_type_path(type_path: &TypePath) -> Option<Self> + { + // Assume the type path has a last segment. + let last_path_segment = type_path.path.segments.last().unwrap(); + + let ptr = &last_path_segment.ident; + + match &last_path_segment.arguments { + PathArguments::AngleBracketed(angle_bracketed_generic_args) => { + let generic_args = &angle_bracketed_generic_args.args; + + let opt_first_generic_arg = generic_args.first(); + + // Assume a first generic argument exists because TransientPtr, + // SingletonPtr and FactoryPtr requires one + let first_generic_arg = opt_first_generic_arg.as_ref().unwrap(); + + match first_generic_arg { + GenericArgument::Type(first_generic_arg_type) => Some(Self { + interface: first_generic_arg_type.clone(), + ptr: ptr.clone(), + }), + &_ => None, + } + } + &_ => None, + } + } +} |