1use http::{HeaderMap, Method, Uri, Version};
8use matchit::Params;
9use micro_http::protocol::RequestHeader;
10
11#[derive(Debug)]
17pub struct RequestContext<'server: 'req, 'req> {
18 request_header: &'req RequestHeader,
19 path_params: &'req PathParams<'server, 'req>,
20}
21
22impl<'server, 'req> RequestContext<'server, 'req> {
23 pub fn new(request_header: &'req RequestHeader, path_params: &'req PathParams<'server, 'req>) -> Self {
25 Self { request_header, path_params }
26 }
27
28 pub fn request_header(&self) -> &RequestHeader {
30 self.request_header
31 }
32
33 pub fn method(&self) -> &Method {
35 self.request_header.method()
36 }
37
38 pub fn uri(&self) -> &Uri {
40 self.request_header.uri()
41 }
42
43 pub fn version(&self) -> Version {
45 self.request_header.version()
46 }
47
48 pub fn headers(&self) -> &HeaderMap {
50 self.request_header.headers()
51 }
52
53 pub fn path_params(&self) -> &PathParams<'server, 'req> {
55 self.path_params
56 }
57}
58
59#[derive(Debug, Clone)]
64pub struct PathParams<'server, 'req> {
65 kind: PathParamsKind<'server, 'req>,
66}
67
68#[derive(Debug, Clone)]
70enum PathParamsKind<'server, 'req> {
71 None,
72 Params(Params<'server, 'req>),
73}
74
75impl<'server, 'req> PathParams<'server, 'req> {
76 #[inline]
79 fn new(params: Params<'server, 'req>) -> Self {
80 if params.is_empty() { Self::empty() } else { Self { kind: PathParamsKind::Params(params) } }
81 }
82
83 #[inline]
85 pub fn empty() -> Self {
86 Self { kind: PathParamsKind::None }
87 }
88
89 #[inline]
91 pub fn is_empty(&self) -> bool {
92 match &self.kind {
93 PathParamsKind::None => true,
94 PathParamsKind::Params(params) => params.is_empty(),
95 }
96 }
97
98 #[inline]
100 pub fn len(&self) -> usize {
101 match &self.kind {
102 PathParamsKind::None => 0,
103 PathParamsKind::Params(params) => params.len(),
104 }
105 }
106
107 #[inline]
110 pub fn get(&self, key: impl AsRef<str>) -> Option<&'req str> {
111 match &self.kind {
112 PathParamsKind::Params(params) => params.get(key),
113 PathParamsKind::None => None,
114 }
115 }
116}
117
118impl<'server, 'req> From<Params<'server, 'req>> for PathParams<'server, 'req> {
120 fn from(params: Params<'server, 'req>) -> Self {
121 PathParams::new(params)
122 }
123}