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#[derive(Debug)]
13pub struct GrpcManager<DRSR> {
14 drsr: DRSR,
15 status_code: GrpcStatusCode,
16}
17
18impl<DRSR> GrpcManager<DRSR> {
19 #[inline]
23 pub const fn from_drsr(drsr: DRSR) -> Self {
24 Self { drsr, status_code: GrpcStatusCode::Ok }
25 }
26
27 #[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 #[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 #[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}