From 5869c185ed7114f56429a2ebef70073ab9e80718 Mon Sep 17 00:00:00 2001 From: timofey Date: Sun, 23 Apr 2023 00:31:59 +0000 Subject: [PATCH] extract slice_deserializer --- src/core.rs | 39 +++------------------------------- src/core/slice_deserializer.rs | 38 +++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 36 deletions(-) create mode 100644 src/core/slice_deserializer.rs diff --git a/src/core.rs b/src/core.rs index 9c2ce96..41ccee6 100644 --- a/src/core.rs +++ b/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 { fn write(&mut self, buf: &[u8]) { self.extend(buf); diff --git a/src/core/slice_deserializer.rs b/src/core/slice_deserializer.rs new file mode 100644 index 0000000..f6d51f5 --- /dev/null +++ b/src/core/slice_deserializer.rs @@ -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 + } +}