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}