scrappy_router/
lib.rs

1//! Resource path matching library.
2mod de;
3mod path;
4mod resource;
5mod router;
6
7pub use self::de::PathDeserializer;
8pub use self::path::Path;
9pub use self::resource::ResourceDef;
10pub use self::router::{ResourceInfo, Router, RouterBuilder};
11
12pub trait Resource<T: ResourcePath> {
13    fn resource_path(&mut self) -> &mut Path<T>;
14}
15
16pub trait ResourcePath {
17    fn path(&self) -> &str;
18}
19
20impl ResourcePath for String {
21    fn path(&self) -> &str {
22        self.as_str()
23    }
24}
25
26impl<'a> ResourcePath for &'a str {
27    fn path(&self) -> &str {
28        self
29    }
30}
31
32impl ResourcePath for bytestring::ByteString {
33    fn path(&self) -> &str {
34        &*self
35    }
36}
37
38/// Helper trait for type that could be converted to path pattern
39pub trait IntoPattern {
40    /// Signle patter
41    fn is_single(&self) -> bool;
42
43    fn patterns(&self) -> Vec<String>;
44}
45
46impl IntoPattern for String {
47    fn is_single(&self) -> bool {
48        true
49    }
50
51    fn patterns(&self) -> Vec<String> {
52        vec![self.clone()]
53    }
54}
55
56impl<'a> IntoPattern for &'a String {
57    fn is_single(&self) -> bool {
58        true
59    }
60
61    fn patterns(&self) -> Vec<String> {
62        vec![self.as_str().to_string()]
63    }
64}
65
66impl<'a> IntoPattern for &'a str {
67    fn is_single(&self) -> bool {
68        true
69    }
70
71    fn patterns(&self) -> Vec<String> {
72        vec![self.to_string()]
73    }
74}
75
76impl<T: AsRef<str>> IntoPattern for Vec<T> {
77    fn is_single(&self) -> bool {
78        self.len() == 1
79    }
80
81    fn patterns(&self) -> Vec<String> {
82        self.into_iter().map(|v| v.as_ref().to_string()).collect()
83    }
84}
85
86macro_rules! array_patterns (($tp:ty, $num:tt) => {
87    impl IntoPattern for [$tp; $num] {
88        fn is_single(&self) -> bool {
89            $num == 1
90        }
91
92        fn patterns(&self) -> Vec<String> {
93            self.iter().map(|v| v.to_string()).collect()
94        }
95    }
96});
97
98array_patterns!(&str, 1);
99array_patterns!(&str, 2);
100array_patterns!(&str, 3);
101array_patterns!(&str, 4);
102array_patterns!(&str, 5);
103array_patterns!(&str, 6);
104array_patterns!(&str, 7);
105array_patterns!(&str, 8);
106array_patterns!(&str, 9);
107array_patterns!(&str, 10);
108array_patterns!(&str, 11);
109array_patterns!(&str, 12);
110array_patterns!(&str, 13);
111array_patterns!(&str, 14);
112array_patterns!(&str, 15);
113array_patterns!(&str, 16);
114
115array_patterns!(String, 1);
116array_patterns!(String, 2);
117array_patterns!(String, 3);
118array_patterns!(String, 4);
119array_patterns!(String, 5);
120array_patterns!(String, 6);
121array_patterns!(String, 7);
122array_patterns!(String, 8);
123array_patterns!(String, 9);
124array_patterns!(String, 10);
125array_patterns!(String, 11);
126array_patterns!(String, 12);
127array_patterns!(String, 13);
128array_patterns!(String, 14);
129array_patterns!(String, 15);
130array_patterns!(String, 16);
131
132#[cfg(feature = "http")]
133mod url;
134
135#[cfg(feature = "http")]
136pub use self::url::{Quoter, Url};
137
138#[cfg(feature = "http")]
139mod http_support {
140    use super::ResourcePath;
141    use http::Uri;
142
143    impl ResourcePath for Uri {
144        fn path(&self) -> &str {
145            self.path()
146        }
147    }
148}