use crate::primitives::TunnelId;
use bytes::{BufMut, BytesMut};
use nom::{
bytes::complete::take,
number::complete::{be_u16, be_u32},
IResult,
};
use alloc::vec::Vec;
pub struct TunnelGateway<'a> {
pub tunnel_id: TunnelId,
pub payload: &'a [u8],
}
impl<'a> TunnelGateway<'a> {
fn parse_frame(input: &'a [u8]) -> IResult<&'a [u8], TunnelGateway<'a>> {
let (rest, tunnel_id) = be_u32(input)?;
let (rest, size) = be_u16(rest)?;
let (rest, payload) = take(size as usize)(rest)?;
Ok((
rest,
TunnelGateway {
tunnel_id: TunnelId::from(tunnel_id),
payload,
},
))
}
pub fn parse(input: &'a [u8]) -> Option<TunnelGateway<'a>> {
Some(Self::parse_frame(input).ok()?.1)
}
pub fn serialize(self) -> Vec<u8> {
let mut out = BytesMut::with_capacity(self.payload.len() + 2 + 4);
out.put_u32(*self.tunnel_id);
out.put_u16(self.payload.len() as u16);
out.put_slice(self.payload);
out.freeze().to_vec()
}
}