Skip to content

Commit d50a877

Browse files
authored
Merge pull request #190 from Metaswitch/md/request_parser_joiner
Fix request_parser so that macro_use is not required.
2 parents dfac4ee + 3f58ea9 commit d50a877

File tree

4 files changed

+87
-6
lines changed

4 files changed

+87
-6
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
88
### Changed
99

1010
### Fixed
11+
- Fix request_parser so that macro_use is not required.
12+
- Add "external" tests to ensure backward compatibility.
1113

1214
## [7.0.0] - 2025-11-12
1315
### Changed

src/request_parser.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,11 @@ macro_rules! request_parser_joiner {
1313
($name:ident ,$($T:ty), *) => {
1414
struct $name;
1515

16-
impl <B> RequestParser<B> for $name
17-
where $($T: RequestParser<B>, )*
16+
impl <B> $crate::RequestParser<B> for $name
17+
where $($T: $crate::RequestParser<B>, )*
1818
{
1919
fn parse_operation_id(request: &Request<B>) -> Option<&'static str> {
20-
__impl_request_parser_joiner!(request, $($T), *)
20+
$crate::__impl_request_parser_joiner!(request, $($T), *)
2121
}
2222
}
2323
};
@@ -27,11 +27,11 @@ macro_rules! request_parser_joiner {
2727
#[macro_export]
2828
#[doc(hidden)]
2929
macro_rules! __impl_request_parser_joiner {
30-
($argname:expr, $head:ty) => {<$head as RequestParser<B>>::parse_operation_id(&$argname)};
30+
($argname:expr, $head:ty) => {<$head as $crate::RequestParser<B>>::parse_operation_id(&$argname)};
3131
($argname:expr, $head:ty, $( $tail:ty), *) => {
32-
match <$head as RequestParser<B>>::parse_operation_id(&$argname) {
32+
match <$head as $crate::RequestParser<B>>::parse_operation_id(&$argname) {
3333
Some(s) => Some(s),
34-
None => __impl_request_parser_joiner!($argname, $( $tail), *),
34+
None => $crate::__impl_request_parser_joiner!($argname, $( $tail), *),
3535
}
3636
};
3737
}

tests/context_macros_external.rs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
use swagger::{make_context, make_context_ty, new_context_type, Has, Pop, Push};
2+
3+
#[derive(Debug, Default, PartialEq, Eq)]
4+
struct Item1(u32);
5+
#[derive(Debug, Default, PartialEq, Eq)]
6+
struct Item2;
7+
#[derive(Debug, Default, PartialEq, Eq)]
8+
struct Item3;
9+
10+
new_context_type!(ExtContext, ExtEmptyContext, Item1, Item2, Item3);
11+
12+
#[test]
13+
fn context_macros_work_from_external_crate() {
14+
let ctx = ExtEmptyContext.push(Item3).push(Item2).push(Item1(42));
15+
16+
let v: &Item1 = ctx.get();
17+
assert_eq!(v.0, 42);
18+
19+
let (item2, ctx): (Item2, _) = ctx.pop();
20+
let (_item3, _ctx): (Item3, _) = ctx.pop();
21+
22+
let _ = item2;
23+
}
24+
25+
#[test]
26+
fn make_context_macros_work_from_external_crate() {
27+
type Ctx = make_context_ty!(ExtContext, ExtEmptyContext, Item1, Item2, Item3);
28+
29+
let ctx1: Ctx = make_context!(ExtContext, ExtEmptyContext, Item1(5), Item2, Item3);
30+
let ctx2: Ctx = ExtEmptyContext.push(Item3).push(Item2).push(Item1(5));
31+
32+
assert_eq!(Has::<Item1>::get(&ctx1).0, 5);
33+
assert_eq!(ctx1, ctx2);
34+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
use http::Request;
2+
use swagger::{request_parser_joiner, RequestParser};
3+
4+
struct TestParser1;
5+
6+
impl RequestParser<()> for TestParser1 {
7+
fn parse_operation_id(request: &Request<()>) -> Option<&'static str> {
8+
match request.uri().path() {
9+
"/test/t11" => Some("t11"),
10+
"/test/t12" => Some("t12"),
11+
_ => None,
12+
}
13+
}
14+
}
15+
16+
struct TestParser2;
17+
18+
impl RequestParser<()> for TestParser2 {
19+
fn parse_operation_id(request: &Request<()>) -> Option<&'static str> {
20+
match request.uri().path() {
21+
"/test/t21" => Some("t21"),
22+
"/test/t22" => Some("t22"),
23+
_ => None,
24+
}
25+
}
26+
}
27+
28+
request_parser_joiner!(JoinedReqParser, TestParser1, TestParser2);
29+
30+
#[test]
31+
fn request_parser_joiner_works_from_external_crate() {
32+
let req1: Request<()> = Request::get("https://www.rust-lang.org/test/t11")
33+
.body(())
34+
.unwrap();
35+
let req2: Request<()> = Request::get("https://www.rust-lang.org/test/t22")
36+
.body(())
37+
.unwrap();
38+
let req3: Request<()> = Request::get("https://www.rust-lang.org/test/t33")
39+
.body(())
40+
.unwrap();
41+
42+
assert_eq!(JoinedReqParser::parse_operation_id(&req1), Some("t11"));
43+
assert_eq!(JoinedReqParser::parse_operation_id(&req2), Some("t22"));
44+
assert_eq!(JoinedReqParser::parse_operation_id(&req3), None);
45+
}

0 commit comments

Comments
 (0)