extract slice_deserializer
This commit is contained in:
parent
25c15837d9
commit
5869c185ed
39
src/core.rs
39
src/core.rs
@ -2,11 +2,13 @@
|
||||
//! Brings [`Mentionable`]/[`Factory`]/[`Origin`] concepts from the original implementation in Python.
|
||||
//! Allows for more generic behaviour via [`Context`], as opposed to original async-only.
|
||||
|
||||
mod slice_deserializer;
|
||||
mod typeless;
|
||||
|
||||
pub use slice_deserializer::*;
|
||||
pub use typeless::*;
|
||||
|
||||
use std::{cmp::min, error::Error, fmt::Display, rc::Rc};
|
||||
use std::{error::Error, fmt::Display, rc::Rc};
|
||||
|
||||
use crate::func::*;
|
||||
|
||||
@ -328,41 +330,6 @@ impl<'a, Ctx: 'a + Context, F: Factory<'a, Ctx>> ExtFactory<'a, Ctx> for F {
|
||||
}
|
||||
}
|
||||
|
||||
/// [Deserializer] for slices. Used in [`ExtFactory::parse_slice`] and [`crate::std::atomic::ExtAtomic::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 (left, right) = self.slice.split_at(min(n, self.slice.len()));
|
||||
self.slice = right;
|
||||
self.pos += left.len();
|
||||
left
|
||||
}
|
||||
|
||||
fn read_all(&mut self) -> &[u8] {
|
||||
let left = self.slice;
|
||||
self.slice = &[];
|
||||
self.pos += left.len();
|
||||
left
|
||||
}
|
||||
|
||||
fn tell(&self) -> usize {
|
||||
self.pos
|
||||
}
|
||||
}
|
||||
|
||||
impl Serializer for Vec<u8> {
|
||||
fn write(&mut self, buf: &[u8]) {
|
||||
self.extend(buf);
|
||||
|
38
src/core/slice_deserializer.rs
Normal file
38
src/core/slice_deserializer.rs
Normal file
@ -0,0 +1,38 @@
|
||||
use std::cmp::min;
|
||||
|
||||
use super::*;
|
||||
|
||||
/// [Deserializer] for slices. Used in [`ExtFactory::parse_slice`] and [`crate::std::atomic::ExtAtomic::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 (left, right) = self.slice.split_at(min(n, self.slice.len()));
|
||||
self.slice = right;
|
||||
self.pos += left.len();
|
||||
left
|
||||
}
|
||||
|
||||
fn read_all(&mut self) -> &[u8] {
|
||||
let left = self.slice;
|
||||
self.slice = &[];
|
||||
self.pos += left.len();
|
||||
left
|
||||
}
|
||||
|
||||
fn tell(&self) -> usize {
|
||||
self.pos
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user