ergot_base/interface_manager/
framed_stream.rs

1use 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)] // todo
19impl<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            // todo: use a different interface for this
33            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            // todo: use a different interface for this
55            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        // note: here it SHOULD be an err!
71        if !is_err {
72            // todo: use a different interface for this
73            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}