Skip to content

Commit 158d322

Browse files
committed
Add a client runtime
1 parent 3531a13 commit 158d322

File tree

6 files changed

+159
-113
lines changed

6 files changed

+159
-113
lines changed

conjure-codegen/src/lib.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -206,9 +206,9 @@
206206
//! ```
207207
//! use conjure_http::client::Service;
208208
//! # use conjure_codegen::example_types::clients::another::{TestService, TestServiceClient};
209-
//! # fn foo<T: conjure_http::client::Client>(http_client: T) -> Result<(), conjure_error::Error> {
209+
//! # fn foo<T: conjure_http::client::Client>(http_client: T, runtime: &std::sync::Arc<conjure_http::client::ConjureRuntime>) -> Result<(), conjure_error::Error> {
210210
//! # let auth_token = "foobar".parse().unwrap();
211-
//! let client = TestServiceClient::new(http_client);
211+
//! let client = TestServiceClient::new(http_client, runtime);
212212
//! let file_systems = client.get_file_systems(&auth_token)?;
213213
//! # Ok(())
214214
//! # }
@@ -218,9 +218,9 @@
218218
//! ```
219219
//! use conjure_http::client::AsyncService;
220220
//! # use conjure_codegen::example_types::clients::another::{AsyncTestService, AsyncTestServiceClient};
221-
//! # async fn foo<T>(http_client: T) -> Result<(), conjure_error::Error> where T: conjure_http::client::AsyncClient + Sync + Send, T::ResponseBody: 'static + Send {
221+
//! # async fn foo<T>(http_client: T, runtime: &std::sync::Arc<conjure_http::client::ConjureRuntime>) -> Result<(), conjure_error::Error> where T: conjure_http::client::AsyncClient + Sync + Send, T::ResponseBody: 'static + Send {
222222
//! # let auth_token = "foobar".parse().unwrap();
223-
//! let client = AsyncTestServiceClient::new(http_client);
223+
//! let client = AsyncTestServiceClient::new(http_client, runtime);
224224
//! let file_systems = client.get_file_systems(&auth_token).await?;
225225
//! # Ok(())
226226
//! # }

conjure-http/src/client/conjure.rs

Lines changed: 51 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ use crate::private::APPLICATION_OCTET_STREAM;
2727

2828
use super::{
2929
AsyncDeserializeResponse, AsyncRequestBody, AsyncSerializeRequest, AsyncWriteBody,
30-
BoxAsyncWriteBody, DeserializeResponse, EncodeHeader, EncodeParam, RequestBody,
30+
BoxAsyncWriteBody, ConjureRuntime, DeserializeResponse, EncodeHeader, EncodeParam, RequestBody,
3131
SerializeRequest, StdResponseDeserializer, WriteBody,
3232
};
3333

