ergot_base/interface_manager/
framed_stream.rs1use bbq2::{prod_cons::framed::FramedProducer, traits::bbqhdl::BbqHandle};
2use postcard::ser_flavors;
3use serde::Serialize;
4
5use crate::{
6 FrameKind, Key, ProtocolError,
7 interface_manager::wire_frames::{self, CommonHeader},
8};
9
10pub struct Interface<Q>
11where
12 Q: BbqHandle,
13{
14 pub(crate) mtu: u16,
15 pub(crate) prod: FramedProducer<Q, u16>,
16}
17
18#[allow(clippy::result_unit_err)] impl<Q> Interface<Q>
20where
21 Q: BbqHandle,
22{
23 pub fn send_ty<T: Serialize>(
24 &mut self,
25 hdr: &CommonHeader,
26 key: Option<&Key>,
27 body: &T,
28 ) -> Result<(), ()> {
29 let is_err = hdr.kind == FrameKind::PROTOCOL_ERROR.0;
30
31 if is_err {
32 return Err(());
34 }
35 let mut wgr = self.prod.grant(self.mtu)?;
36
37 let ser = ser_flavors::Slice::new(&mut wgr);
38 let used = wire_frames::encode_frame_ty(ser, hdr, key, body).map_err(drop)?;
39 let len = used.len() as u16;
40 wgr.commit(len);
41
42 Ok(())
43 }
44
45 pub fn send_raw(
46 &mut self,
47 hdr: &CommonHeader,
48 key: Option<&Key>,
49 body: &[u8],
50 ) -> Result<(), ()> {
51 let is_err = hdr.kind == FrameKind::PROTOCOL_ERROR.0;
52
53 if is_err {
54 return Err(());
56 }
57 let mut wgr = self.prod.grant(self.mtu)?;
58
59 let ser = ser_flavors::Slice::new(&mut wgr);
60 let used = wire_frames::encode_frame_raw(ser, hdr, key, body).map_err(drop)?;
61 let len = used.len() as u16;
62 wgr.commit(len);
63
64 Ok(())
65 }
66
67 pub fn send_err(&mut self, hdr: &CommonHeader, err: ProtocolError) -> Result<(), ()> {
68 let is_err = hdr.kind == FrameKind::PROTOCOL_ERROR.0;
69
70 if !is_err {
72 return Err(());
74 }
75 let mut wgr = self.prod.grant(self.mtu)?;
76
77 let ser = ser_flavors::Slice::new(&mut wgr);
78 let used = wire_frames::encode_frame_err(ser, hdr, err).map_err(drop)?;
79 let len = used.len() as u16;
80 wgr.commit(len);
81
82 Ok(())
83 }
84}