From d6055b5ac4f3ff5016bc4881cf1cc109a22c40ba Mon Sep 17 00:00:00 2001 From: Igor Tolmachev Date: Sun, 16 Jun 2024 21:36:13 +0900 Subject: Implement serialize --- src/structs/ser.rs | 339 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 338 insertions(+), 1 deletion(-) (limited to 'src/structs/ser.rs') diff --git a/src/structs/ser.rs b/src/structs/ser.rs index a3fe291..8aa95a5 100644 --- a/src/structs/ser.rs +++ b/src/structs/ser.rs @@ -1,6 +1,343 @@ +use crate::structs::{Settings, StructError, StructResult}; use crate::ArchiveError; use serde::{ser, Serialize}; pub struct ArchiveSerializer { - bin: Vec, + bytes: Vec, + settings: Settings, +} + +impl ArchiveSerializer { + pub fn new(settings: Settings) -> Self { + Self { + bytes: Vec::new(), + settings, + } + } + + pub fn to_bytes(self) -> Vec { + self.bytes + } +} + +impl ser::Serializer for &mut ArchiveSerializer { + type Ok = (); + type Error = ArchiveError; + + type SerializeSeq = Self; + type SerializeTuple = Self; + type SerializeTupleStruct = Self; + type SerializeTupleVariant = Self; + type SerializeMap = Self; + type SerializeStruct = Self; + type SerializeStructVariant = Self; + + fn serialize_bool(self, v: bool) -> StructResult<()> { + self.bytes.push(v as u8); + Ok(()) + } + + fn serialize_i8(self, v: i8) -> StructResult<()> { + self.bytes.push(v as u8); + Ok(()) + } + + fn serialize_i16(self, v: i16) -> StructResult<()> { + self.bytes.append(&mut self.settings.byte_order.i16(v)); + Ok(()) + } + + fn serialize_i32(self, v: i32) -> StructResult<()> { + self.bytes.append(&mut self.settings.byte_order.i32(v)); + Ok(()) + } + + fn serialize_i64(self, v: i64) -> StructResult<()> { + self.bytes.append(&mut self.settings.byte_order.i64(v)); + Ok(()) + } + + fn serialize_u8(self, v: u8) -> StructResult<()> { + self.bytes.push(v); + Ok(()) + } + + fn serialize_u16(self, v: u16) -> StructResult<()> { + self.bytes.append(&mut self.settings.byte_order.u16(v)); + Ok(()) + } + + fn serialize_u32(self, v: u32) -> StructResult<()> { + self.bytes.append(&mut self.settings.byte_order.u32(v)); + Ok(()) + } + + fn serialize_u64(self, v: u64) -> StructResult<()> { + self.bytes.append(&mut self.settings.byte_order.u64(v)); + Ok(()) + } + + fn serialize_f32(self, v: f32) -> StructResult<()> { + self.bytes.append(&mut self.settings.byte_order.f32(v)); + Ok(()) + } + + fn serialize_f64(self, v: f64) -> StructResult<()> { + self.bytes.append(&mut self.settings.byte_order.f64(v)); + Ok(()) + } + + fn serialize_char(self, v: char) -> StructResult<()> { + self.bytes.push(v as u8); + Ok(()) + } + + fn serialize_str(self, v: &str) -> StructResult<()> { + self.bytes.append(&mut v.as_bytes().to_vec()); + Ok(()) + } + + fn serialize_bytes(self, v: &[u8]) -> StructResult<()> { + self.bytes.append(&mut v.to_vec()); + Ok(()) + } + + fn serialize_none(self) -> StructResult<()> { + Ok(()) + } + + fn serialize_some(self, value: &T) -> StructResult<()> + where + T: ?Sized + Serialize, + { + value.serialize(self) + } + + fn serialize_unit(self) -> StructResult<()> { + Ok(()) + } + + fn serialize_unit_struct(self, _name: &'static str) -> StructResult<()> { + self.serialize_unit() + } + + fn serialize_unit_variant( + self, + _name: &'static str, + variant_index: u32, + _variant: &'static str, + ) -> StructResult<()> { + self.bytes.append( + &mut self + .settings + .variant_index_type + .cast(variant_index, &self.settings.byte_order)?, + ); + Ok(()) + } + + fn serialize_newtype_struct(self, _name: &'static str, value: &T) -> StructResult<()> + where + T: ?Sized + Serialize, + { + value.serialize(self) + } + + fn serialize_newtype_variant( + self, + _name: &'static str, + variant_index: u32, + _variant: &'static str, + value: &T, + ) -> StructResult<()> + where + T: ?Sized + Serialize, + { + self.bytes.append( + &mut self + .settings + .variant_index_type + .cast(variant_index, &self.settings.byte_order)?, + ); + value.serialize(self) + } + + fn serialize_seq(self, _len: Option) -> StructResult { + Ok(self) + } + + fn serialize_tuple(self, _len: usize) -> StructResult { + Ok(self) + } + + fn serialize_tuple_struct( + self, + _name: &'static str, + _len: usize, + ) -> StructResult { + Ok(self) + } + + fn serialize_tuple_variant( + self, + _name: &'static str, + variant_index: u32, + _variant: &'static str, + _len: usize, + ) -> StructResult { + self.bytes.append( + &mut self + .settings + .variant_index_type + .cast(variant_index, &self.settings.byte_order)?, + ); + Ok(self) + } + + fn serialize_map(self, _len: Option) -> StructResult { + Ok(self) + } + + fn serialize_struct( + self, + _name: &'static str, + _len: usize, + ) -> StructResult { + Ok(self) + } + + fn serialize_struct_variant( + self, + _name: &'static str, + variant_index: u32, + _variant: &'static str, + _len: usize, + ) -> StructResult { + self.bytes.append( + &mut self + .settings + .variant_index_type + .cast(variant_index, &self.settings.byte_order)?, + ); + Ok(self) + } +} + +impl ser::SerializeSeq for &mut ArchiveSerializer { + type Ok = (); + type Error = ArchiveError; + + fn serialize_element(&mut self, value: &T) -> StructResult<()> + where + T: ?Sized + Serialize, + { + value.serialize(&mut **self) + } + + fn end(self) -> StructResult<()> { + Ok(()) + } +} + +impl ser::SerializeTuple for &mut ArchiveSerializer { + type Ok = (); + type Error = ArchiveError; + + fn serialize_element(&mut self, value: &T) -> StructResult<()> + where + T: ?Sized + Serialize, + { + value.serialize(&mut **self) + } + + fn end(self) -> StructResult<()> { + Ok(()) + } +} + +impl ser::SerializeTupleStruct for &mut ArchiveSerializer { + type Ok = (); + type Error = ArchiveError; + + fn serialize_field(&mut self, value: &T) -> StructResult<()> + where + T: ?Sized + Serialize, + { + value.serialize(&mut **self) + } + + fn end(self) -> StructResult<()> { + Ok(()) + } +} + +impl ser::SerializeTupleVariant for &mut ArchiveSerializer { + type Ok = (); + type Error = ArchiveError; + + fn serialize_field(&mut self, value: &T) -> StructResult<()> + where + T: ?Sized + Serialize, + { + value.serialize(&mut **self) + } + + fn end(self) -> StructResult<()> { + Ok(()) + } +} + +impl ser::SerializeMap for &mut ArchiveSerializer { + type Ok = (); + type Error = ArchiveError; + + fn serialize_key(&mut self, key: &T) -> StructResult<()> + where + T: ?Sized + Serialize, + { + key.serialize(&mut **self) + } + + fn serialize_value(&mut self, value: &T) -> StructResult<()> + where + T: ?Sized + Serialize, + { + value.serialize(&mut **self) + } + + fn end(self) -> StructResult<()> { + Ok(()) + } +} + +impl ser::SerializeStruct for &mut ArchiveSerializer { + type Ok = (); + type Error = ArchiveError; + + fn serialize_field(&mut self, _key: &'static str, value: &T) -> StructResult<()> + where + T: ?Sized + Serialize, + { + value.serialize(&mut **self) + } + + fn end(self) -> StructResult<()> { + Ok(()) + } +} + +impl ser::SerializeStructVariant for &mut ArchiveSerializer { + type Ok = (); + type Error = ArchiveError; + + fn serialize_field(&mut self, _key: &'static str, value: &T) -> StructResult<()> + where + T: ?Sized + Serialize, + { + value.serialize(&mut **self) + } + + fn end(self) -> StructResult<()> { + Ok(()) + } } -- cgit v1.2.3