rocket_codegen/attribute/param/
mod.rs1mod parse;
2
3use std::ops::Deref;
4use std::hash::Hash;
5
6use crate::name::Name;
7
8#[derive(Debug, Clone, PartialEq, Eq, Hash)]
9pub enum Parameter {
10 Static(Name),
11 Ignored(Dynamic),
12 Dynamic(Dynamic),
13 Guard(Guard),
14}
15
16#[derive(Debug, Clone)]
17pub struct Dynamic {
18 pub name: Name,
19 pub index: usize,
20 pub trailing: bool,
21}
22
23#[derive(Debug, Clone)]
24pub struct Guard {
25 pub source: Dynamic,
26 pub fn_ident: syn::Ident,
27 pub ty: syn::Type,
28}
29
30impl Parameter {
31 pub fn r#static(&self) -> Option<&Name> {
32 match self {
33 Parameter::Static(s) => Some(s),
34 _ => None
35 }
36 }
37
38 pub fn ignored(&self) -> Option<&Dynamic> {
39 match self {
40 Parameter::Ignored(d) => Some(d),
41 _ => None
42 }
43 }
44
45 pub fn take_dynamic(self) -> Option<Dynamic> {
46 match self {
47 Parameter::Dynamic(d) => Some(d),
48 Parameter::Guard(g) => Some(g.source),
49 _ => None
50 }
51 }
52
53 pub fn dynamic(&self) -> Option<&Dynamic> {
54 match self {
55 Parameter::Dynamic(d) => Some(d),
56 Parameter::Guard(g) => Some(&g.source),
57 _ => None
58 }
59 }
60
61 pub fn dynamic_mut(&mut self) -> Option<&mut Dynamic> {
62 match self {
63 Parameter::Dynamic(d) => Some(d),
64 Parameter::Guard(g) => Some(&mut g.source),
65 _ => None
66 }
67 }
68
69 pub fn guard(&self) -> Option<&Guard> {
70 match self {
71 Parameter::Guard(g) => Some(g),
72 _ => None
73 }
74 }
75}
76
77impl Dynamic {
78 pub fn is_wild(&self) -> bool {
80 &self.name == "_"
81 }
82}
83
84impl Guard {
85 pub fn from(source: Dynamic, fn_ident: syn::Ident, ty: syn::Type) -> Self {
86 Guard { source, fn_ident, ty }
87 }
88}
89
90macro_rules! impl_derived {
91 ($T:ty => $U:ty = $v:ident) => (
92 impl Deref for $T {
93 type Target = $U;
94
95 fn deref(&self) -> &Self::Target {
96 &self.$v
97 }
98 }
99
100 impl PartialEq for $T {
101 fn eq(&self, other: &Self) -> bool {
102 self.$v == other.$v
103 }
104 }
105
106 impl Eq for $T { }
107
108 impl Hash for $T {
109 fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
110 self.$v.hash(state)
111 }
112 }
113 )
114}
115
116impl_derived!(Dynamic => Name = name);
117impl_derived!(Guard => Dynamic = source);