nyquest_interface/async/
any.rs1use std::any::Any;
11use std::fmt;
12
13use futures_core::future::BoxFuture;
14
15use super::backend::AsyncResponse;
16use super::Request;
17use crate::client::{BuildClientResult, ClientOptions};
18use crate::Result;
19
20pub trait AnyAsyncBackend: Send + Sync + 'static {
24 fn create_async_client(
26 &self,
27 options: ClientOptions,
28 ) -> BoxFuture<BuildClientResult<Box<dyn AnyAsyncClient>>>;
29}
30
31pub trait AnyAsyncClient: Any + Send + Sync + 'static {
35 fn describe(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result;
37 fn clone_boxed(&self) -> Box<dyn AnyAsyncClient>;
39 fn request(&self, req: Request) -> BoxFuture<Result<Box<dyn AnyAsyncResponse>>>;
41}
42
43pub trait AnyAsyncResponse: Any + Send + Sync + 'static {
47 fn describe(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result;
49 fn status(&self) -> u16;
51 fn content_length(&self) -> Option<u64>;
53 fn get_header(&self, header: &str) -> Result<Vec<String>>;
55 fn text(&mut self) -> BoxFuture<Result<String>>;
57 fn bytes(&mut self) -> BoxFuture<Result<Vec<u8>>>;
59}
60
61impl<R> AnyAsyncResponse for R
65where
66 R: AsyncResponse,
67{
68 fn status(&self) -> u16 {
69 AsyncResponse::status(self)
70 }
71
72 fn content_length(&self) -> Option<u64> {
73 AsyncResponse::content_length(self)
74 }
75
76 fn get_header(&self, header: &str) -> Result<Vec<String>> {
77 AsyncResponse::get_header(self, header)
78 }
79
80 fn text(&mut self) -> BoxFuture<Result<String>> {
81 Box::pin(AsyncResponse::text(self))
82 }
83
84 fn bytes(&mut self) -> BoxFuture<Result<Vec<u8>>> {
85 Box::pin(AsyncResponse::bytes(self))
86 }
87
88 fn describe(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
89 AsyncResponse::describe(self, f)
90 }
91}
92
93impl<A> AnyAsyncBackend for A
94where
95 A: super::backend::AsyncBackend,
96 A::AsyncClient: super::backend::AsyncClient,
97{
98 fn create_async_client(
99 &self,
100 options: ClientOptions,
101 ) -> BoxFuture<BuildClientResult<Box<dyn AnyAsyncClient>>> {
102 Box::pin(async {
103 super::backend::AsyncBackend::create_async_client(self, options)
104 .await
105 .map(|client| Box::new(client) as Box<dyn AnyAsyncClient>)
106 }) as _
107 }
108}
109
110impl<A> AnyAsyncClient for A
111where
112 A: super::backend::AsyncClient,
113{
114 fn describe(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
115 super::backend::AsyncClient::describe(self, f)
116 }
117
118 fn clone_boxed(&self) -> Box<dyn AnyAsyncClient> {
119 Box::new(self.clone())
120 }
121
122 fn request(&self, req: Request) -> BoxFuture<Result<Box<dyn AnyAsyncResponse>>> {
123 Box::pin(async {
124 self.request(req)
125 .await
126 .map(|res| Box::new(res) as Box<dyn AnyAsyncResponse>)
127 }) as _
128 }
129}