1pub(super) fn is_surrounding_type(ty: &syn::Type, surrounding_type: &'static str) -> bool {
2 extract_inner_type(ty, surrounding_type).is_some()
3}
4
5pub(crate) fn extract_inner_type<'a>(
6 ty: &'a syn::Type,
7 surrounding_type: &str,
8) -> Option<&'a syn::Type> {
9 if let syn::Type::Path(type_path) = ty {
10 if type_path.path.segments.len() == 1 {
11 let segment = &type_path.path.segments[0];
12 if segment.ident == surrounding_type {
13 if let syn::PathArguments::AngleBracketed(args) = &segment.arguments {
14 if let Some(syn::GenericArgument::Type(inner_ty)) = args.args.first() {
15 return Some(inner_ty);
16 }
17 }
18 }
19 }
20 }
21 None
22}
23
24pub(crate) fn extract_hashmap_inner_types(ty: &syn::Type) -> Option<(&syn::Type, &syn::Type)> {
25 if let syn::Type::Path(type_path) = ty {
26 if type_path.path.segments.len() == 1 {
27 let segment = &type_path.path.segments[0];
28 if segment.ident == "HashMap" {
29 if let syn::PathArguments::AngleBracketed(args) = &segment.arguments {
30 let mut types = args.args.iter().filter_map(|arg| {
31 if let syn::GenericArgument::Type(ty) = arg {
32 Some(ty)
33 } else {
34 None
35 }
36 });
37 if let (Some(key_ty), Some(val_ty)) = (types.next(), types.next()) {
38 return Some((key_ty, val_ty));
39 }
40 }
41 }
42 }
43 }
44 None
45}