Skip to main content

wtx/grpc/
grpc_manager.rs

1use crate::{
2  collection::Vector,
3  de::{
4    Decode, Encode,
5    format::{De, DecodeWrapper},
6    protocol::{VerbatimDecoder, VerbatimEncoder},
7  },
8  grpc::{GrpcStatusCode, serialize},
9};
10
11/// Responsible for managing internal structures that interact with gRPC.
12#[derive(Debug)]
13pub struct GrpcManager<DRSR> {
14  drsr: DRSR,
15  status_code: GrpcStatusCode,
16}
17
18impl<DRSR> GrpcManager<DRSR> {
19  /// From Deserializer/Serializer
20  ///
21  /// Instance has an initial [`GrpcStatusCode::Ok`] that can be modified in endpoints.
22  #[inline]
23  pub const fn from_drsr(drsr: DRSR) -> Self {
24    Self { drsr, status_code: GrpcStatusCode::Ok }
25  }
26
27  /// Deserialize From Request Bytes.
28  #[inline]
29  pub fn des_from_req_bytes<'de, T>(&mut self, bytes: &mut &'de [u8]) -> crate::Result<T>
30  where
31    VerbatimEncoder<T>: Decode<'de, De<DRSR>>,
32  {
33    let elem = if let [_, _, _, _, _, elem @ ..] = bytes { elem } else { &[] };
34    Ok(VerbatimEncoder::decode(&mut DecodeWrapper::new(elem))?.data)
35  }
36
37  /// Serialize to Response Bytes
38  #[inline]
39  pub fn ser_to_res_bytes<T>(&mut self, bytes: &mut Vector<u8>, data: T) -> crate::Result<()>
40  where
41    VerbatimDecoder<T>: Encode<De<DRSR>>,
42  {
43    serialize(bytes, VerbatimDecoder { data }, &mut self.drsr)
44  }
45
46  /// Allows the modification of a gRPC response status.
47  #[inline]
48  pub const fn status_code_mut(&mut self) -> &mut GrpcStatusCode {
49    &mut self.status_code
50  }
51}
52
53#[cfg(feature = "grpc-server")]
54impl<DRSR> crate::http::server_framework::StreamAux for GrpcManager<DRSR>
55where
56  DRSR: Default,
57{
58  type Init = DRSR;
59
60  #[inline]
61  fn stream_aux(init: Self::Init) -> crate::Result<Self> {
62    Ok(GrpcManager::from_drsr(init))
63  }
64}