ergot_base/
lib.rs

1#![doc = include_str!("../README.md")]
2
3pub mod address;
4pub mod interface_manager;
5pub mod net_stack;
6pub mod socket;
7
8pub use address::Address;
9pub use net_stack::{NetStack, NetStackSendError};
10
11#[derive(Debug, Clone, Copy, PartialEq)]
12pub struct FrameKind(pub u8);
13
14#[derive(Debug, Clone, Copy, PartialEq)]
15pub struct Key(pub [u8; 8]);
16
17#[derive(Debug, Clone)]
18pub struct Header {
19    pub src: Address,
20    pub dst: Address,
21    pub key: Option<Key>,
22    pub seq_no: Option<u16>,
23    pub kind: FrameKind,
24}
25
26#[derive(Debug, Clone)]
27pub struct HeaderSeq {
28    pub src: Address,
29    pub dst: Address,
30    pub key: Option<Key>,
31    pub seq_no: u16,
32    pub kind: FrameKind,
33}
34
35impl FrameKind {
36    pub const RESERVED: Self = Self(0);
37    pub const ENDPOINT_REQ: Self = Self(1);
38    pub const ENDPOINT_RESP: Self = Self(2);
39    pub const TOPIC_MSG: Self = Self(3);
40}
41
42impl Header {
43    #[inline]
44    pub fn to_headerseq_or_with_seq<F: FnOnce() -> u16>(&self, f: F) -> HeaderSeq {
45        HeaderSeq {
46            src: self.src,
47            dst: self.dst,
48            key: self.key,
49            seq_no: self.seq_no.unwrap_or_else(f),
50            kind: self.kind,
51        }
52    }
53}
54
55impl From<HeaderSeq> for Header {
56    fn from(val: HeaderSeq) -> Self {
57        Self {
58            src: val.src,
59            dst: val.dst,
60            key: val.key,
61            seq_no: Some(val.seq_no),
62            kind: val.kind,
63        }
64    }
65}