Skip to content

Commit 7292f1e

Browse files
committed
Keep going
1 parent 49a738d commit 7292f1e

File tree

5 files changed

+32
-12
lines changed

5 files changed

+32
-12
lines changed

crates/twirp-build/src/lib.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -175,14 +175,11 @@ impl prost_build::ServiceGenerator for ServiceGenerator {
175175
async fn #name(&self, req: #input_type) -> Result<#output_type, twirp::ClientError>;
176176
});
177177
client_trait_methods.push(quote! {
178-
fn #name_request(&self, req: #input_type) -> Result<twirp::RequestBuilder<#input_type, #output_type>, twirp::ClientError>;
179-
});
180-
181-
client_methods.push(quote! {
182178
fn #name_request(&self, req: #input_type) -> Result<twirp::RequestBuilder<#input_type, #output_type>, twirp::ClientError> {
183179
self.request(#request_path, req)
184180
}
185181
});
182+
186183
client_methods.push(quote! {
187184
async fn #name(&self, req: #input_type) -> Result<#output_type, twirp::ClientError> {
188185
self.#name_request(req)?.send().await
@@ -191,7 +188,7 @@ impl prost_build::ServiceGenerator for ServiceGenerator {
191188
}
192189
let client_trait = quote! {
193190
#[twirp::async_trait::async_trait]
194-
pub trait #client_name: Send + Sync {
191+
pub trait #client_name: twirp::TwirpRequest + Send + Sync {
195192
#(#client_trait_methods)*
196193
}
197194

crates/twirp/src/client.rs

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -146,8 +146,6 @@ impl Client {
146146
&self.inner.base_url
147147
}
148148

149-
// TODO: Move this to the `ClientBuilder`
150-
//
151149
/// Creates a new `twirp::Client` with the same configuration as the current
152150
/// one, but with a different host in the base URL.
153151
pub fn with_host(&self, host: &str) -> Self {
@@ -195,9 +193,10 @@ impl Client {
195193
}),
196194
}
197195
}
196+
}
198197

199-
// Start building a request...
200-
pub fn request<I, O>(&self, path: &str, body: I) -> Result<RequestBuilder<I, O>>
198+
impl TwirpRequest for Client {
199+
fn request<I, O>(&self, path: &str, body: I) -> Result<RequestBuilder<I, O>>
201200
where
202201
I: prost::Message,
203202
O: prost::Message + Default,
@@ -216,6 +215,13 @@ impl Client {
216215
}
217216
}
218217

218+
pub trait TwirpRequest {
219+
fn request<I, O>(&self, path: &str, body: I) -> Result<RequestBuilder<I, O>>
220+
where
221+
I: prost::Message,
222+
O: prost::Message + Default;
223+
}
224+
219225
pub struct RequestBuilder<I, O>
220226
where
221227
O: prost::Message + Default,
@@ -239,6 +245,7 @@ where
239245
}
240246
}
241247

248+
/// Add a `Header` to this Request.
242249
pub fn header<K, V>(mut self, key: K, value: V) -> RequestBuilder<I, O>
243250
where
244251
HeaderName: TryFrom<K>,

crates/twirp/src/lib.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@ pub mod test;
1010
#[doc(hidden)]
1111
pub mod details;
1212

13-
pub use client::{Client, ClientBuilder, ClientError, Middleware, Next, RequestBuilder, Result};
13+
pub use client::{
14+
Client, ClientBuilder, ClientError, Middleware, Next, RequestBuilder, Result, TwirpRequest,
15+
};
1416
pub use context::Context;
1517
pub use error::*; // many constructors like `invalid_argument()`
1618
pub use http::Extensions;

crates/twirp/src/test.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use tokio::time::Instant;
1313

1414
use crate::details::TwirpRouterBuilder;
1515
use crate::server::Timings;
16-
use crate::{error, Client, Context, Result, TwirpErrorResponse};
16+
use crate::{error, Client, Context, Result, TwirpErrorResponse, TwirpRequest};
1717

1818
pub async fn run_test_server(port: u16) -> JoinHandle<Result<(), std::io::Error>> {
1919
let router = test_api_router();

example/src/bin/client.rs

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use twirp::async_trait::async_trait;
22
use twirp::client::{Client, ClientBuilder, Middleware, Next};
33
use twirp::reqwest::{Request, Response};
44
use twirp::url::Url;
5-
use twirp::GenericError;
5+
use twirp::{GenericError, RequestBuilder, TwirpRequest};
66

77
pub mod service {
88
pub mod haberdash {
@@ -85,6 +85,20 @@ impl Middleware for PrintResponseHeaders {
8585
#[derive(Debug)]
8686
struct MockHaberdasherApiClient;
8787

88+
impl TwirpRequest for MockHaberdasherApiClient {
89+
fn request<I, O>(
90+
&self,
91+
_path: &str,
92+
_body: I,
93+
) -> Result<RequestBuilder<I, O>, twirp::ClientError>
94+
where
95+
I: prost::Message,
96+
O: prost::Message + Default,
97+
{
98+
todo!()
99+
}
100+
}
101+
88102
#[async_trait]
89103
impl HaberdasherApiClient for MockHaberdasherApiClient {
90104
fn make_hat_request(

0 commit comments

Comments
 (0)