rocket_codegen/attribute/param/
mod.rs

1mod 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    // This isn't public since this `Dynamic` should always be an `Ignored`.
79    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);