use nom::{be_u32, rest};
use toxcore::binary_io::*;
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct BootstrapInfo {
pub version: u32,
pub motd: Vec<u8>,
}
pub const BOOSTRAP_SERVER_MAX_MOTD_LENGTH: usize = 256;
pub const BOOSTRAP_CLIENT_MAX_MOTD_LENGTH: usize = 73;
impl ToBytes for BootstrapInfo {
fn to_bytes<'a>(&self, buf: (&'a mut [u8], usize)) -> Result<(&'a mut [u8], usize), GenError> {
do_gen!(buf,
gen_be_u8!(0xf0) >>
gen_be_u32!(self.version) >>
gen_slice!(self.motd.as_slice())
)
}
}
impl FromBytes for BootstrapInfo {
named!(from_bytes<BootstrapInfo>, do_parse!(
tag!(&[0xf0][..]) >>
version: be_u32 >>
motd: verify!(rest, |motd: &[u8]| motd.len() <= BOOSTRAP_SERVER_MAX_MOTD_LENGTH) >>
(BootstrapInfo { version, motd: motd.to_vec() })
));
}
#[cfg(test)]
mod tests {
use toxcore::dht::packet::bootstrap_info::*;
encode_decode_test!(
bootstrap_info_encode_decode,
BootstrapInfo {
version: 1717,
motd: vec![1,2,3,4],
}
);
}