syn_utils/
path_segment.rs

1use crate::*;
2
3pub trait PathSegmentExt {
4  fn first_generic(&self) -> Option<&GenericArgument>;
5  fn first_generic_mut(&mut self) -> Option<&mut GenericArgument>;
6  fn last_generic(&self) -> Option<&GenericArgument>;
7  fn last_generic_mut(&mut self) -> Option<&mut GenericArgument>;
8  fn first_two_generics(&self) -> Option<(&GenericArgument, &GenericArgument)>;
9  fn generic_args(&self) -> Option<&Punctuated<GenericArgument, Token![,]>>;
10  fn generic_args_mut(&mut self) -> Option<&mut Punctuated<GenericArgument, Token![,]>>;
11}
12
13impl PathSegmentExt for PathSegment {
14  fn first_generic(&self) -> Option<&GenericArgument> {
15    match &self.arguments {
16      PathArguments::None => None,
17      PathArguments::AngleBracketed(args) => args.args.first(),
18      PathArguments::Parenthesized(_) => None,
19    }
20  }
21
22  fn first_generic_mut(&mut self) -> Option<&mut GenericArgument> {
23    match &mut self.arguments {
24      PathArguments::None => None,
25      PathArguments::AngleBracketed(args) => args.args.first_mut(),
26      PathArguments::Parenthesized(_) => None,
27    }
28  }
29
30  fn last_generic(&self) -> Option<&GenericArgument> {
31    match &self.arguments {
32      PathArguments::None => None,
33      PathArguments::AngleBracketed(args) => args.args.last(),
34      PathArguments::Parenthesized(_) => None,
35    }
36  }
37
38  fn last_generic_mut(&mut self) -> Option<&mut GenericArgument> {
39    match &mut self.arguments {
40      PathArguments::None => None,
41      PathArguments::AngleBracketed(args) => args.args.last_mut(),
42      PathArguments::Parenthesized(_) => None,
43    }
44  }
45
46  fn first_two_generics(&self) -> Option<(&GenericArgument, &GenericArgument)> {
47    match &self.arguments {
48      PathArguments::None => None,
49      PathArguments::AngleBracketed(args) => {
50        if args.args.len() > 1 {
51          Some((args.args.first().unwrap(), args.args.get(1).unwrap()))
52        } else {
53          None
54        }
55      }
56      PathArguments::Parenthesized(_) => None,
57    }
58  }
59
60  fn generic_args_mut(&mut self) -> Option<&mut Punctuated<GenericArgument, Token![,]>> {
61    match &mut self.arguments {
62      PathArguments::None => None,
63      PathArguments::AngleBracketed(ab) => Some(&mut ab.args),
64      PathArguments::Parenthesized(_) => None,
65    }
66  }
67
68  fn generic_args(&self) -> Option<&Punctuated<GenericArgument, Token![,]>> {
69    match &self.arguments {
70      PathArguments::None => None,
71      PathArguments::AngleBracketed(ab) => Some(&ab.args),
72      PathArguments::Parenthesized(_) => None,
73    }
74  }
75}