Skip to content

Commit 5261ba5

Browse files
feat: Add #[derive(FromRequest)] macro
Minimize the amount of boilerplate that users have to write in order to extract information out of the incoming request.
1 parent dd1a2d6 commit 5261ba5

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+2051
-98
lines changed

compiler/ui_tests/Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,9 @@ members = [
267267
"error_observers/error_observers_can_depend_on_fallible_singletons/generated_app",
268268
"error_observers/error_observers_happy_path",
269269
"error_observers/error_observers_happy_path/generated_app",
270+
"from_request/from_request_happy_path",
271+
"from_request/from_request_happy_path/generated_app",
272+
"from_request/from_request_happy_path/integration",
270273
"middlewares/middlewares_execution_order",
271274
"middlewares/middlewares_execution_order/generated_app",
272275
"middlewares/middlewares_execution_order/integration",
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
[package]
2+
name = "app_0389e07d"
3+
version = "0.1.0"
4+
edition.workspace = true
5+
6+
[lints.rust.unexpected_cfgs]
7+
level = "allow"
8+
check-cfg = ["cfg(pavex_ide_hint)"]
9+
10+
[dependencies]
11+
workspace_hack = { version = "0.1", path = "../../workspace_hack" }
12+
13+
[dependencies.pavex]
14+
workspace = true
15+
16+
[dependencies.pavex_cli_client]
17+
workspace = true
18+
19+
[dependencies.serde]
20+
version = "1.0"
21+
features = ["derive"]
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
digraph "* * - 0" {
2+
0 [ label = "0| &pavex::router::AllowedMethods"]
3+
1 [ label = "1| crate::route_0::Next0(&'a pavex::router::AllowedMethods) -> crate::route_0::Next0<'a>"]
4+
2 [ label = "2| pavex::middleware::Next::new(crate::route_0::Next0<'a>) -> pavex::middleware::Next<crate::route_0::Next0<'a>>"]
5+
3 [ label = "3| pavex::middleware::wrap_noop(pavex::middleware::Next<crate::route_0::Next0<'a>>) -> pavex::Response"]
6+
4 [ label = "4| <pavex::Response as pavex::IntoResponse>::into_response(pavex::Response) -> pavex::Response"]
7+
2 -> 3 [ ]
8+
1 -> 2 [ ]
9+
3 -> 4 [ ]
10+
0 -> 1 [ ]
11+
}
12+
13+
digraph "* * - 1" {
14+
0 [ label = "0| &pavex::router::AllowedMethods"]
15+
1 [ label = "1| pavex::router::default_fallback(&pavex::router::AllowedMethods) -> pavex::Response"]
16+
2 [ label = "2| <pavex::Response as pavex::IntoResponse>::into_response(pavex::Response) -> pavex::Response"]
17+
1 -> 2 [ ]
18+
0 -> 1 [ ]
19+
}
20+
21+
digraph "GET /home/{home_id} - 0" {
22+
0 [ label = "0| &pavex::request::path::RawPathParams<'server, 'request>"]
23+
1 [ label = "1| &pavex::request::RequestHead"]
24+
2 [ label = "2| crate::route_1::Next0(&'c pavex::request::path::RawPathParams<'a, 'b>, &'d pavex::request::RequestHead) -> crate::route_1::Next0<'a, 'b, 'c, 'd>"]
25+
3 [ label = "3| pavex::middleware::Next::new(crate::route_1::Next0<'a, 'b, 'c, 'd>) -> pavex::middleware::Next<crate::route_1::Next0<'a, 'b, 'c, 'd>>"]
26+
4 [ label = "4| pavex::middleware::wrap_noop(pavex::middleware::Next<crate::route_1::Next0<'a, 'b, 'c, 'd>>) -> pavex::Response"]
27+
5 [ label = "5| <pavex::Response as pavex::IntoResponse>::into_response(pavex::Response) -> pavex::Response"]
28+
3 -> 4 [ ]
29+
2 -> 3 [ ]
30+
1 -> 2 [ ]
31+
4 -> 5 [ ]
32+
0 -> 2 [ ]
33+
}
34+
35+
digraph "GET /home/{home_id} - 1" {
36+
0 [ label = "0| &pavex::request::path::RawPathParams<'server, 'request>"]
37+
1 [ label = "1| &pavex::request::RequestHead"]
38+
2 [ label = "2| app_0389e07d::GetHomeInput::from_request(&pavex::request::path::RawPathParams<'_, '_>, &pavex::request::RequestHead) -> core::result::Result<app_0389e07d::GetHomeInput, pavex::request::errors::FromRequestErrors>"]
39+
3 [ label = "3| `match`"]
40+
4 [ label = "4| core::result::Result<app_0389e07d::GetHomeInput, pavex::request::errors::FromRequestErrors> -> pavex::request::errors::FromRequestErrors"]
41+
5 [ label = "5| pavex::request::errors::FromRequestErrors::to_response(&pavex::request::errors::FromRequestErrors) -> pavex::Response"]
42+
6 [ label = "6| <pavex::Response as pavex::IntoResponse>::into_response(pavex::Response) -> pavex::Response"]
43+
7 [ label = "7| core::result::Result<app_0389e07d::GetHomeInput, pavex::request::errors::FromRequestErrors> -> app_0389e07d::GetHomeInput"]
44+
8 [ label = "8| app_0389e07d::get_home(app_0389e07d::GetHomeInput) -> pavex::Response"]
45+
9 [ label = "9| <pavex::Response as pavex::IntoResponse>::into_response(pavex::Response) -> pavex::Response"]
46+
7 -> 8 [ ]
47+
3 -> 4 [ ]
48+
1 -> 2 [ ]
49+
3 -> 7 [ ]
50+
8 -> 9 [ ]
51+
4 -> 5 [ label = "&"]
52+
5 -> 6 [ ]
53+
2 -> 3 [ ]
54+
0 -> 2 [ ]
55+
}
56+
57+
digraph "GET /home/{home_id}/room/{room_id} - 0" {
58+
0 [ label = "0| &pavex::request::path::RawPathParams<'server, 'request>"]
59+
1 [ label = "1| crate::route_2::Next0(&'c pavex::request::path::RawPathParams<'a, 'b>) -> crate::route_2::Next0<'a, 'b, 'c>"]
60+
2 [ label = "2| pavex::middleware::Next::new(crate::route_2::Next0<'a, 'b, 'c>) -> pavex::middleware::Next<crate::route_2::Next0<'a, 'b, 'c>>"]
61+
3 [ label = "3| pavex::middleware::wrap_noop(pavex::middleware::Next<crate::route_2::Next0<'a, 'b, 'c>>) -> pavex::Response"]
62+
4 [ label = "4| <pavex::Response as pavex::IntoResponse>::into_response(pavex::Response) -> pavex::Response"]
63+
2 -> 3 [ ]
64+
1 -> 2 [ ]
65+
3 -> 4 [ ]
66+
0 -> 1 [ ]
67+
}
68+
69+
digraph "GET /home/{home_id}/room/{room_id} - 1" {
70+
0 [ label = "0| &pavex::request::path::RawPathParams<'server, 'request>"]
71+
1 [ label = "1| app_0389e07d::GetRoomInput::from_request(&pavex::request::path::RawPathParams<'_, '_>) -> core::result::Result<app_0389e07d::GetRoomInput, pavex::request::errors::FromRequestErrors>"]
72+
2 [ label = "2| `match`"]
73+
3 [ label = "3| core::result::Result<app_0389e07d::GetRoomInput, pavex::request::errors::FromRequestErrors> -> pavex::request::errors::FromRequestErrors"]
74+
4 [ label = "4| pavex::request::errors::FromRequestErrors::to_response(&pavex::request::errors::FromRequestErrors) -> pavex::Response"]
75+
5 [ label = "5| <pavex::Response as pavex::IntoResponse>::into_response(pavex::Response) -> pavex::Response"]
76+
6 [ label = "6| core::result::Result<app_0389e07d::GetRoomInput, pavex::request::errors::FromRequestErrors> -> app_0389e07d::GetRoomInput"]
77+
7 [ label = "7| app_0389e07d::get_room(app_0389e07d::GetRoomInput) -> pavex::Response"]
78+
8 [ label = "8| <pavex::Response as pavex::IntoResponse>::into_response(pavex::Response) -> pavex::Response"]
79+
6 -> 7 [ ]
80+
2 -> 3 [ ]
81+
2 -> 6 [ ]
82+
7 -> 8 [ ]
83+
3 -> 4 [ label = "&"]
84+
4 -> 5 [ ]
85+
1 -> 2 [ ]
86+
0 -> 1 [ ]
87+
}
88+
89+
digraph "GET /town/{*town} - 0" {
90+
0 [ label = "0| &pavex::request::path::RawPathParams<'server, 'request>"]
91+
1 [ label = "1| crate::route_3::Next0(&'c pavex::request::path::RawPathParams<'a, 'b>) -> crate::route_3::Next0<'a, 'b, 'c>"]
92+
2 [ label = "2| pavex::middleware::Next::new(crate::route_3::Next0<'a, 'b, 'c>) -> pavex::middleware::Next<crate::route_3::Next0<'a, 'b, 'c>>"]
93+
3 [ label = "3| pavex::middleware::wrap_noop(pavex::middleware::Next<crate::route_3::Next0<'a, 'b, 'c>>) -> pavex::Response"]
94+
4 [ label = "4| <pavex::Response as pavex::IntoResponse>::into_response(pavex::Response) -> pavex::Response"]
95+
2 -> 3 [ ]
96+
1 -> 2 [ ]
97+
3 -> 4 [ ]
98+
0 -> 1 [ ]
99+
}
100+
101+
digraph "GET /town/{*town} - 1" {
102+
0 [ label = "0| &pavex::request::path::RawPathParams<'server, 'request>"]
103+
1 [ label = "1| app_0389e07d::GetTownInput::from_request(&pavex::request::path::RawPathParams<'_, '_>) -> core::result::Result<app_0389e07d::GetTownInput, pavex::request::errors::FromRequestErrors>"]
104+
2 [ label = "2| `match`"]
105+
3 [ label = "3| core::result::Result<app_0389e07d::GetTownInput, pavex::request::errors::FromRequestErrors> -> pavex::request::errors::FromRequestErrors"]
106+
4 [ label = "4| pavex::request::errors::FromRequestErrors::to_response(&pavex::request::errors::FromRequestErrors) -> pavex::Response"]
107+
5 [ label = "5| <pavex::Response as pavex::IntoResponse>::into_response(pavex::Response) -> pavex::Response"]
108+
6 [ label = "6| core::result::Result<app_0389e07d::GetTownInput, pavex::request::errors::FromRequestErrors> -> app_0389e07d::GetTownInput"]
109+
7 [ label = "7| app_0389e07d::get_town(app_0389e07d::GetTownInput) -> pavex::Response"]
110+
8 [ label = "8| <pavex::Response as pavex::IntoResponse>::into_response(pavex::Response) -> pavex::Response"]
111+
6 -> 7 [ ]
112+
2 -> 3 [ ]
113+
2 -> 6 [ ]
114+
7 -> 8 [ ]
115+
3 -> 4 [ label = "&"]
116+
4 -> 5 [ ]
117+
1 -> 2 [ ]
118+
0 -> 1 [ ]
119+
}
120+
121+
digraph app_state {
122+
0 [ label = "0| crate::ApplicationState() -> crate::ApplicationState"]
123+
}

0 commit comments

Comments
 (0)