Created
July 16, 2019 10:45
-
-
Save ian-p-cooke/acf066570810ad0f5e16b30a0e4b70ca to your computer and use it in GitHub Desktop.
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
#![deny(warnings, rust_2018_idioms)] | |
use futures::Future; | |
use hyper::client::connect::{Destination, HttpConnector}; | |
use tower_grpc::Request; | |
use tower_hyper::{client, util}; | |
use tower_util::MakeService; | |
use std::error::Error; | |
pub mod hello_world { | |
include!(concat!(env!("OUT_DIR"), "/helloworld.rs")); | |
} | |
//What is the correct return type here? | |
fn make_client(uri: http::Uri) -> Result<Box<dyn Future<Item=hello_world::client::Greeter<Box<dyn tower_grpc::codegen::client::grpc::GrpcService<(), ResponseBody=(), Future=(), Error=()>>>, Error=tower_grpc::Status> + Send>, Box<dyn Error>> { | |
let dst = Destination::try_from_uri(uri.clone())?; | |
let connector = util::Connector::new(HttpConnector::new(4)); | |
let settings = client::Builder::new().http2_only(true).clone(); | |
let mut make_client = client::Connect::with_builder(connector, settings); | |
let say_hello = make_client | |
.make_service(dst) | |
.map_err(|e| panic!("connect error: {:?}", e)) | |
.and_then(move |conn| { | |
use crate::hello_world::client::Greeter; | |
let conn = tower_request_modifier::Builder::new() | |
.set_origin(uri) | |
.build(conn) | |
.unwrap(); | |
// Wait until the client is ready... | |
Greeter::new(Box::new(conn)).ready() | |
}); | |
Ok(Box::new(say_hello)) | |
} | |
pub fn main() -> Result<(), Box<dyn Error>> { | |
let _ = ::env_logger::init(); | |
let uri: http::Uri = format!("http://[::1]:50051").parse()?; | |
let say_hello = make_client(uri)? | |
.and_then(|mut client| { | |
use crate::hello_world::HelloRequest; | |
client.say_hello(Request::new(HelloRequest { | |
name: "What is in a name?".to_string(), | |
})) | |
}) | |
.and_then(|response| { | |
println!("RESPONSE = {:?}", response); | |
Ok(()) | |
}) | |
.map_err(|e| { | |
println!("ERR = {:?}", e); | |
}); | |
tokio::run(say_hello); | |
Ok(()) | |
} | |
// Compiling tower-grpc-examples v0.1.0 (C:\Users\ipc\CLionProjects\tower-grpc\tower-grpc-examples) | |
// error[E0271]: type mismatch resolving `<futures::future::and_then::AndThen<futures::future::map_err::MapErr<tower_hyper::client::connect::ConnectFuture<hyper::client::connect::Destination, _, tower_hyper::util::Connector<hyper::client::connect::http::HttpConnector>, tokio_executor::global::DefaultExecutor>, [closure@tower-grpc-examples\src/helloworld/client.rs:23:18: 23:54]>, impl futures::future::Future, [closure@tower-grpc-examples\src/helloworld/client.rs:24:19: 34:10 uri:_]> as futures::future::Future>::Item == hello_world::client::Greeter<std::boxed::Box<dyn tower_grpc::generic::client::GrpcService<(), Error = (), Future = (), ResponseBody = ()>>>` | |
// --> tower-grpc-examples\src/helloworld/client.rs:35:8 | |
// | | |
// 35 | Ok(Box::new(say_hello)) | |
// | ^^^^^^^^^^^^^^^^^^^ expected struct `tower_request_modifier::RequestModifier`, found trait tower_grpc::generic::client::GrpcService | |
// | | |
// = note: expected type `hello_world::client::Greeter<std::boxed::Box<tower_request_modifier::RequestModifier<tower_hyper::client::connection::Connection<_>, _>>>` | |
// found type `hello_world::client::Greeter<std::boxed::Box<dyn tower_grpc::generic::client::GrpcService<(), Error = (), Future = (), ResponseBody = ()>>>` | |
// = note: required for the cast to the object type `dyn futures::future::Future<Error = tower_grpc::status::Status, Item = hello_world::client::Greeter<std::boxed::Box<dyn tower_grpc::generic::client::GrpcService<(), Error = (), Future = (), ResponseBody = ()>>>> + std::marker::Send` | |
// error[E0599]: no method named `say_hello` found for type `hello_world::client::Greeter<std::boxed::Box<dyn tower_grpc::generic::client::GrpcService<(), Error = (), Future = (), ResponseBody = ()>>>` in the current scope | |
// --> tower-grpc-examples\src/helloworld/client.rs:47:20 | |
// | | |
// 47 | client.say_hello(Request::new(HelloRequest { | |
// | ^^^^^^^^^ | |
// | | |
// ::: C:\Users\icooke\CLionProjects\tower-grpc\target\debug\build\tower-grpc-examples-7f408b4977dc8e0d\out/helloworld.rs:19:5 | |
// | | |
// 19 | pub struct Greeter<T> { | |
// | --------------------- method `say_hello` not found for this | |
// | | |
// = help: items from traits can only be used if the trait is implemented and in scope | |
// = note: the following trait defines an item `say_hello`, perhaps you need to implement it: | |
// candidate #1: `hello_world::server::Greeter` | |
// error: aborting due to 2 previous errors | |
// Some errors have detailed explanations: E0271, E0599. | |
// For more information about an error, try `rustc --explain E0271`. | |
// error: Could not compile `tower-grpc-examples`. | |
// To learn more, run the command again with --verbose. |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment