Created
April 19, 2022 00:51
-
-
Save allada/22da52e5935f3158c52a8d120604226b 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
#[derive(Clone, PartialEq, ::prost::Message)] | |
pub struct Bar { | |
#[prost(bytes="bytes", tag="1")] | |
pub bar: ::prost::bytes::Bytes, | |
} | |
/// Generated client implementations. | |
pub mod foo_client { | |
#![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] | |
use tonic::codegen::*; | |
#[derive(Debug, Clone)] | |
pub struct FooClient<T> { | |
inner: tonic::client::Grpc<T>, | |
} | |
impl FooClient<tonic::transport::Channel> { | |
/// Attempt to create a new client by connecting to a given endpoint. | |
pub async fn connect<D>(dst: D) -> Result<Self, tonic::transport::Error> | |
where | |
D: std::convert::TryInto<tonic::transport::Endpoint>, | |
D::Error: Into<StdError>, | |
{ | |
let conn = tonic::transport::Endpoint::new(dst)?.connect().await?; | |
Ok(Self::new(conn)) | |
} | |
} | |
impl<T> FooClient<T> | |
where | |
T: tonic::client::GrpcService<tonic::body::BoxBody>, | |
T::Error: Into<StdError>, | |
T::ResponseBody: Default + Body<Data = Bytes> + Send + 'static, | |
<T::ResponseBody as Body>::Error: Into<StdError> + Send, | |
{ | |
pub fn new(inner: T) -> Self { | |
let inner = tonic::client::Grpc::new(inner); | |
Self { inner } | |
} | |
pub fn with_interceptor<F>( | |
inner: T, | |
interceptor: F, | |
) -> FooClient<InterceptedService<T, F>> | |
where | |
F: tonic::service::Interceptor, | |
T: tonic::codegen::Service< | |
http::Request<tonic::body::BoxBody>, | |
Response = http::Response< | |
<T as tonic::client::GrpcService<tonic::body::BoxBody>>::ResponseBody, | |
>, | |
>, | |
<T as tonic::codegen::Service< | |
http::Request<tonic::body::BoxBody>, | |
>>::Error: Into<StdError> + Send + Sync, | |
{ | |
FooClient::new(InterceptedService::new(inner, interceptor)) | |
} | |
/// Compress requests with `gzip`. | |
/// | |
/// This requires the server to support it otherwise it might respond with an | |
/// error. | |
#[must_use] | |
pub fn send_gzip(mut self) -> Self { | |
self.inner = self.inner.send_gzip(); | |
self | |
} | |
/// Enable decompressing responses with `gzip`. | |
#[must_use] | |
pub fn accept_gzip(mut self) -> Self { | |
self.inner = self.inner.accept_gzip(); | |
self | |
} | |
pub async fn foo( | |
&mut self, | |
request: impl tonic::IntoRequest< | |
super::super::super::super::super::google::protobuf::Empty, | |
>, | |
) -> Result< | |
tonic::Response< | |
super::super::super::super::super::google::protobuf::Empty, | |
>, | |
tonic::Status, | |
> { | |
self.inner | |
.ready() | |
.await | |
.map_err(|e| { | |
tonic::Status::new( | |
tonic::Code::Unknown, | |
format!("Service was not ready: {}", e.into()), | |
) | |
})?; | |
let codec = tonic::codec::ProstCodec::default(); | |
let path = http::uri::PathAndQuery::from_static( | |
"/blah.Foo/Foo", | |
); | |
self.inner.unary(request.into_request(), path, codec).await | |
} | |
} | |
} | |
/// Generated server implementations. | |
pub mod foo_server { | |
#![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] | |
use tonic::codegen::*; | |
///Generated trait containing gRPC methods that should be implemented for use with FooServer. | |
#[async_trait] | |
pub trait Foo: Send + Sync + 'static { | |
async fn foo( | |
&self, | |
request: tonic::Request< | |
super::super::super::super::super::google::protobuf::Empty, | |
>, | |
) -> Result< | |
tonic::Response< | |
super::super::super::super::super::google::protobuf::Empty, | |
>, | |
tonic::Status, | |
>; | |
} | |
#[derive(Debug)] | |
pub struct FooServer<T: Foo> { | |
inner: _Inner<T>, | |
accept_compression_encodings: (), | |
send_compression_encodings: (), | |
} | |
struct _Inner<T>(Arc<T>); | |
impl<T: Foo> FooServer<T> { | |
pub fn new(inner: T) -> Self { | |
Self::from_arc(Arc::new(inner)) | |
} | |
pub fn from_arc(inner: Arc<T>) -> Self { | |
let inner = _Inner(inner); | |
Self { | |
inner, | |
accept_compression_encodings: Default::default(), | |
send_compression_encodings: Default::default(), | |
} | |
} | |
pub fn with_interceptor<F>( | |
inner: T, | |
interceptor: F, | |
) -> InterceptedService<Self, F> | |
where | |
F: tonic::service::Interceptor, | |
{ | |
InterceptedService::new(Self::new(inner), interceptor) | |
} | |
} | |
impl<T, B> tonic::codegen::Service<http::Request<B>> for FooServer<T> | |
where | |
T: Foo, | |
B: Body + Send + 'static, | |
B::Error: Into<StdError> + Send + 'static, | |
{ | |
type Response = http::Response<tonic::body::BoxBody>; | |
type Error = std::convert::Infallible; | |
type Future = BoxFuture<Self::Response, Self::Error>; | |
fn poll_ready( | |
&mut self, | |
_cx: &mut Context<'_>, | |
) -> Poll<Result<(), Self::Error>> { | |
Poll::Ready(Ok(())) | |
} | |
fn call(&mut self, req: http::Request<B>) -> Self::Future { | |
let inner = self.inner.clone(); | |
match req.uri().path() { | |
"/blah.Foo/Foo" => { | |
#[allow(non_camel_case_types)] | |
struct FooSvc<T: Foo>(pub Arc<T>); | |
impl< | |
T: Foo, | |
> tonic::server::UnaryService< | |
super::super::super::super::super::google::protobuf::Empty, | |
> for FooSvc<T> { | |
type Response = super::super::super::super::super::google::protobuf::Empty; | |
type Future = BoxFuture< | |
tonic::Response<Self::Response>, | |
tonic::Status, | |
>; | |
fn call( | |
&mut self, | |
request: tonic::Request< | |
super::super::super::super::super::google::protobuf::Empty, | |
>, | |
) -> Self::Future { | |
let inner = self.0.clone(); | |
let fut = async move { (*inner).foo(request).await }; | |
Box::pin(fut) | |
} | |
} | |
let accept_compression_encodings = self.accept_compression_encodings; | |
let send_compression_encodings = self.send_compression_encodings; | |
let inner = self.inner.clone(); | |
let fut = async move { | |
let inner = inner.0; | |
let method = FooSvc(inner); | |
let codec = tonic::codec::ProstCodec::default(); | |
let mut grpc = tonic::server::Grpc::new(codec) | |
.apply_compression_config( | |
accept_compression_encodings, | |
send_compression_encodings, | |
); | |
let res = grpc.unary(method, req).await; | |
Ok(res) | |
}; | |
Box::pin(fut) | |
} | |
_ => { | |
Box::pin(async move { | |
Ok( | |
http::Response::builder() | |
.status(200) | |
.header("grpc-status", "12") | |
.header("content-type", "application/grpc") | |
.body(empty_body()) | |
.unwrap(), | |
) | |
}) | |
} | |
} | |
} | |
} | |
impl<T: Foo> Clone for FooServer<T> { | |
fn clone(&self) -> Self { | |
let inner = self.inner.clone(); | |
Self { | |
inner, | |
accept_compression_encodings: self.accept_compression_encodings, | |
send_compression_encodings: self.send_compression_encodings, | |
} | |
} | |
} | |
impl<T: Foo> Clone for _Inner<T> { | |
fn clone(&self) -> Self { | |
Self(self.0.clone()) | |
} | |
} | |
impl<T: std::fmt::Debug> std::fmt::Debug for _Inner<T> { | |
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { | |
write!(f, "{:?}", self.0) | |
} | |
} | |
impl<T: Foo> tonic::transport::NamedService for FooServer<T> { | |
const NAME: &'static str = "blah.Foo"; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment