https://github.com/krtab/tower_type_steer
https://github.com/krtab/tower_type_steer
Last synced: about 1 year ago
JSON representation
- Host: GitHub
- URL: https://github.com/krtab/tower_type_steer
- Owner: krtab
- Created: 2024-10-05T09:05:49.000Z (over 1 year ago)
- Default Branch: master
- Last Pushed: 2024-10-05T09:23:49.000Z (over 1 year ago)
- Last Synced: 2025-03-29T21:47:14.491Z (about 1 year ago)
- Language: Rust
- Size: 2.93 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
Dispatch request to service by trying to convert to the service's request type.
```rust
use futures::future::ready;
use serde::Deserialize;
use tower::{service_fn, Service, ServiceBuilder, ServiceExt};
use tower_type_steer::Converter;
#[derive(Deserialize, Clone)]
struct Foo {
x: i8,
y: i8,
}
#[derive(Deserialize, Clone)]
struct Bar {
z: i8,
}
fn main() {
// impl Service
let foo_service = service_fn(|foo: Foo| ready(foo.x.checked_add(foo.y).ok_or("Overflow")));
// impl Service
let bar_service = service_fn(|bar: Bar| ready(Ok::<_, &'static str>(bar.z)));
let error_service = service_fn(|_: &str| ready(Err::("No matching json")));
let mut s = ServiceBuilder::new()
.layer(tower_type_steer::serde_conv::json().wrap(foo_service))
.layer(tower_type_steer::serde_conv::json().wrap(bar_service))
.service(error_service);
let res: Result<_, &str> = futures::executor::block_on(async move {
let s = s.ready().await?;
let res = [
// Ok(5) (foo_service)
s.call(r#"{"x": 3, "y": 2}"#).await,
// Err("Overflow") (foo_service)
s.call(r#"{"x": 120, "y": 120}"#).await,
// Err("Ok(2)") (bar_service)
s.call(r#"{"z": 2}"#).await,
// Err("No matching json") (error_service)
s.call(r#"{}"#).await,
];
Ok(res)
});
println!("{res:?}");
}
```