@@ -38,11 +38,11 @@ impl<'a, T, R> SerializeRequest<'a, T, R> for BinaryRequestSerializer
3838
where
3939
T: WriteBody<R> + 'a,
4040
{
41-
fn content_type(_: &T) -> HeaderValue {
41+
fn content_type(_: &ConjureRuntime, _: &T) -> HeaderValue {
4242
APPLICATION_OCTET_STREAM
4343
}
4444

45-
fn serialize(value: T) -> Result<RequestBody<'a, R>, Error> {
45+
fn serialize(_: &ConjureRuntime, value: T) -> Result<RequestBody<'a, R>, Error> {
4646
Ok(RequestBody::Streaming(Box::new(value)))
4747
}
4848
}
@@ -51,11 +51,11 @@ impl<'a, T, R> AsyncSerializeRequest<'a, T, R> for BinaryRequestSerializer
5151
where
5252
T: AsyncWriteBody<R> + Send + 'a,
5353
{
54-
fn content_type(_: &T) -> HeaderValue {
54+
fn content_type(_: &ConjureRuntime, _: &T) -> HeaderValue {
5555
APPLICATION_OCTET_STREAM
5656
}
5757

58-
fn serialize(value: T) -> Result<AsyncRequestBody<'a, R>, Error> {
58+
fn serialize(_: &ConjureRuntime, value: T) -> Result<AsyncRequestBody<'a, R>, Error> {
5959
Ok(AsyncRequestBody::Streaming(BoxAsyncWriteBody::new(value)))
6060
}
6161
}
@@ -68,16 +68,16 @@ where
6868
T: DeserializeOwned + Default,
6969
R: Iterator<Item = Result<Bytes, Error>>,
7070
{
71-
fn accept() -> Option<HeaderValue> {
72-
<StdResponseDeserializer as DeserializeResponse<T, R>>::accept()
71+
fn accept(runtime: &ConjureRuntime) -> Option<HeaderValue> {
72+
<StdResponseDeserializer as DeserializeResponse<T, R>>::accept(runtime)
7373
}
7474

75-
fn deserialize(response: Response<R>) -> Result<T, Error> {
75+
fn deserialize(runtime: &ConjureRuntime, response: Response<R>) -> Result<T, Error> {
7676
if response.status() == StatusCode::NO_CONTENT {
7777
return Ok(T::default());
7878
}
7979

80-
<StdResponseDeserializer as DeserializeResponse<T, R>>::deserialize(response)
80+
<StdResponseDeserializer as DeserializeResponse<T, R>>::deserialize(runtime, response)
8181
}
8282
}
8383

@@ -86,28 +86,29 @@ where
8686
T: DeserializeOwned + Default,
8787
R: Stream<Item = Result<Bytes, Error>> + Send,
8888
{
89-
fn accept() -> Option<HeaderValue> {
90-
<StdResponseDeserializer as AsyncDeserializeResponse<T, R>>::accept()
89+
fn accept(runtime: &ConjureRuntime) -> Option<HeaderValue> {
90+
<StdResponseDeserializer as AsyncDeserializeResponse<T, R>>::accept(runtime)
9191
}
9292

93-
async fn deserialize(response: Response<R>) -> Result<T, Error> {
93+
async fn deserialize(runtime: &ConjureRuntime, response: Response<R>) -> Result<T, Error> {
9494
if response.status() == StatusCode::NO_CONTENT {
9595
return Ok(T::default());
9696
}
9797

98-
<StdResponseDeserializer as AsyncDeserializeResponse<T, R>>::deserialize(response).await
98+
<StdResponseDeserializer as AsyncDeserializeResponse<T, R>>::deserialize(runtime, response)
99+
.await
99100
}
100101
}
101102

102103
/// A body deserializer for binary types.
103104
pub enum BinaryResponseDeserializer {}
104105

105106
impl<R> DeserializeResponse<R, R> for BinaryResponseDeserializer {
106-
fn accept() -> Option<HeaderValue> {
107+
fn accept(_: &ConjureRuntime) -> Option<HeaderValue> {
107108
Some(APPLICATION_OCTET_STREAM)
108109
}
109110

110-
fn deserialize(response: Response<R>) -> Result<R, Error> {
111+
fn deserialize(_: &ConjureRuntime, response: Response<R>) -> Result<R, Error> {
111112
if response.headers().get(CONTENT_TYPE) != Some(&APPLICATION_OCTET_STREAM) {
112113
return Err(Error::internal_safe("invalid response Content-Type"));
113114
}
@@ -120,11 +121,11 @@ impl<R> AsyncDeserializeResponse<R, R> for BinaryResponseDeserializer
120121
where
121122
R: Send,
122123
{
123-
fn accept() -> Option<HeaderValue> {
124+
fn accept(_: &ConjureRuntime) -> Option<HeaderValue> {
124125
Some(APPLICATION_OCTET_STREAM)
125126
}
126127

127-
async fn deserialize(response: Response<R>) -> Result<R, Error> {
128+
async fn deserialize(_: &ConjureRuntime, response: Response<R>) -> Result<R, Error> {
128129
if response.headers().get(CONTENT_TYPE) != Some(&APPLICATION_OCTET_STREAM) {
129130
return Err(Error::internal_safe("invalid response Content-Type"));
130131
}
@@ -137,35 +138,41 @@ where
137138
pub enum OptionalBinaryResponseDeserializer {}
138139

139140
impl<R> DeserializeResponse<Option<R>, R> for OptionalBinaryResponseDeserializer {
140-
fn accept() -> Option<HeaderValue> {
141-
<BinaryResponseDeserializer as DeserializeResponse<R, R>>::accept()
141+
fn accept(runtime: &ConjureRuntime) -> Option<HeaderValue> {
142+
<BinaryResponseDeserializer as DeserializeResponse<R, R>>::accept(runtime)
142143
}
143144

144-
fn deserialize(response: Response<R>) -> Result<Option<R>, Error> {
145+
fn deserialize(runtime: &ConjureRuntime, response: Response<R>) -> Result<Option<R>, Error> {
145146
if response.status() == StatusCode::NO_CONTENT {
146147
return Ok(None);
147148
}
148149

149-
<BinaryResponseDeserializer as DeserializeResponse<R, R>>::deserialize(response).map(Some)
150+
<BinaryResponseDeserializer as DeserializeResponse<R, R>>::deserialize(runtime, response)
151+
.map(Some)
150152
}
151153
}
152154

153155
impl<R> AsyncDeserializeResponse<Option<R>, R> for OptionalBinaryResponseDeserializer
154156
where
155157
R: Send,
156158
{
157-
fn accept() -> Option<HeaderValue> {
158-
<BinaryResponseDeserializer as DeserializeResponse<R, R>>::accept()
159+
fn accept(runtime: &ConjureRuntime) -> Option<HeaderValue> {
160+
<BinaryResponseDeserializer as DeserializeResponse<R, R>>::accept(runtime)
159161
}
160162

161-
async fn deserialize(response: Response<R>) -> Result<Option<R>, Error> {
163+
async fn deserialize(
164+
runtime: &ConjureRuntime,
165+
response: Response<R>,
166+
) -> Result<Option<R>, Error> {
162167
if response.status() == StatusCode::NO_CONTENT {
163168
return Ok(None);
164169
}
165170

166-
<BinaryResponseDeserializer as AsyncDeserializeResponse<R, R>>::deserialize(response)
167-
.await
168-
.map(Some)
171+
<BinaryResponseDeserializer as AsyncDeserializeResponse<R, R>>::deserialize(
172+
runtime, response,
173+
)
174+
.await
175+
.map(Some)
169176
}
170177
}
171178

@@ -176,16 +183,18 @@ impl<R> DeserializeResponse<(), R> for EmptyResponseDeserializer
176183
where
177184
R: Iterator<Item = Result<Bytes, Error>>,
178185
{
179-
fn accept() -> Option<HeaderValue> {
180-
<StdResponseDeserializer as DeserializeResponse<(), R>>::accept()
186+
fn accept(runtime: &ConjureRuntime) -> Option<HeaderValue> {
187+
<StdResponseDeserializer as DeserializeResponse<(), R>>::accept(runtime)
181188
}
182189

183-
fn deserialize(response: Response<R>) -> Result<(), Error> {
190+
fn deserialize(runtime: &ConjureRuntime, response: Response<R>) -> Result<(), Error> {
184191
if response.status() == StatusCode::NO_CONTENT {
185192
return Ok(());
186193
}
187194

188-
<StdResponseDeserializer as DeserializeResponse<IgnoredAny, R>>::deserialize(response)?;
195+
<StdResponseDeserializer as DeserializeResponse<IgnoredAny, R>>::deserialize(
196+
runtime, response,
197+
)?;
189198

190199
Ok(())
191200
}
@@ -195,17 +204,19 @@ impl<R> AsyncDeserializeResponse<(), R> for EmptyResponseDeserializer
195204
where
196205
R: Stream<Item = Result<Bytes, Error>> + Send,
197206
{
198-
fn accept() -> Option<HeaderValue> {
199-
<StdResponseDeserializer as AsyncDeserializeResponse<(), R>>::accept()
207+
fn accept(runtime: &ConjureRuntime) -> Option<HeaderValue> {
208+
<StdResponseDeserializer as AsyncDeserializeResponse<(), R>>::accept(runtime)
200209
}
201210

202-
async fn deserialize(response: Response<R>) -> Result<(), Error> {
211+
async fn deserialize(runtime: &ConjureRuntime, response: Response<R>) -> Result<(), Error> {
203212
if response.status() == StatusCode::NO_CONTENT {
204213
return Ok(());
205214
}
206215

207-
<StdResponseDeserializer as AsyncDeserializeResponse<IgnoredAny, R>>::deserialize(response)
208-
.await?;
216+
<StdResponseDeserializer as AsyncDeserializeResponse<IgnoredAny, R>>::deserialize(
217+
runtime, response,
218+
)
219+
.await?;
209220

210221
Ok(())
211222
}
@@ -218,7 +229,7 @@ impl<T> EncodeParam<T> for PlainEncoder
218229
where
219230
T: Plain,
220231
{
221-
fn encode(value: T) -> Result<Vec<String>, Error> {
232+
fn encode(_: &ConjureRuntime, value: T) -> Result<Vec<String>, Error> {
222233
Ok(vec![value.to_plain()])
223234
}
224235
}
@@ -227,7 +238,7 @@ impl<T> EncodeHeader<T> for PlainEncoder
227238
where
228239
T: Plain,
229240
{
230-
fn encode(value: T) -> Result<Vec<HeaderValue>, Error> {
241+
fn encode(_: &ConjureRuntime, value: T) -> Result<Vec<HeaderValue>, Error> {
231242
HeaderValue::try_from(value.to_plain())
232243
.map_err(Error::internal_safe)
233244
.map(|v| vec![v])
@@ -242,7 +253,7 @@ where
242253
T: IntoIterator<Item = U>,
243254
U: Plain,
244255
{
245-
fn encode(value: T) -> Result<Vec<String>, Error> {
256+
fn encode(_: &ConjureRuntime, value: T) -> Result<Vec<String>, Error> {
246257
Ok(value.into_iter().map(|v| v.to_plain()).collect())
247258
}
248259
}
@@ -252,7 +263,7 @@ where
252263
T: IntoIterator<Item = U>,
253264
U: Plain,
254265
{
255-
fn encode(value: T) -> Result<Vec<HeaderValue>, Error> {
266+
fn encode(_: &ConjureRuntime, value: T) -> Result<Vec<HeaderValue>, Error> {
256267
value
257268
.into_iter()
258269
.map(|v| HeaderValue::try_from(v.to_plain()).map_err(Error::internal_safe))

0 commit comments

Comments
 (0)