Browse Source

Wrote the skeleton of the Deserializer and started fleshing it out.

Matthew Carr 3 years ago
parent
commit
fa271d5f4c
2 changed files with 237 additions and 12 deletions
  1. 235 12
      crates/node/src/serde_blocktree/de.rs
  2. 2 0
      crates/node/src/serde_blocktree/error.rs

+ 235 - 12
crates/node/src/serde_blocktree/de.rs

@@ -1,26 +1,249 @@
+use std::convert::TryFrom;
+use std::str;
 use std::io::Read;
 use super::error::{Error, Result, MapError};
+use serde::de::{
+    self,
+    DeserializeSeed,
+    EnumAccess,
+    IntoDeserializer,
+    MapAccess,
+    SeqAccess,
+    VariantAccess,
+    Visitor,
+};
 
-pub struct Deserializer<'de, T: Read> {
-    input: &'de T,
+pub struct Deserializer<'de, T: Read + ?Sized> {
+    input: &'de mut T,
 }
 
-impl<'de, T: Read> Deserializer<'de, T> {
-    pub fn new(input: &'de T) -> Self {
+fn try_from<TSource, TDest: TryFrom<TSource>>(value: TSource) -> Result<TDest> {
+    let cast = TDest::try_from(value).or_else(|_| Err(Error::TypeConversion))?;
+    Ok(cast)
+}
+
+impl<'de, T: Read + ?Sized> Deserializer<'de, T> {
+    pub fn new(input: &'de mut T) -> Self {
         Deserializer { input: input }
     }
+
+    fn read_exact(&mut self, buf: &mut [u8]) -> Result<()> {
+        self.input.read_exact(buf).or_else(|e| Err(Error::Io(e)))?;
+        Ok(())
+    }
+
+    fn read_u8(&mut self) -> Result<u8> {
+        let mut buf = [0u8; 1];
+        self.read_exact(&mut buf)?;
+        Ok(buf[0])
+    }
+
+    fn read_u16(&mut self) -> Result<u16> {
+        let mut buf = [0u8; 2];
+        self.read_exact(&mut buf)?;
+        Ok(u16::from_le_bytes(buf))
+    }
+
+    fn read_u32(&mut self) -> Result<u32> {
+        let mut buf = [0u8; 4];
+        self.read_exact(&mut buf)?;
+        Ok(u32::from_le_bytes(buf))
+    }
+
+    fn read_u64(&mut self) -> Result<u64> {
+        let mut buf = [0u8; 8];
+        self.read_exact(&mut buf)?;
+        Ok(u64::from_le_bytes(buf))
+    }
+
+    fn read_i8(&mut self) -> Result<i8> {
+        let value = self.read_u8()?;
+        try_from(value)
+    }
+
+    fn read_i16(&mut self) -> Result<i16> {
+        let value = self.read_u16()?;
+        try_from(value)
+    }
+
+    fn read_i32(&mut self) -> Result<i32> {
+        let value = self.read_u32()?;
+        try_from(value)
+    }
+
+    fn read_string(&mut self) -> Result<String> {
+        let len = self.read_u32()?;
+        let mut vec = Vec::with_capacity(try_from(len)?);
+        self.read_exact(&mut vec)?;
+        let value = String::from_utf8(vec).or_else(|_| Err(Error::TypeConversion))?;
+        Ok(value)
+    }
+}
+
+impl<'de, 'a, T: Read> de::Deserializer<'de> for &'a mut Deserializer<'de, T> {
+    type Error = Error;
+
+    fn deserialize_any<V: Visitor<'de>>(self, _visitor: V) -> Result<V::Value> {
+        Err(Error::Message("deserialize_any is not supported".to_string()))
+    }
+
+    fn deserialize_bool<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
+        let value = self.read_u8()?;
+        visitor.visit_bool(value > 0)
+    }
+
+    fn deserialize_i8<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
+        let value = self.read_i8()?;
+        visitor.visit_i8(value)
+    }
+
+    fn deserialize_i16<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
+        let value = self.read_i16()?;
+        visitor.visit_i16(value)
+    }
+
+    fn deserialize_i32<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
+        let value = self.read_i32()?;
+        visitor.visit_i32(value)
+    }
+
+    fn deserialize_i64<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
+        let unsigned = self.read_u64()?;
+        let signed = try_from(unsigned)?;
+        visitor.visit_i64(signed)
+    }
+
+    fn deserialize_u8<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
+        let value = self.read_u8()?;
+        visitor.visit_u8(value)
+    }
+
+    fn deserialize_u16<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
+        let value = self.read_u16()?;
+        visitor.visit_u16(value)
+    }
+
+    fn deserialize_u32<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
+        let value = self.read_u32()?;
+        visitor.visit_u32(value)
+    }
+
+    fn deserialize_u64<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
+        let value = self.read_u64()?;
+        visitor.visit_u64(value)
+    }
+
+    fn deserialize_f32<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
+        let mut buf = [0u8; 4];
+        self.read_exact(&mut buf)?;
+        let value = f32::from_le_bytes(buf);
+        visitor.visit_f32(value)
+    }
+
+    fn deserialize_f64<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
+        let mut buf = [0u8; 8];
+        self.read_exact(&mut buf)?;
+        let value = f64::from_le_bytes(buf);
+        visitor.visit_f64(value)
+    }
+
+    fn deserialize_char<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
+        let byte = self.read_u8()?;
+        let value = try_from(byte)?;
+        visitor.visit_char(value)
+    }
+
+    fn deserialize_str<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
+        let value = self.read_string()?;
+        visitor.visit_str(value.as_str())
+    }
+
+    fn deserialize_string<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
+        let value = self.read_string()?;
+        visitor.visit_string(value)
+    }
+
+    fn deserialize_bytes<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
+        Err(Error::Message("NOT IMPLEMENTED".to_string()))
+    }
+
+    fn deserialize_byte_buf<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
+        Err(Error::Message("NOT IMPLEMENTED".to_string()))
+    }
+
+    fn deserialize_option<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
+        Err(Error::Message("NOT IMPLEMENTED".to_string()))
+    }
+
+    fn deserialize_unit<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
+        Err(Error::Message("NOT IMPLEMENTED".to_string()))
+    }
+
+    fn deserialize_unit_struct<V: Visitor<'de>>(
+        self, name: &'static str, visitor: V
+    ) -> Result<V::Value> {
+        Err(Error::Message("NOT IMPLEMENTED".to_string()))
+    }
+
+    fn deserialize_newtype_struct<V: Visitor<'de>>(
+        self, name: &'static str, visitor: V
+    ) -> Result<V::Value> {
+        Err(Error::Message("NOT IMPLEMENTED".to_string()))
+    }
+
+    fn deserialize_seq<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
+        Err(Error::Message("NOT IMPLEMENTED".to_string()))
+    }
+
+    fn deserialize_tuple<V: Visitor<'de>>(self, len: usize, visitor: V) -> Result<V::Value> {
+        Err(Error::Message("NOT IMPLEMENTED".to_string()))
+    }
+
+    fn deserialize_tuple_struct<V: Visitor<'de>>(
+        self, name: &'static str, len: usize, visitor: V
+    ) -> Result<V::Value> {
+        Err(Error::Message("NOT IMPLEMENTED".to_string()))
+    }
+
+    fn deserialize_map<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
+        Err(Error::Message("NOT IMPLEMENTED".to_string()))
+    }
+
+    fn deserialize_struct<V: Visitor<'de>>(
+        self, name: &'static str, fields: &'static [&'static str], visitor: V
+    ) -> Result<V::Value> {
+        Err(Error::Message("NOT IMPLEMENTED".to_string()))
+    }
+
+    fn deserialize_enum<V: Visitor<'de>>(
+        self, name: &'static str, variants: &'static [&'static str], visitor: V
+    ) -> Result<V::Value> {
+        Err(Error::Message("NOT IMPLEMENTED".to_string()))
+    }
+
+    fn deserialize_identifier<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
+        Err(Error::Message("NOT IMPLEMENTED".to_string()))
+    }
+
+    fn deserialize_ignored_any<V: Visitor<'de>>(self, visitor: V) -> Result<V::Value> {
+        Err(Error::Message("NOT IMPLEMENTED".to_string()))
+    }
+
+    fn is_human_readable(&self) -> bool {
+        false
+    }
 }
 
 mod test {
     #[allow(unused_imports)]
     use super::{Result, Deserializer};
     
-    #[test]
-    fn new() -> Result<()> {
-        let vec = vec![0xA1];
-        let slice = &vec.as_slice();
-        let de = Deserializer::new(slice);
-        assert_eq!(slice, de.input);
-        Ok(())
-    }
+    //#[test]
+    //fn new() -> Result<()> {
+    //    let mut vec: Vec<u8> = vec![0xA1];
+    //    let slice = &mut vec[..];
+    //    let de = Deserializer::new(slice);
+    //    assert_eq!(slice, de.input);
+    //    Ok(())
+    //}
 }

+ 2 - 0
crates/node/src/serde_blocktree/error.rs

@@ -11,6 +11,7 @@ pub enum Error {
     UnknownLength,
     SequenceTooLong(usize),
     TooManyVariants(u32),
+    TypeConversion,
 }
 
 impl std::error::Error for Error {}
@@ -28,6 +29,7 @@ impl Display for Error {
             Error::TooManyVariants(length) => formatter.write_fmt(
                 format_args!("too many variants to be serialized, the limit is 2**16: {}", length)
             ),
+            Error::TypeConversion => formatter.write_str("type conversion failed"),
         }
     }
 }