Skip to content

Commit 5e2b8a0

Browse files
authored
feat!: Allow Service trait to return custom errors (#921)
Add `Error` associated type to the `Service` trait to allow consumers to return a custom error from their `Service` implementations. Relates to #922
1 parent 97b28c7 commit 5e2b8a0

File tree

26 files changed

+387
-102
lines changed

26 files changed

+387
-102
lines changed

Cargo.lock

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "roadster"
3-
version = "0.8.1"
3+
version = "0.9.0-alpha"
44
edition = "2024"
55
publish = true
66
description = "A \"Batteries Included\" web framework for rust designed to get you moving fast."

benches/worker/Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ publish = false
99
[features]
1010

1111
[dependencies]
12-
roadster = { version = "0.8.1", path = "../..", default-features = false, features = ["worker-pg", "worker-sidekiq"] }
12+
roadster = { version = "0.9.0-alpha", path = "../..", default-features = false, features = ["worker-pg", "worker-sidekiq"] }
1313
tokio = { workspace = true }
1414
tokio-util = { workspace = true }
1515
tracing = { workspace = true }
@@ -22,7 +22,7 @@ itertools = { workspace = true }
2222
sqlx = { workspace = true }
2323

2424
[dev-dependencies]
25-
roadster = { version = "0.8.1", path = "../..", default-features = false, features = ["testing", "bench"] }
25+
roadster = { version = "0.9.0-alpha", path = "../..", default-features = false, features = ["testing", "bench"] }
2626
criterion = { version = "0.6.0", features = ["html_reports"] }
2727
fake = { workspace = true }
2828

benches/worker/src/bench.rs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -88,11 +88,15 @@ fn worker_benchmark<W: 'static + Worker<AppContext, ExampleWorkerArgs>>(
8888
let state = app.state.clone();
8989

9090
runtime.block_on(async {
91-
let srv = app
92-
.service_registry
93-
.get::<PgWorkerService<AppContext>>()
91+
app.service_registry
92+
.invoke({
93+
let state = state.clone();
94+
async move |srvc: &PgWorkerService<AppContext>| {
95+
srvc.before_run(&state).await.unwrap();
96+
}
97+
})
98+
.await
9499
.unwrap();
95-
srv.before_run(&state).await.unwrap();
96100
sqlx::query(&format!(
97101
"truncate pgmq.q_{}",
98102
worker_bench::worker::example::QUEUE

book/examples/service/src/http/open_api.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,11 @@ async fn open_api() -> RoadsterResult<()> {
2323
// Prepare the app
2424
let prepared = prepare(app, PrepareOptions::builder().build()).await?;
2525

26-
// Get the `HttpService`
27-
let http_service = prepared.service_registry.get::<HttpService>()?;
28-
29-
// Get the OpenAPI schema
30-
let schema = http_service.open_api_schema(&OpenApiArgs::builder().build())?;
26+
// Get the OpenAPI schema from the `HttpService`
27+
let schema = prepared
28+
.service_registry
29+
.invoke(async |srvc: &HttpService| srvc.open_api_schema(&OpenApiArgs::builder().build()))
30+
.await??;
3131

3232
println!("{schema}");
3333

examples/app-builder/Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ cli = ["roadster/cli", "clap"]
1212
db-sea-orm = ["roadster/db-sea-orm", "app-builder-migration", "sea-orm"]
1313

1414
[dependencies]
15-
roadster = { version = "0.8.1", path = "../..", default-features = false, features = ["open-api", "worker-sidekiq", "otel-grpc"] }
15+
roadster = { version = "0.9.0-alpha", path = "../..", default-features = false, features = ["open-api", "worker-sidekiq", "otel-grpc"] }
1616
tokio = { workspace = true }
1717
tokio-util = { workspace = true }
1818
anyhow = { workspace = true }
@@ -41,7 +41,7 @@ cron = { workspace = true }
4141
config = { workspace = true, features = ["async"] }
4242

4343
[dev-dependencies]
44-
roadster = { version = "0.8.1", path = "../..", default-features = false, features = ["testing"] }
44+
roadster = { version = "0.9.0-alpha", path = "../..", default-features = false, features = ["testing"] }
4545
tower-util = { workspace = true }
4646

4747
[build-dependencies]

examples/app-builder/tests/ping.rs

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,20 @@ use tower_util::ServiceExt;
88
#[tokio::test]
99
async fn ping() {
1010
run_test(build_app(), PrepareOptions::test(), async |app| {
11-
let http_service = app.service_registry.get::<HttpService>().unwrap();
12-
let router = http_service.router().clone();
11+
let response = app
12+
.service_registry
13+
.invoke(async |srvc: &HttpService| {
14+
let router = srvc.router().clone();
1315

14-
let request: Request<Body> = Request::builder()
15-
.uri("/api/_ping")
16-
.body(().into())
17-
.unwrap();
16+
let request: Request<Body> = Request::builder()
17+
.uri("/api/_ping")
18+
.body(().into())
19+
.unwrap();
1820

19-
let response = router.oneshot(request).await.unwrap();
21+
router.oneshot(request).await.unwrap()
22+
})
23+
.await
24+
.unwrap();
2025

2126
assert_eq!(response.status(), StatusCode::OK);
2227
})

examples/diesel/Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ publish = false
77
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
88

99
[dependencies]
10-
roadster = { version = "0.8.1", path = "../..", features = ["db-diesel-postgres-pool-async"] }
10+
roadster = { version = "0.9.0-alpha", path = "../..", features = ["db-diesel-postgres-pool-async"] }
1111
tokio = { workspace = true }
1212
tokio-util = { workspace = true }
1313
anyhow = { workspace = true }
@@ -42,7 +42,7 @@ chrono = { workspace = true, features = ["serde"] }
4242
fake = { workspace = true }
4343

4444
[dev-dependencies]
45-
roadster = { version = "0.8.1", path = "../..", default-features = false, features = ["testing"] }
45+
roadster = { version = "0.9.0-alpha", path = "../..", default-features = false, features = ["testing"] }
4646
tokio = { workspace = true, features = ["test-util"] }
4747
tower-util = { workspace = true }
4848

examples/diesel/tests/health.rs

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use axum::body::Body;
2-
use axum::http::{Request, Response, StatusCode};
2+
use axum::http::{Request, StatusCode};
33
use roadster::app::{PrepareOptions, run_test};
44
use roadster::service::http::service::HttpService;
55
use roadster_diesel_example::build_app;
@@ -8,16 +8,19 @@ use tower_util::ServiceExt;
88
#[tokio::test]
99
async fn health() {
1010
run_test(build_app(), PrepareOptions::test(), async |app| {
11-
let http_service = app.service_registry.get::<HttpService>().unwrap();
12-
let router = http_service.router().clone();
13-
14-
let request: Request<Body> = Request::builder()
15-
.uri("/api/_health")
16-
.body(().into())
11+
let response = app
12+
.service_registry
13+
.invoke(async |srvc: &HttpService| {
14+
let router = srvc.router().clone();
15+
let request: Request<Body> = Request::builder()
16+
.uri("/api/_health")
17+
.body(().into())
18+
.unwrap();
19+
router.oneshot(request).await.unwrap()
20+
})
21+
.await
1722
.unwrap();
1823

19-
let response: Response<Body> = router.oneshot(request).await.unwrap();
20-
2124
assert_eq!(response.status(), StatusCode::OK);
2225
})
2326
.await

examples/full/Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ default = ["grpc"]
1111
grpc = ["roadster/grpc", "dep:tonic", "dep:tonic-reflection", "dep:tonic-prost-build", "dep:prost"]
1212

1313
[dependencies]
14-
roadster = { version = "0.8.1", path = "../..", features = ["worker-sidekiq", "db-sea-orm", "email-smtp", "email-sendgrid", "config-yml", "otel-grpc"] }
14+
roadster = { version = "0.9.0-alpha", path = "../..", features = ["worker-sidekiq", "db-sea-orm", "email-smtp", "email-sendgrid", "config-yml", "otel-grpc"] }
1515
tokio = { workspace = true }
1616
tokio-util = { workspace = true }
1717
anyhow = { workspace = true }
@@ -47,7 +47,7 @@ uuid = { workspace = true, features = ["v7"] }
4747
chrono = { workspace = true, features = ["serde"] }
4848

4949
[dev-dependencies]
50-
roadster = { version = "0.8.1", path = "../..", features = ["testing-mocks"] }
50+
roadster = { version = "0.9.0-alpha", path = "../..", features = ["testing-mocks"] }
5151
tokio = { workspace = true, features = ["test-util"] }
5252
tower-util = { workspace = true }
5353

0 commit comments

Comments
 (0)