syn_utils/
path_segment.rs1use 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}