restless_axum/
lib.rs

1use async_trait::async_trait;
2use axum::Router;
3use restless_core::{Decodable, Request};
4use restless_hyper::{hyper, HyperRequest};
5use tower::ServiceExt;
6
7#[derive(thiserror::Error, Debug)]
8pub enum Error {}
9
10#[async_trait(?Send)]
11trait RouterExt {
12    async fn send<R: Request>(
13        &self,
14        request: R,
15    ) -> Result<<R::Response as Decodable>::Target, Error>;
16}
17
18#[async_trait(?Send)]
19impl RouterExt for Router {
20    async fn send<R: Request>(
21        &self,
22        request: R,
23    ) -> Result<<R::Response as Decodable>::Target, Error> {
24        println!("{:?} {}", request.method(), request.uri());
25        let response = self
26            .clone()
27            .oneshot(request.to_hyper_request().unwrap())
28            .await
29            .unwrap();
30        let _status = response.status();
31        let body = hyper::body::to_bytes(response.into_body()).await.unwrap();
32        Ok(R::Response::decode(&body[..]).unwrap())
33    }
34}