40 lines
1001 B
Rust
40 lines
1001 B
Rust
use bytes::{Bytes, Buf};
|
|
use errors::*;
|
|
use std::io::Cursor;
|
|
|
|
mod std_impls;
|
|
|
|
pub trait DnsPacketData: Sized {
|
|
fn deserialize(data: &mut Cursor<Bytes>) -> Result<Self>;
|
|
}
|
|
|
|
pub fn deserialize_with<F, O>(data: Bytes, parser: F) -> Result<O>
|
|
where
|
|
F: FnOnce(&mut Cursor<Bytes>) -> Result<O>,
|
|
{
|
|
let mut c = Cursor::new(data);
|
|
let result = parser(&mut c)?;
|
|
if c.remaining() != 0 {
|
|
bail!("data remaining: {} bytes", c.remaining())
|
|
}
|
|
Ok(result)
|
|
}
|
|
|
|
pub fn remaining_bytes(data: &mut Cursor<Bytes>) -> Bytes {
|
|
let pos = data.position() as usize;
|
|
let len = data.remaining();
|
|
let result = data.get_ref().slice(pos, pos + len);
|
|
data.advance(len);
|
|
result
|
|
}
|
|
|
|
pub fn short_blob(data: &mut Cursor<Bytes>) -> Result<Bytes> {
|
|
check_enough_data!(data, 1, "short blob length");
|
|
let blob_len = data.get_u8() as usize;
|
|
check_enough_data!(data, blob_len, "short blob content");
|
|
let pos = data.position() as usize;
|
|
let blob = data.get_ref().slice(pos, pos + blob_len);
|
|
data.advance(blob_len);
|
|
Ok(blob)
|
|
}
|