From f75a7d58135825c4f9094c1e10f36de4a952f455 Mon Sep 17 00:00:00 2001 From: HampusM Date: Wed, 27 Jul 2022 19:10:30 +0200 Subject: feat: add injecting singletons into constructors --- macros/src/dependency_type.rs | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 macros/src/dependency_type.rs (limited to 'macros/src/dependency_type.rs') 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 + { + // 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, + } + } +} -- cgit v1.2.3-18-g5258