radn-rs/src/mode/slice_deserializer.rs
2023-07-30 19:46:14 +00:00

42 lines
1013 B
Rust

use std::cmp::min;
use super::*;
/// [Deserializer] for slices. Used in [`FactoryExt::parse_slice`] and [`AtomicExt::parse_slice`].
///
/// [`FactoryExt::parse_slice`]: crate::rcore::FactoryExt::parse_slice
/// [`AtomicExt::parse_slice`]: crate::atomic::AtomicExt::parse_slice
pub struct SliceDeserializer<'a> {
slice: &'a [u8],
pos: usize,
}
impl<'a> From<&'a [u8]> for SliceDeserializer<'a> {
fn from(value: &'a [u8]) -> Self {
SliceDeserializer {
slice: value,
pos: 0,
}
}
}
impl<'a> Deserializer for SliceDeserializer<'a> {
fn read_n(&mut self, n: usize) -> &[u8] {
let (slice_l, slice_r) = self.slice.split_at(min(n, self.slice.len()));
self.slice = slice_r;
self.pos += slice_l.len();
slice_l
}
fn read_all(&mut self) -> &[u8] {
let slice_l = self.slice;
self.slice = &[];
self.pos += slice_l.len();
slice_l
}
fn tell(&self) -> usize {
self.pos
}
}