restless_util/
lib.rs

1use restless_core::{Method, Request};
2use std::borrow::Cow;
3
4/// Maps a request to prefix the path with a string.
5#[derive(Clone, Debug)]
6pub struct PathPrefix<R: Request + ?Sized, S: AsRef<str>> {
7    prefix: S,
8    request: R,
9}
10
11impl<R: Request + ?Sized, S: AsRef<str>> Request for PathPrefix<R, S> {
12    type Request = R::Request;
13    type Response = R::Response;
14    type Query = R::Query;
15
16    fn path(&self) -> Cow<'_, str> {
17        let mut prefix = self.prefix.as_ref().to_string();
18        prefix.push_str(&self.request.path());
19        prefix.into()
20    }
21
22    fn body(&self) -> Self::Request {
23        self.request.body()
24    }
25
26    fn query(&self) -> Self::Query {
27        self.request.query()
28    }
29
30    fn method(&self) -> Method {
31        self.request.method()
32    }
33}
34
35pub trait RequestExt: Request {
36    fn prefix(self, string: &str) -> PathPrefix<Self, String>;
37}
38
39impl<R: Request> RequestExt for R {
40    fn prefix(self, string: &str) -> PathPrefix<Self, String> {
41        PathPrefix {
42            prefix: string.into(),
43            request: self,
44        }
45    }
46}