1use restless_core::{Method, Request};
2use std::borrow::Cow;
3
4#[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}