// @generated by protoc-gen-roto — do not edit #[allow(unused_imports)] use roto_runtime::{ProtoAccessor, ProtoBuilder, Result, RotoError, read_varint, RepeatedFieldIterator}; use std::str; use bytes::{Bytes, BytesMut, Buf, BufMut}; use tonic::{Request, Response, Status}; use tokio_stream::Stream; use std::pin::Pin; use std::sync::Arc; use std::task::{Context, Poll}; use std::future::Future; use tonic::body::BoxBody; use tower::Service; use futures_util::StreamExt; use http_body_util::BodyExt; use http_body::Body; use roto_tonic::{BufferPool, StatusBody}; pub struct HelloRequest<'a> { accessor: roto_runtime::ProtoAccessor<'a>, name_offset: Option, } impl<'a> HelloRequest<'a> { pub fn new(data: &'a [u8]) -> roto_runtime::Result { let accessor = roto_runtime::ProtoAccessor::new(data)?; let mut name_offset = None; for item in accessor.fields() { let (offset, tag, _) = item?; if tag.field_number == 1 { name_offset = Some(offset); } } Ok(Self { accessor, name_offset, }) } pub fn name(&self) -> roto_runtime::Result<&'a str> { let offset = self.name_offset.ok_or(roto_runtime::RotoError::FieldNotFound)?; let (bytes, _) = self.accessor.get_value_at(offset)?; str::from_utf8(bytes).map_err(|_| roto_runtime::RotoError::WireFormatViolation) } pub fn name_or_default(&self) -> roto_runtime::Result<&'a str> { self.name().or(Ok("")) } pub fn has_name(&self) -> bool { self.name_offset.is_some() } pub fn raw_fields(&self) -> roto_runtime::RawFieldIterator<'a> { self.accessor.raw_fields() } } pub struct HelloRequestBuilder<'b> { builder: roto_runtime::ProtoBuilder<'b>, name_written: bool, } impl<'b> HelloRequestBuilder<'b> { pub fn builder(buf: &mut [u8]) -> HelloRequestBuilder<'_> { HelloRequestBuilder { builder: roto_runtime::ProtoBuilder::new(buf), name_written: false, } } pub fn name(mut self, value: &str) -> roto_runtime::Result { self.builder.write_string(1, value)?; self.name_written = true; Ok(self) } pub fn with(mut self, msg: &HelloRequest<'_>) -> roto_runtime::Result { for item in msg.raw_fields() { let (field_number, raw_bytes) = item?; let is_written = match field_number { 1 => self.name_written, _ => false, }; if !is_written { self.builder.write_raw(raw_bytes)?; } } Ok(self) } pub fn finish(self) -> roto_runtime::Result<&'b mut [u8]> { self.builder.finish() } } pub struct OwnedHelloRequest { pub data: bytes::Bytes, } impl roto_runtime::RotoOwned for OwnedHelloRequest { type Reader<'a> = HelloRequest<'a>; fn reader(&self) -> HelloRequest<'_> { HelloRequest::new(&self.data).expect("failed to create reader") } } impl roto_runtime::RotoMessage for OwnedHelloRequest { fn decode(buf: bytes::Bytes) -> roto_runtime::Result { Ok(OwnedHelloRequest { data: buf }) } fn bytes(&self) -> bytes::Bytes { self.data.clone() } } pub struct HelloResponse<'a> { accessor: roto_runtime::ProtoAccessor<'a>, message_offset: Option, } impl<'a> HelloResponse<'a> { pub fn new(data: &'a [u8]) -> roto_runtime::Result { let accessor = roto_runtime::ProtoAccessor::new(data)?; let mut message_offset = None; for item in accessor.fields() { let (offset, tag, _) = item?; if tag.field_number == 1 { message_offset = Some(offset); } } Ok(Self { accessor, message_offset, }) } pub fn message(&self) -> roto_runtime::Result<&'a str> { let offset = self.message_offset.ok_or(roto_runtime::RotoError::FieldNotFound)?; let (bytes, _) = self.accessor.get_value_at(offset)?; str::from_utf8(bytes).map_err(|_| roto_runtime::RotoError::WireFormatViolation) } pub fn message_or_default(&self) -> roto_runtime::Result<&'a str> { self.message().or(Ok("")) } pub fn has_message(&self) -> bool { self.message_offset.is_some() } pub fn raw_fields(&self) -> roto_runtime::RawFieldIterator<'a> { self.accessor.raw_fields() } } pub struct HelloResponseBuilder<'b> { builder: roto_runtime::ProtoBuilder<'b>, message_written: bool, } impl<'b> HelloResponseBuilder<'b> { pub fn builder(buf: &mut [u8]) -> HelloResponseBuilder<'_> { HelloResponseBuilder { builder: roto_runtime::ProtoBuilder::new(buf), message_written: false, } } pub fn message(mut self, value: &str) -> roto_runtime::Result { self.builder.write_string(1, value)?; self.message_written = true; Ok(self) } pub fn with(mut self, msg: &HelloResponse<'_>) -> roto_runtime::Result { for item in msg.raw_fields() { let (field_number, raw_bytes) = item?; let is_written = match field_number { 1 => self.message_written, _ => false, }; if !is_written { self.builder.write_raw(raw_bytes)?; } } Ok(self) } pub fn finish(self) -> roto_runtime::Result<&'b mut [u8]> { self.builder.finish() } } pub struct OwnedHelloResponse { pub data: bytes::Bytes, } impl roto_runtime::RotoOwned for OwnedHelloResponse { type Reader<'a> = HelloResponse<'a>; fn reader(&self) -> HelloResponse<'_> { HelloResponse::new(&self.data).expect("failed to create reader") } } impl roto_runtime::RotoMessage for OwnedHelloResponse { fn decode(buf: bytes::Bytes) -> roto_runtime::Result { Ok(OwnedHelloResponse { data: buf }) } fn bytes(&self) -> bytes::Bytes { self.data.clone() } } #[tonic::async_trait] pub trait HelloWorldService: Send + Sync + 'static { async fn hello_world(&self, request: Request) -> std::result::Result, Status>; } pub struct HelloWorldServiceServer { inner: Arc, pool: Arc, } impl HelloWorldServiceServer { pub fn new(inner: Arc, pool: Arc) -> Self { Self { inner, pool } } } impl tonic::server::NamedService for HelloWorldServiceServer { const NAME: &'static str = "HelloWorldService"; } impl Service> for HelloWorldServiceServer { type Response = http::Response; type Error = std::convert::Infallible; type Future = Pin> + Send>>; fn poll_ready(&mut self, _: &mut Context<'_>) -> Poll> { Poll::Ready(Ok(())) } fn call(&mut self, req: http::Request) -> Self::Future { let inner = self.inner.clone(); let pool = self.pool.clone(); Box::pin(async move { let body = req.into_body(); let mut buf = pool.get(); let mut stream = body; while let Some(frame_result) = stream.frame().await { let frame = frame_result.map_err(|e| { panic!("Body frame error: {}", e); })?; if let Some(data) = frame.data_ref() { buf.put(data.clone()); } } let total_len = buf.len(); let bytes_vec = buf.split_to(total_len).freeze(); pool.put(buf); if bytes_vec.len() < 5 { let res_body = BoxBody::new(StatusBody(Some(Bytes::from_static(&[0, 0, 0, 0, 0])))); return Ok(http::Response::builder().status(200).body(res_body).unwrap()); } let payload = bytes_vec.slice(5..); let path = req.uri().path(); let mut routed = false; if path == "/HelloWorldService/hello_world" { let request_msg = match OwnedHelloRequest::decode(payload) { Ok(msg) => msg, Err(e) => { let res_body = BoxBody::new(StatusBody(Some(Bytes::from_static(&[0, 0, 0, 0, 0])))); return Ok(http::Response::builder().status(200).body(res_body).unwrap()); } }}; let response = match inner.hello_world(Request::new(request_msg)).await { Ok(res) => res, Err(e) => { let res_body = BoxBody::new(StatusBody(Some(Bytes::from_static(&[0, 0, 0, 0, 0])))); return Ok(http::Response::builder().status(200).body(res_body).unwrap()); } }}; let response_msg = response.into_inner(); let response_bytes = response_msg.bytes(); let mut res_buf = pool.get(); res_buf.put_u8(0); let len = response_bytes.len() as u32; res_buf.put_slice(&len.to_be_bytes()); res_buf.put_slice(&response_bytes); let frame_len = res_buf.len(); let frame = res_buf.split_to(frame_len).freeze(); pool.put(res_buf); let res_body = BoxBody::new(StatusBody(Some(frame))); routed = true; return Ok(http::Response::builder().status(200).header("content-type", "application/grpc").body(res_body).unwrap()); } if !routed { let res_body = BoxBody::new(StatusBody(Some(Bytes::from_static(&[0, 0, 0, 0, 0])))); return Ok(http::Response::builder().status(200).body(res_body).unwrap()); } Ok(http::Response::builder().status(200).body(BoxBody::new(StatusBody(None))).unwrap()) }) } }