pavex/request/path/
raw_path_params.rs1use std::borrow::Cow;
2
3use matchit::{Params, ParamsIter};
4use percent_encoding::percent_decode_str;
5
6use crate::request::path::errors::DecodeError;
7
8#[derive(Debug, PartialEq, Eq, Clone)]
29pub struct RawPathParams<'server, 'request>(Params<'server, 'request>);
30
31impl Default for RawPathParams<'_, '_> {
32 fn default() -> Self {
33 Self(Params::new())
34 }
35}
36
37impl<'server, 'request> RawPathParams<'server, 'request> {
38 pub fn len(&self) -> usize {
40 self.0.len()
41 }
42
43 pub fn get(&self, key: impl AsRef<str>) -> Option<&'request str> {
45 self.0.get(key)
46 }
47
48 pub fn iter(&self) -> RawPathParamsIter<'_, 'server, 'request> {
50 RawPathParamsIter(self.0.iter())
51 }
52
53 pub fn is_empty(&self) -> bool {
55 self.0.is_empty()
56 }
57}
58
59impl<'k, 'v> From<Params<'k, 'v>> for RawPathParams<'k, 'v> {
60 fn from(value: Params<'k, 'v>) -> Self {
61 Self(value)
62 }
63}
64
65pub struct RawPathParamsIter<'extractor, 'server, 'request>(
67 ParamsIter<'extractor, 'server, 'request>,
68);
69
70impl<'server, 'request> Iterator for RawPathParamsIter<'_, 'server, 'request> {
71 type Item = (&'server str, EncodedParamValue<'request>);
72
73 fn next(&mut self) -> Option<Self::Item> {
74 self.0
75 .next()
76 .map(|(key, value)| (key, EncodedParamValue::new(value)))
77 }
78}
79
80#[derive(Debug, Clone, Hash, Ord, PartialOrd, Eq, PartialEq)]
84pub struct EncodedParamValue<'request>(&'request str);
85
86impl<'request> EncodedParamValue<'request> {
87 fn new(s: &'request str) -> Self {
88 Self(s)
89 }
90
91 pub fn decode(&self) -> Result<Cow<'request, str>, DecodeError> {
95 percent_decode_str(self.0)
96 .decode_utf8()
97 .map_err(|e| DecodeError {
98 invalid_raw_segment: self.0.to_owned(),
99 source: e,
100 })
101 }
102
103 pub fn as_str(&self) -> &'request str {
105 self.0
106 }
107}