openapi_context/
request_parser.rs1use hyper::Request;
3
4#[macro_export]
12macro_rules! request_parser_joiner {
13 ($name:ident ,$($T:ty), *) => {
14 struct $name;
15
16 impl <B> RequestParser<B> for $name
17 where $($T: RequestParser<B>, )*
18 {
19 fn parse_operation_id(request: &hyper::Request<B>) -> Result<&'static str, ()> {
20 __impl_request_parser_joiner!(request, $($T), *)
21 }
22 }
23 };
24}
25
26#[macro_export]
28#[doc(hidden)]
29macro_rules! __impl_request_parser_joiner {
30 ($argname:expr, $head:ty) => {<$head as RequestParser<B>>::parse_operation_id(&$argname)};
31 ($argname:expr, $head:ty, $( $tail:ty), *) => {
32 match <$head as RequestParser<B>>::parse_operation_id(&$argname) {
33 Ok(s) => Ok(s),
34 Err(_) => __impl_request_parser_joiner!($argname, $( $tail), *),
35 }
36 };
37}
38
39pub trait RequestParser<B> {
47 fn parse_operation_id(req: &Request<B>) -> Result<&'static str, ()>;
51}
52
53#[cfg(test)]
54mod context_tests {
55 use super::*;
56 use hyper::{Body, Uri};
57 use std::str::FromStr;
58
59 struct TestParser1;
60
61 impl RequestParser<Body> for TestParser1 {
62 fn parse_operation_id(request: &hyper::Request<Body>) -> Result<&'static str, ()> {
63 match request.uri().path() {
64 "/test/t11" => Ok("t11"),
65 "/test/t12" => Ok("t12"),
66 _ => Err(()),
67 }
68 }
69 }
70
71 struct TestParser2;
72
73 impl RequestParser<Body> for TestParser2 {
74 fn parse_operation_id(request: &hyper::Request<Body>) -> Result<&'static str, ()> {
75 match request.uri().path() {
76 "/test/t21" => Ok("t21"),
77 "/test/t22" => Ok("t22"),
78 _ => Err(()),
79 }
80 }
81 }
82
83 #[test]
84 fn test_macros() {
85 let uri = Uri::from_str(&"https://www.rust-lang.org/test/t11").unwrap();
86 let req1: Request<Body> = Request::get(uri).body(Body::empty()).unwrap();
87
88 let uri = Uri::from_str(&"https://www.rust-lang.org/test/t22").unwrap();
89 let req2: Request<Body> = Request::get(uri).body(Body::empty()).unwrap();
90
91 let uri = Uri::from_str(&"https://www.rust-lang.org/test/t33").unwrap();
92 let req3: Request<Body> = Request::get(uri).body(Body::empty()).unwrap();
93
94 request_parser_joiner!(JoinedReqParser, TestParser1, TestParser2);
95
96 assert_eq!(JoinedReqParser::parse_operation_id(&req1), Ok("t11"));
97 assert_eq!(JoinedReqParser::parse_operation_id(&req2), Ok("t22"));
98 assert_eq!(JoinedReqParser::parse_operation_id(&req3), Err(()));
99 }
100}