This repository has been archived by the owner on Feb 4, 2021. It is now read-only.
forked from hyperium/tonic
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
chore(examples): add helloworld-client-blocking (hyperium#179)
Add an example of using a tonic client in a synchronous environment.
- Loading branch information
1 parent
a6f18b3
commit d79826c
Showing
2 changed files
with
60 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
use tokio::runtime::{Builder, Runtime}; | ||
|
||
pub mod hello_world { | ||
tonic::include_proto!("helloworld"); | ||
} | ||
|
||
use hello_world::{greeter_client::GreeterClient, HelloReply, HelloRequest}; | ||
|
||
type StdError = Box<dyn std::error::Error + Send + Sync + 'static>; | ||
type Result<T, E = StdError> = ::std::result::Result<T, E>; | ||
|
||
// The order of the fields in this struct is important. The runtime must be the first field and the | ||
// client must be the last field so that when `BlockingClient` is dropped the client is dropped | ||
// before the runtime. Not doing this will result in a deadlock when dropped. | ||
struct BlockingClient { | ||
rt: Runtime, | ||
client: GreeterClient<tonic::transport::Channel>, | ||
} | ||
|
||
impl BlockingClient { | ||
pub fn connect<D>(dst: D) -> Result<Self, tonic::transport::Error> | ||
where | ||
D: std::convert::TryInto<tonic::transport::Endpoint>, | ||
D::Error: Into<StdError>, | ||
{ | ||
let mut rt = Builder::new() | ||
.basic_scheduler() | ||
.enable_all() | ||
.build() | ||
.unwrap(); | ||
let client = rt.block_on(GreeterClient::connect(dst))?; | ||
|
||
Ok(Self { rt, client }) | ||
} | ||
|
||
pub fn say_hello( | ||
&mut self, | ||
request: impl tonic::IntoRequest<HelloRequest>, | ||
) -> Result<tonic::Response<HelloReply>, tonic::Status> { | ||
self.rt.block_on(self.client.say_hello(request)) | ||
} | ||
} | ||
|
||
fn main() -> Result<()> { | ||
let mut client = BlockingClient::connect("http://[::1]:50051")?; | ||
|
||
let request = tonic::Request::new(HelloRequest { | ||
name: "Tonic".into(), | ||
}); | ||
|
||
let response = client.say_hello(request)?; | ||
|
||
println!("RESPONSE={:?}", response); | ||
|
||
Ok(()) | ||
} |