mod error;
pub mod parse;
use crate::{
frame::{parse as fparse, FrameGenerator, FrameParser},
types::AddrAuth,
Result,
};
use nom::IResult;
#[rustfmt::skip]
pub mod client_modes {
pub const INTRINSIC: u8 = 0x0;
pub const ADDR: u8 = 0x1;
pub const CONTACT: u8 = 0x2;
pub const LINK: u8 = 0x3;
pub const PEER: u8 = 0x4;
pub const RECV: u8 = 0x5;
pub const SEND: u8 = 0x6;
pub const STREAM: u8 = 0x7;
pub const SPACE: u8 = 0x8;
pub const CREATE: u8 = 0x1;
pub const DESTROY: u8 = 0x2;
pub const SUB: u8 = 0x3;
pub const RESUB: u8 = 0x4;
pub const UNSUB: u8 = 0x5;
pub const UP: u8 = 0x10;
pub const DOWN: u8 = 0x11;
pub const ADD: u8 = 0x20;
pub const DELETE: u8 = 0x21;
pub const MODIFY: u8 = 0x22;
pub const LIST: u8 = 0x30;
pub const QUERY: u8 = 0x31;
pub const ONE: u8 = 0x32;
pub const MANY: u8 = 0x33;
pub const STATUS: u8 = 0x34;
pub const ANYCAST: u8 = 0x35;
pub const fn make(ns: u8, op: u8) -> u16 {
((ns as u16) << 8) as u16 | op as u16
}
#[test]
fn test_addr_create() {
let mode = make(ADDR, CREATE);
println!("{:#018b}", mode);
assert_eq!(mode, 257);
}
}
#[repr(C)]
#[derive(Clone, Debug, Default, PartialEq)]
pub struct MicroframeHeader {
pub modes: u16,
pub auth: Option<AddrAuth>,
pub payload_size: u32,
}
impl MicroframeHeader {
pub fn intrinsic_noauth() -> Self {
Self {
modes: client_modes::make(client_modes::INTRINSIC, client_modes::INTRINSIC),
auth: None,
payload_size: 0,
}
}
pub fn intrinsic_auth(auth: AddrAuth) -> Self {
Self {
modes: client_modes::make(client_modes::INTRINSIC, client_modes::INTRINSIC),
auth: Some(auth),
payload_size: 0,
}
}
}
impl FrameGenerator for MicroframeHeader {
fn generate(self, buf: &mut Vec<u8>) -> Result<()> {
self.modes.generate(buf)?;
self.auth.generate(buf)?;
self.payload_size.generate(buf)?;
Ok(())
}
}
impl FrameParser for MicroframeHeader {
type Output = Result<Self>;
fn parse(input: &[u8]) -> IResult<&[u8], Self::Output> {
let (input, modes) = fparse::take_u16(input).unwrap();
let (input, auth) = AddrAuth::parse(input).unwrap();
let (input, payload_size) = fparse::take_u32(input).unwrap();
Ok((
input,
Ok(MicroframeHeader {
modes,
auth,
payload_size,
}),
))
}
}