Skip to content

Commit

Permalink
Add register method to all built-in extractors (#141)
Browse files Browse the repository at this point in the history
  • Loading branch information
LukeMathWalker committed Jan 2, 2024
1 parent 85a0fbb commit 30626f0
Show file tree
Hide file tree
Showing 32 changed files with 896 additions and 940 deletions.
3 changes: 3 additions & 0 deletions .github/workflows/docs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -70,8 +70,11 @@ jobs:
with:
toolchain: nightly
components: rust-docs-json
rustflags: ""
- name: Install Rust stable toolchain
uses: actions-rust-lang/[email protected]
with:
rustflags: ""
- name: Download pavex CLI artifact
uses: actions/download-artifact@v4
with:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ pub async fn reject_anonymous<C>(user: &User, next: Next<C>) -> Response
C: IntoFuture<Output=Response>,
{
if let User::Anonymous = user {
return Response::unauthorized().box_body();
return Response::unauthorized();
}
next.into_future().await
}
Original file line number Diff line number Diff line change
@@ -1,51 +1,12 @@
use pavex::blueprint::Blueprint;
use pavex::blueprint::constructor::Lifecycle;
use pavex::f;
use pavex::request::body::{BodySizeLimit, BufferedBody};

pub fn blueprint() -> Blueprint {
let mut bp = Blueprint::new();
register_common_constructors(&mut bp);
bp.nest(crate::buffered_body::blueprint());
bp
}

/// Common constructors used by all routes.
fn register_common_constructors(bp: &mut Blueprint) {
// Query parameters
bp.constructor(
f!(pavex::request::query::QueryParams::extract),
Lifecycle::RequestScoped,
)
.error_handler(f!(
pavex::request::query::errors::ExtractQueryParamsError::into_response
));
BufferedBody::register(&mut bp);
BodySizeLimit::register(&mut bp);

// Route parameters
bp.constructor(
f!(pavex::request::route::RouteParams::extract),
Lifecycle::RequestScoped,
)
.error_handler(f!(
pavex::request::route::errors::ExtractRouteParamsError::into_response
));

// Json body
bp.constructor(
f!(pavex::request::body::JsonBody::extract),
Lifecycle::RequestScoped,
)
.error_handler(f!(
pavex::request::body::errors::ExtractJsonBodyError::into_response
));
bp.constructor(
f!(pavex::request::body::BufferedBody::extract),
Lifecycle::RequestScoped,
)
.error_handler(f!(
pavex::request::body::errors::ExtractBufferedBodyError::into_response
));
bp.constructor(
f!(<pavex::request::body::BodySizeLimit as std::default::Default>::default),
Lifecycle::RequestScoped,
);
bp.nest(crate::buffered_body::blueprint());
bp
}
50 changes: 6 additions & 44 deletions doc_examples/guide/request_data/json/project/src/blueprint.rs
Original file line number Diff line number Diff line change
@@ -1,51 +1,13 @@
use pavex::blueprint::constructor::Lifecycle;
use pavex::blueprint::Blueprint;
use pavex::f;
use pavex::request::body::{BodySizeLimit, BufferedBody, JsonBody};

pub fn blueprint() -> Blueprint {
let mut bp = Blueprint::new();
register_common_constructors(&mut bp);
bp.nest(crate::json::blueprint());
bp
}

/// Common constructors used by all routes.
fn register_common_constructors(bp: &mut Blueprint) {
// Query parameters
bp.constructor(
f!(pavex::request::query::QueryParams::extract),
Lifecycle::RequestScoped,
)
.error_handler(f!(
pavex::request::query::errors::ExtractQueryParamsError::into_response
));
JsonBody::register(&mut bp);
BufferedBody::register(&mut bp);
BodySizeLimit::register(&mut bp);

// Route parameters
bp.constructor(
f!(pavex::request::route::RouteParams::extract),
Lifecycle::RequestScoped,
)
.error_handler(f!(
pavex::request::route::errors::ExtractRouteParamsError::into_response
));

// Json body
bp.constructor(
f!(pavex::request::body::JsonBody::extract),
Lifecycle::RequestScoped,
)
.error_handler(f!(
pavex::request::body::errors::ExtractJsonBodyError::into_response
));
bp.constructor(
f!(pavex::request::body::BufferedBody::extract),
Lifecycle::RequestScoped,
)
.error_handler(f!(
pavex::request::body::errors::ExtractBufferedBodyError::into_response
));
bp.constructor(
f!(<pavex::request::body::BodySizeLimit as std::default::Default>::default),
Lifecycle::RequestScoped,
);
bp.nest(crate::json::blueprint());
bp
}
Original file line number Diff line number Diff line change
@@ -1,51 +1,9 @@
use pavex::blueprint::Blueprint;
use pavex::blueprint::constructor::Lifecycle;
use pavex::f;
use pavex::request::query::QueryParams;

pub fn blueprint() -> Blueprint {
let mut bp = Blueprint::new();
register_common_constructors(&mut bp);
QueryParams::register(&mut bp);
bp.nest(crate::query_params::blueprint());
bp
}

/// Common constructors used by all routes.
fn register_common_constructors(bp: &mut Blueprint) {
// Query parameters
bp.constructor(
f!(pavex::request::query::QueryParams::extract),
Lifecycle::RequestScoped,
)
.error_handler(f!(
pavex::request::query::errors::ExtractQueryParamsError::into_response
));

// Route parameters
bp.constructor(
f!(pavex::request::route::RouteParams::extract),
Lifecycle::RequestScoped,
)
.error_handler(f!(
pavex::request::route::errors::ExtractRouteParamsError::into_response
));

// Json body
bp.constructor(
f!(pavex::request::body::JsonBody::extract),
Lifecycle::RequestScoped,
)
.error_handler(f!(
pavex::request::body::errors::ExtractJsonBodyError::into_response
));
bp.constructor(
f!(pavex::request::body::BufferedBody::extract),
Lifecycle::RequestScoped,
)
.error_handler(f!(
pavex::request::body::errors::ExtractBufferedBodyError::into_response
));
bp.constructor(
f!(<pavex::request::body::BodySizeLimit as std::default::Default>::default),
Lifecycle::RequestScoped,
);
}
Original file line number Diff line number Diff line change
@@ -1,51 +1,9 @@
use pavex::blueprint::constructor::Lifecycle;
use pavex::blueprint::Blueprint;
use pavex::f;
use pavex::request::route::RouteParams;

pub fn blueprint() -> Blueprint {
let mut bp = Blueprint::new();
register_common_constructors(&mut bp);
RouteParams::register(&mut bp);
bp.nest(crate::route_params::blueprint());
bp
}

/// Common constructors used by all routes.
fn register_common_constructors(bp: &mut Blueprint) {
// Query parameters
bp.constructor(
f!(pavex::request::query::QueryParams::extract),
Lifecycle::RequestScoped,
)
.error_handler(f!(
pavex::request::query::errors::ExtractQueryParamsError::into_response
));

// Route parameters
bp.constructor(
f!(pavex::request::route::RouteParams::extract),
Lifecycle::RequestScoped,
)
.error_handler(f!(
pavex::request::route::errors::ExtractRouteParamsError::into_response
));

// Json body
bp.constructor(
f!(pavex::request::body::JsonBody::extract),
Lifecycle::RequestScoped,
)
.error_handler(f!(
pavex::request::body::errors::ExtractJsonBodyError::into_response
));
bp.constructor(
f!(pavex::request::body::BufferedBody::extract),
Lifecycle::RequestScoped,
)
.error_handler(f!(
pavex::request::body::errors::ExtractBufferedBodyError::into_response
));
bp.constructor(
f!(<pavex::request::body::BodySizeLimit as std::default::Default>::default),
Lifecycle::RequestScoped,
);
}
2 changes: 1 addition & 1 deletion doc_examples/quickstart/03-route_def.snap
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
```rust title="demo/src/routes/greet.rs"
use pavex::request::RouteParams;
use pavex::request::route::RouteParams;
use pavex::response::Response;
#[RouteParams]
Expand Down
2 changes: 1 addition & 1 deletion doc_examples/quickstart/03.patch
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ index 38ec1e3..adfbbd5 100644
--- a/demo/src/routes/greet.rs
+++ b/demo/src/routes/greet.rs
@@ -1,5 +1,11 @@
+use pavex::request::RouteParams;
+use pavex::request::route::RouteParams;
use pavex::response::Response;

-pub fn greet() -> Response {
Expand Down
1 change: 0 additions & 1 deletion doc_examples/quickstart/04-route_def.snap
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,5 @@ pub fn greet(params: RouteParams<GreetParams>) -> Response {
let GreetParams { name }/* (1)! */ = params.0;
Response::ok() // (2)!
.set_typed_body(format!("Hello, {name}!")) // (3)!
.box_body()
}
```
8 changes: 2 additions & 6 deletions doc_examples/quickstart/04-route_params_constructor.snap
Original file line number Diff line number Diff line change
@@ -1,11 +1,7 @@
```rust title="demo/src/blueprint.rs" hl_lines="4 5 6 7"
```rust title="demo/src/blueprint.rs" hl_lines="3"
// [...]
fn register_common_constructors(bp: &mut Blueprint) {
// [...]
bp.constructor(
f!(pavex::request::route::RouteParams::extract),
Lifecycle::RequestScoped,
)
RouteParams::register(bp);
// [...]
}
```
12 changes: 4 additions & 8 deletions doc_examples/quickstart/04.patch
Original file line number Diff line number Diff line change
@@ -1,23 +1,19 @@
diff --git a/demo/src/routes/greet.rs b/demo/src/routes/greet.rs
index 0d94360..fbcb3fc 100644
index e0be313..5080f53 100644
--- a/demo/src/routes/greet.rs
+++ b/demo/src/routes/greet.rs
@@ -1,11 +1,14 @@
-use pavex::request::RouteParams;
+use pavex::request::route::RouteParams;
use pavex::response::Response;

@@ -3,9 +3,11 @@ use pavex::response::Response;

#[RouteParams]
pub struct GreetParams {
- pub name: String, /* (1)! */
+ pub name: String,
}

-pub fn greet(params: RouteParams<GreetParams> /* (2)! */) -> Response {
- todo!()
+pub fn greet(params: RouteParams<GreetParams>) -> Response {
+ let GreetParams { name }/* (1)! */ = params.0;
+ Response::ok() // (2)!
+ .set_typed_body(format!("Hello, {name}!")) // (3)!
+ .box_body()
}
2 changes: 1 addition & 1 deletion doc_examples/quickstart/05-bis.patch
Original file line number Diff line number Diff line change
Expand Up @@ -25,4 +25,4 @@ diff --git a/demo/src/routes/greet.rs b/demo/src/routes/greet.rs
+pub fn greet(params: RouteParams<GreetParams>, user_agent: UserAgent) -> Response {
if let UserAgent::Unknown = user_agent {
return Response::unauthorized()
.set_typed_body("You must provide a `User-Agent` header")
.set_typed_body("You must provide a `User-Agent` header");
8 changes: 4 additions & 4 deletions doc_examples/quickstart/05-error.snap
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,12 @@
│ instance of `demo::user_agent::UserAgent` as input, but I can't find a constructor for that
│ type.
│
[31m│[0m ╭─[[36;1;4mdemo/src/blueprint.rs[0m:13:1]
[31m│[0m [2m13[0mbp.route(GET, "/api/ping", f!(crate::routes::status::ping));
[31m│[0m [2m14[0mbp.route(GET, "/api/greet/:name", f!(crate::routes::greet::greet));
[31m│[0m ╭─[[36;1;4mdemo/src/blueprint.rs[0m:15:1]
[31m│[0m [2m15[0mbp.route(GET, "/api/ping", f!(crate::routes::status::ping));
[31m│[0m [2m16[0mbp.route(GET, "/api/greet/:name", f!(crate::routes::greet::greet));
│ ·  ───────────────┬───────────────
│ · The request handler was registered here ──╯
[31m│[0m [2m15[0mbp
[31m│[0m [2m17[0mbp
│ ╰────
│ ╭─[demo/src/routes/greet.rs:10:1]
│ 10
Expand Down
4 changes: 1 addition & 3 deletions doc_examples/quickstart/05-inject.snap
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,7 @@ use crate::user_agent::UserAgent;
// [...]
pub fn greet(params: RouteParams<GreetParams>, user_agent: UserAgent /* (1)! */) -> Response {
if let UserAgent::Unknown = user_agent {
return Response::unauthorized()
.set_typed_body("You must provide a `User-Agent` header")
.box_body();
return Response::unauthorized().set_typed_body("You must provide a `User-Agent` header");
}
// [...]
}
Expand Down
17 changes: 8 additions & 9 deletions doc_examples/quickstart/05.patch
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
diff --git a/demo/src/lib.rs b/demo/src/lib.rs
index f8a6fe0..6fe333a 100644
--- a/demo/src/lib.rs
+++ b/demo/src/lib.rs
@@ -1,6 +1,7 @@
Expand All @@ -12,36 +13,34 @@ diff --git a/demo/src/lib.rs b/demo/src/lib.rs
-pub use blueprint::blueprint;
+pub mod user_agent;
diff --git a/demo/src/routes/greet.rs b/demo/src/routes/greet.rs
index 5080f53..721ca61 100644
--- a/demo/src/routes/greet.rs
+++ b/demo/src/routes/greet.rs
@@ -1,14 +1,21 @@
@@ -1,13 +1,17 @@
use pavex::request::route::RouteParams;
use pavex::response::Response;

+use crate::user_agent::UserAgent;
+
#[RouteParams]
pub struct GreetParams {
pub name: String,
}

-pub fn greet(params: RouteParams<GreetParams>) -> Response {
- let GreetParams { name }/* (1)! */ = params.0;
- Response::ok() // (2)!
- .set_typed_body(format!("Hello, {name}!")) // (3)!
+pub fn greet(params: RouteParams<GreetParams>, user_agent: UserAgent /* (1)! */) -> Response {
+ if let UserAgent::Unknown = user_agent {
+ return Response::unauthorized()
+ .set_typed_body("You must provide a `User-Agent` header")
+ .box_body();
+ return Response::unauthorized().set_typed_body("You must provide a `User-Agent` header");
+ }
+ let GreetParams { name } = params.0;
+ Response::ok()
+ .set_typed_body(format!("Hello, {name}!"))
.box_body()
+ Response::ok().set_typed_body(format!("Hello, {name}!"))
}
diff --git a/demo/src/user_agent.rs b/demo/src/user_agent.rs
new file mode 100644
index 0000000..f16d4c1
--- /dev/null
+++ b/demo/src/user_agent.rs
@@ -0,0 +1,6 @@
Expand Down
Loading

0 comments on commit 30626f0

Please sign in to comment.