Files
rust-dns-lowlevel/src/ext.rs
T

41 lines
1.2 KiB
Rust

use std::io::{Cursor, Read};
pub trait CursorExt {
fn read_u8(&mut self) -> anyhow::Result<u8>;
fn read_u16(&mut self) -> anyhow::Result<u16>;
fn read_u32(&mut self) -> anyhow::Result<u32>;
fn read_bytes(&mut self, len: usize) -> anyhow::Result<Vec<u8>>;
fn read_string(&mut self, len: usize) -> anyhow::Result<String>;
}
impl CursorExt for Cursor<&[u8]> {
fn read_u8(&mut self) -> anyhow::Result<u8> {
let mut result = [0u8; 1];
self.read_exact(&mut result)?;
Ok(result[0])
}
fn read_u16(&mut self) -> anyhow::Result<u16> {
let mut result = [0u8; 2];
self.read_exact(&mut result)?;
Ok(u16::from_be_bytes(result))
}
fn read_u32(&mut self) -> anyhow::Result<u32> {
let mut result = [0u8; 4];
self.read_exact(&mut result)?;
Ok(u32::from_be_bytes(result))
}
fn read_bytes(&mut self, len: usize) -> anyhow::Result<Vec<u8>> {
let mut result = vec![0u8; len];
self.read_exact(&mut result)?;
Ok(result)
}
fn read_string(&mut self, len: usize) -> anyhow::Result<String> {
let result = self.read_bytes(len)?;
Ok(String::from_utf8_lossy(&result).to_string())
}
}