Skip to main content

derive_into/
util.rs

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}