sgx_serialize/src/serialize.rs (983 lines of code) (raw):

// Licensed to the Apache Software Foundation (ASF) under one // or more contributor license agreements. See the NOTICE file // distributed with this work for additional information // regarding copyright ownership. The ASF licenses this file // to you under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance // with the License. You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, // software distributed under the License is distributed on an // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License.. //! Support code for encoding and decoding types. /* Core encoding and decoding interfaces. */ use std::borrow::Cow; use std::path; use std::rc::Rc; use std::cell::{Cell, RefCell}; use std::sync::Arc; use std::boxed::Box; use std::string::String; use std::vec::Vec; use std::borrow::{ToOwned}; pub trait Encoder { /// The error type for method results. type Error; // Primitive types: fn emit_nil(&mut self) -> Result<(), Self::Error>; fn emit_usize(&mut self, v: usize) -> Result<(), Self::Error>; fn emit_u128(&mut self, v: u128) -> Result<(), Self::Error>; fn emit_u64(&mut self, v: u64) -> Result<(), Self::Error>; fn emit_u32(&mut self, v: u32) -> Result<(), Self::Error>; fn emit_u16(&mut self, v: u16) -> Result<(), Self::Error>; fn emit_u8(&mut self, v: u8) -> Result<(), Self::Error>; fn emit_isize(&mut self, v: isize) -> Result<(), Self::Error>; fn emit_i64(&mut self, v: i64) -> Result<(), Self::Error>; fn emit_i32(&mut self, v: i32) -> Result<(), Self::Error>; fn emit_i16(&mut self, v: i16) -> Result<(), Self::Error>; fn emit_i8(&mut self, v: i8) -> Result<(), Self::Error>; fn emit_bool(&mut self, v: bool) -> Result<(), Self::Error>; fn emit_f64(&mut self, v: f64) -> Result<(), Self::Error>; fn emit_f32(&mut self, v: f32) -> Result<(), Self::Error>; fn emit_char(&mut self, v: char) -> Result<(), Self::Error>; fn emit_str(&mut self, v: &str) -> Result<(), Self::Error>; fn emit_i128(&mut self, v: i128) -> Result<(), Self::Error>; // Compound types: fn emit_enum<F>(&mut self, _name: &str, f: F) -> Result<(), Self::Error> where F: FnOnce(&mut Self) -> Result<(), Self::Error>, { f(self) } fn emit_enum_variant<F>( &mut self, _v_name: &str, v_id: usize, _len: usize, f: F, ) -> Result<(), Self::Error> where F: FnOnce(&mut Self) -> Result<(), Self::Error>, { self.emit_usize(v_id)?; f(self) } fn emit_enum_variant_arg<F>( &mut self, _a_idx: usize, f: F, ) -> Result<(), Self::Error> where F: FnOnce(&mut Self) -> Result<(), Self::Error>, { f(self) } fn emit_enum_struct_variant<F>( &mut self, v_name: &str, v_id: usize, len: usize, f: F, ) -> Result<(), Self::Error> where F: FnOnce(&mut Self) -> Result<(), Self::Error>, { self.emit_enum_variant(v_name, v_id, len, f) } fn emit_enum_struct_variant_field<F>( &mut self, _f_name: &str, f_idx: usize, f: F, ) -> Result<(), Self::Error> where F: FnOnce(&mut Self) -> Result<(), Self::Error>, { self.emit_enum_variant_arg(f_idx, f) } fn emit_struct<F>( &mut self, _name: &str, _len: usize, f: F, ) -> Result<(), Self::Error> where F: FnOnce(&mut Self) -> Result<(), Self::Error>, { f(self) } fn emit_struct_field<F>( &mut self, _f_name: &str, _f_idx: usize, f: F, ) -> Result<(), Self::Error> where F: FnOnce(&mut Self) -> Result<(), Self::Error>, { f(self) } fn emit_tuple<F>(&mut self, _len: usize, f: F) -> Result<(), Self::Error> where F: FnOnce(&mut Self) -> Result<(), Self::Error>, { f(self) } fn emit_tuple_arg<F>(&mut self, _idx: usize, f: F) -> Result<(), Self::Error> where F: FnOnce(&mut Self) -> Result<(), Self::Error>, { f(self) } fn emit_tuple_struct<F>( &mut self, _name: &str, len: usize, f: F, ) -> Result<(), Self::Error> where F: FnOnce(&mut Self) -> Result<(), Self::Error>, { self.emit_tuple(len, f) } fn emit_tuple_struct_arg<F>( &mut self, f_idx: usize, f: F, ) -> Result<(), Self::Error> where F: FnOnce(&mut Self) -> Result<(), Self::Error>, { self.emit_tuple_arg(f_idx, f) } // Specialized types: fn emit_option<F>(&mut self, f: F) -> Result<(), Self::Error> where F: FnOnce(&mut Self) -> Result<(), Self::Error>, { self.emit_enum("Option", f) } fn emit_option_none(&mut self) -> Result<(), Self::Error> { self.emit_enum_variant("None", 0, 0, |_| Ok(())) } fn emit_option_some<F>(&mut self, f: F) -> Result<(), Self::Error> where F: FnOnce(&mut Self) -> Result<(), Self::Error>, { self.emit_enum_variant("Some", 1, 1, f) } fn emit_seq<F>(&mut self, len: usize, f: F) -> Result<(), Self::Error> where F: FnOnce(&mut Self) -> Result<(), Self::Error>, { self.emit_usize(len)?; f(self) } fn emit_seq_elt<F>(&mut self, _idx: usize, f: F) -> Result<(), Self::Error> where F: FnOnce(&mut Self) -> Result<(), Self::Error>, { f(self) } fn emit_map<F>(&mut self, len: usize, f: F) -> Result<(), Self::Error> where F: FnOnce(&mut Self) -> Result<(), Self::Error>, { self.emit_usize(len)?; f(self) } fn emit_map_elt_key<F>(&mut self, _idx: usize, f: F) -> Result<(), Self::Error> where F: FnOnce(&mut Self) -> Result<(), Self::Error>, { f(self) } fn emit_map_elt_val<F>(&mut self, _idx: usize, f: F) -> Result<(), Self::Error> where F: FnOnce(&mut Self) -> Result<(), Self::Error>, { f(self) } } pub trait Decoder { type Error; // Primitive types: fn read_nil(&mut self) -> Result<(), Self::Error>; fn read_usize(&mut self) -> Result<usize, Self::Error>; fn read_u128(&mut self) -> Result<u128, Self::Error>; fn read_u64(&mut self) -> Result<u64, Self::Error>; fn read_u32(&mut self) -> Result<u32, Self::Error>; fn read_u16(&mut self) -> Result<u16, Self::Error>; fn read_u8(&mut self) -> Result<u8, Self::Error>; fn read_isize(&mut self) -> Result<isize, Self::Error>; fn read_i128(&mut self) -> Result<i128, Self::Error>; fn read_i64(&mut self) -> Result<i64, Self::Error>; fn read_i32(&mut self) -> Result<i32, Self::Error>; fn read_i16(&mut self) -> Result<i16, Self::Error>; fn read_i8(&mut self) -> Result<i8, Self::Error>; fn read_bool(&mut self) -> Result<bool, Self::Error>; fn read_f64(&mut self) -> Result<f64, Self::Error>; fn read_f32(&mut self) -> Result<f32, Self::Error>; fn read_char(&mut self) -> Result<char, Self::Error>; fn read_str(&mut self) -> Result<Cow<str>, Self::Error>; // Compound types: fn read_enum<T, F>(&mut self, _name: &str, f: F) -> Result<T, Self::Error> where F: FnOnce(&mut Self) -> Result<T, Self::Error>, { f(self) } fn read_enum_variant<T, F>( &mut self, _names: &[&str], mut f: F, ) -> Result<T, Self::Error> where F: FnMut(&mut Self, usize) -> Result<T, Self::Error>, { let disr = self.read_usize()?; f(self, disr) } fn read_enum_variant_arg<T, F>( &mut self, _a_idx: usize, f: F, ) -> Result<T, Self::Error> where F: FnOnce(&mut Self) -> Result<T, Self::Error>, { f(self) } fn read_enum_struct_variant<T, F>( &mut self, names: &[&str], f: F, ) -> Result<T, Self::Error> where F: FnMut(&mut Self, usize) -> Result<T, Self::Error>, { self.read_enum_variant(names, f) } fn read_enum_struct_variant_field<T, F>( &mut self, _f_name: &str, f_idx: usize, f: F, ) -> Result<T, Self::Error> where F: FnOnce(&mut Self) -> Result<T, Self::Error>, { self.read_enum_variant_arg(f_idx, f) } fn read_struct<T, F>( &mut self, _s_name: &str, _len: usize, f: F, ) -> Result<T, Self::Error> where F: FnOnce(&mut Self) -> Result<T, Self::Error>, { f(self) } fn read_struct_field<T, F>( &mut self, _f_name: &str, _f_idx: usize, f: F, ) -> Result<T, Self::Error> where F: FnOnce(&mut Self) -> Result<T, Self::Error>, { f(self) } fn read_tuple<T, F>(&mut self, _len: usize, f: F) -> Result<T, Self::Error> where F: FnOnce(&mut Self) -> Result<T, Self::Error>, { f(self) } fn read_tuple_arg<T, F>( &mut self, _a_idx: usize, f: F, ) -> Result<T, Self::Error> where F: FnOnce(&mut Self) -> Result<T, Self::Error>, { f(self) } fn read_tuple_struct<T, F>( &mut self, _s_name: &str, len: usize, f: F, ) -> Result<T, Self::Error> where F: FnOnce(&mut Self) -> Result<T, Self::Error>, { self.read_tuple(len, f) } fn read_tuple_struct_arg<T, F>(&mut self, a_idx: usize, f: F) -> Result<T, Self::Error> where F: FnOnce(&mut Self) -> Result<T, Self::Error>, { self.read_tuple_arg(a_idx, f) } // Specialized types: fn read_option<T, F>(&mut self, mut f: F) -> Result<T, Self::Error> where F: FnMut(&mut Self, bool) -> Result<T, Self::Error>, { self.read_enum("Option", move |this| { this.read_enum_variant(&["None", "Some"], move |this, idx| { match idx { 0 => f(this, false), 1 => f(this, true), _ => Err(this.error("read_option: expected 0 for None or 1 for Some")), } }) }) } fn read_seq<T, F>(&mut self, f: F) -> Result<T, Self::Error> where F: FnOnce(&mut Self, usize) -> Result<T, Self::Error>, { let len = self.read_usize()?; f(self, len) } fn read_seq_elt<T, F>(&mut self, _idx: usize, f: F) -> Result<T, Self::Error> where F: FnOnce(&mut Self) -> Result<T, Self::Error>, { f(self) } fn read_map<T, F>(&mut self, f: F) -> Result<T, Self::Error> where F: FnOnce(&mut Self, usize) -> Result<T, Self::Error>, { let len = self.read_usize()?; f(self, len) } fn read_map_elt_key<T, F>( &mut self, _idx: usize, f: F, ) -> Result<T, Self::Error> where F: FnOnce(&mut Self) -> Result<T, Self::Error>, { f(self) } fn read_map_elt_val<T, F>( &mut self, _idx: usize, f: F, ) -> Result<T, Self::Error> where F: FnOnce(&mut Self) -> Result<T, Self::Error>, { f(self) } // Failure fn error(&mut self, err: &str) -> Self::Error; } pub trait DeSerializable: Sized { fn decode<D: Decoder>(d: &mut D) -> Result<Self, D::Error>; } pub trait Serializable { fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error>; } impl Serializable for usize { fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { s.emit_usize(*self) } } impl DeSerializable for usize { fn decode<D: Decoder>(d: &mut D) -> Result<usize, D::Error> { d.read_usize() } } impl Serializable for u8 { fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { s.emit_u8(*self) } } impl DeSerializable for u8 { fn decode<D: Decoder>(d: &mut D) -> Result<u8, D::Error> { d.read_u8() } } impl Serializable for u16 { fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { s.emit_u16(*self) } } impl DeSerializable for u16 { fn decode<D: Decoder>(d: &mut D) -> Result<u16, D::Error> { d.read_u16() } } impl Serializable for u32 { fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { s.emit_u32(*self) } } impl DeSerializable for u32 { fn decode<D: Decoder>(d: &mut D) -> Result<u32, D::Error> { d.read_u32() } } impl Serializable for u64 { fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { s.emit_u64(*self) } } impl DeSerializable for u64 { fn decode<D: Decoder>(d: &mut D) -> Result<u64, D::Error> { d.read_u64() } } impl Serializable for u128 { fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { s.emit_u128(*self) } } impl DeSerializable for u128 { fn decode<D: Decoder>(d: &mut D) -> Result<u128, D::Error> { d.read_u128() } } impl Serializable for isize { fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { s.emit_isize(*self) } } impl DeSerializable for isize { fn decode<D: Decoder>(d: &mut D) -> Result<isize, D::Error> { d.read_isize() } } impl Serializable for i8 { fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { s.emit_i8(*self) } } impl DeSerializable for i8 { fn decode<D: Decoder>(d: &mut D) -> Result<i8, D::Error> { d.read_i8() } } impl Serializable for i16 { fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { s.emit_i16(*self) } } impl DeSerializable for i16 { fn decode<D: Decoder>(d: &mut D) -> Result<i16, D::Error> { d.read_i16() } } impl Serializable for i32 { fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { s.emit_i32(*self) } } impl DeSerializable for i32 { fn decode<D: Decoder>(d: &mut D) -> Result<i32, D::Error> { d.read_i32() } } impl Serializable for i64 { fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { s.emit_i64(*self) } } impl DeSerializable for i64 { fn decode<D: Decoder>(d: &mut D) -> Result<i64, D::Error> { d.read_i64() } } impl Serializable for i128 { fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { s.emit_i128(*self) } } impl DeSerializable for i128 { fn decode<D: Decoder>(d: &mut D) -> Result<i128, D::Error> { d.read_i128() } } impl Serializable for str { fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { s.emit_str(self) } } impl Serializable for String { fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { s.emit_str(&self[..]) } } impl DeSerializable for String { fn decode<D: Decoder>(d: &mut D) -> Result<String, D::Error> { Ok(d.read_str()?.into_owned()) } } impl Serializable for f32 { fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { s.emit_f32(*self) } } impl DeSerializable for f32 { fn decode<D: Decoder>(d: &mut D) -> Result<f32, D::Error> { d.read_f32() } } impl Serializable for f64 { fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { s.emit_f64(*self) } } impl DeSerializable for f64 { fn decode<D: Decoder>(d: &mut D) -> Result<f64, D::Error> { d.read_f64() } } impl Serializable for bool { fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { s.emit_bool(*self) } } impl DeSerializable for bool { fn decode<D: Decoder>(d: &mut D) -> Result<bool, D::Error> { d.read_bool() } } impl Serializable for char { fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { s.emit_char(*self) } } impl DeSerializable for char { fn decode<D: Decoder>(d: &mut D) -> Result<char, D::Error> { d.read_char() } } impl Serializable for () { fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { s.emit_nil() } } impl DeSerializable for () { fn decode<D: Decoder>(d: &mut D) -> Result<(), D::Error> { d.read_nil() } } impl<'a, T: ?Sized + Serializable> Serializable for &'a T { fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { (**self).encode(s) } } impl<T: ?Sized + Serializable> Serializable for Box<T> { fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { (**self).encode(s) } } impl< T: DeSerializable> DeSerializable for Box<T> { fn decode<D: Decoder>(d: &mut D) -> Result<Box<T>, D::Error> { Ok(Box::new(DeSerializable::decode(d)?)) } } impl< T: DeSerializable> DeSerializable for Box<[T]> { fn decode<D: Decoder>(d: &mut D) -> Result<Box<[T]>, D::Error> { let v: Vec<T> = DeSerializable::decode(d)?; Ok(v.into_boxed_slice()) } } impl<T:Serializable> Serializable for Rc<T> { #[inline] fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { (**self).encode(s) } } impl<T:DeSerializable> DeSerializable for Rc<T> { #[inline] fn decode<D: Decoder>(d: &mut D) -> Result<Rc<T>, D::Error> { Ok(Rc::new(DeSerializable::decode(d)?)) } } impl<T:Serializable> Serializable for [T] { fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { s.emit_seq(self.len(), |s| { for (i, e) in self.iter().enumerate() { s.emit_seq_elt(i, |s| e.encode(s))? } Ok(()) }) } } impl<T:Serializable> Serializable for Vec<T> { fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { s.emit_seq(self.len(), |s| { for (i, e) in self.iter().enumerate() { s.emit_seq_elt(i, |s| e.encode(s))? } Ok(()) }) } } impl<T:DeSerializable> DeSerializable for Vec<T> { fn decode<D: Decoder>(d: &mut D) -> Result<Vec<T>, D::Error> { d.read_seq(|d, len| { let mut v = Vec::with_capacity(len); for i in 0..len { v.push(d.read_seq_elt(i, |d| DeSerializable::decode(d))?); } Ok(v) }) } } impl<'a, T:Serializable> Serializable for Cow<'a, [T]> where [T]: ToOwned<Owned = Vec<T>>, { fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { s.emit_seq(self.len(), |s| { for (i, e) in self.iter().enumerate() { s.emit_seq_elt(i, |s| e.encode(s))? } Ok(()) }) } } impl<T:DeSerializable+ToOwned> DeSerializable for Cow<'static, [T]> where [T]: ToOwned<Owned = Vec<T>>, { fn decode<D: Decoder>(d: &mut D) -> Result<Cow<'static, [T]>, D::Error> { d.read_seq(|d, len| { let mut v = Vec::with_capacity(len); for i in 0..len { v.push(d.read_seq_elt(i, |d| DeSerializable::decode(d))?); } Ok(Cow::Owned(v)) }) } } impl<T:Serializable> Serializable for Option<T> { fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { s.emit_option(|s| { match *self { None => s.emit_option_none(), Some(ref v) => s.emit_option_some(|s| v.encode(s)), } }) } } impl<T:DeSerializable> DeSerializable for Option<T> { fn decode<D: Decoder>(d: &mut D) -> Result<Option<T>, D::Error> { d.read_option(|d, b| { if b { Ok(Some(DeSerializable::decode(d)?)) } else { Ok(None) } }) } } macro_rules! peel { ($name:ident, $($other:ident,)*) => (tuple! { $($other,)* }) } /// Evaluates to the number of identifiers passed to it, for example: `count_idents!(a, b, c) == 3 macro_rules! count_idents { () => { 0 }; ($_i:ident, $($rest:ident,)*) => { 1 + count_idents!($($rest,)*) } } macro_rules! tuple { () => (); ( $($name:ident,)+ ) => ( impl<$($name:DeSerializable),*> DeSerializable for ($($name,)*) { #[allow(non_snake_case)] fn decode<D: Decoder>(d: &mut D) -> Result<($($name,)*), D::Error> { let len: usize = count_idents!($($name,)*); d.read_tuple(len, |d| { let mut i = 0; let ret = ($(d.read_tuple_arg({ i+=1; i-1 }, |d| -> Result<$name,D::Error> { DeSerializable::decode(d) })?,)*); Ok(ret) }) } } impl<$($name:Serializable),*> Serializable for ($($name,)*) { #[allow(non_snake_case)] fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { let ($(ref $name,)*) = *self; let mut n = 0; $(let $name = $name; n += 1;)* s.emit_tuple(n, |s| { let mut i = 0; $(s.emit_tuple_arg({ i+=1; i-1 }, |s| $name.encode(s))?;)* Ok(()) }) } } peel! { $($name,)* } ) } tuple! { T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, } macro_rules! array { () => (); ($len:expr, $($idx:expr,)*) => { impl<T:DeSerializable> DeSerializable for [T; $len] { fn decode<D: Decoder>(d: &mut D) -> Result<[T; $len], D::Error> { d.read_seq(|d, len| { if len != $len { return Err(d.error("wrong array length")); } Ok([$( d.read_seq_elt($len - $idx - 1, |d| DeSerializable::decode(d))? ),*]) }) } } impl<T:Serializable> Serializable for [T; $len] { fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { s.emit_seq($len, |s| { for i in 0..$len { s.emit_seq_elt(i, |s| self[i].encode(s))?; } Ok(()) }) } } array! { $($idx,)* } } } array! { 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, } impl Serializable for path::PathBuf { fn encode<S: Encoder>(&self, e: &mut S) -> Result<(), S::Error> { self.to_str().unwrap().encode(e) } } impl DeSerializable for path::PathBuf { fn decode<D: Decoder>(d: &mut D) -> Result<path::PathBuf, D::Error> { let bytes: String = DeSerializable::decode(d)?; Ok(path::PathBuf::from(bytes)) } } impl<T: Serializable + Copy> Serializable for Cell<T> { fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { self.get().encode(s) } } impl<T: DeSerializable + Copy> DeSerializable for Cell<T> { fn decode<D: Decoder>(d: &mut D) -> Result<Cell<T>, D::Error> { Ok(Cell::new(DeSerializable::decode(d)?)) } } // FIXME: #15036 // Should use `try_borrow`, returning a // `encoder.error("attempting to Encode borrowed RefCell")` // from `encode` when `try_borrow` returns `None`. impl<T: Serializable> Serializable for RefCell<T> { fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { self.borrow().encode(s) } } impl<T: DeSerializable> DeSerializable for RefCell<T> { fn decode<D: Decoder>(d: &mut D) -> Result<RefCell<T>, D::Error> { Ok(RefCell::new(DeSerializable::decode(d)?)) } } impl<T:Serializable> Serializable for Arc<T> { fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { (**self).encode(s) } } impl<T:DeSerializable+Send+Sync> DeSerializable for Arc<T> { fn decode<D: Decoder>(d: &mut D) -> Result<Arc<T>, D::Error> { Ok(Arc::new(DeSerializable::decode(d)?)) } } use std::hash::Hash; use std::collections::{LinkedList, VecDeque, BTreeMap, BTreeSet, HashMap, HashSet}; // Limit collections from allocating more than // 1 MB for calls to `with_capacity`. fn cap_capacity<T>(given_len: usize) -> usize { use std::cmp::min; use std::mem::size_of; const PRE_ALLOCATE_CAP: usize = 0x100000; match size_of::<T>() { 0 => min(given_len, PRE_ALLOCATE_CAP), n => min(given_len, PRE_ALLOCATE_CAP / n) } } impl<T: Serializable> Serializable for LinkedList<T> { fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { s.emit_seq(self.len(), |s| { for (i, e) in self.iter().enumerate() { s.emit_seq_elt(i, |s| e.encode(s))?; } Ok(()) }) } } impl<T:DeSerializable> DeSerializable for LinkedList<T> { fn decode<D: Decoder>(d: &mut D) -> Result<LinkedList<T>, D::Error> { d.read_seq(|d, len| { let mut list = LinkedList::new(); for i in 0..len { list.push_back(d.read_seq_elt(i, |d| DeSerializable::decode(d))?); } Ok(list) }) } } impl<T: Serializable> Serializable for VecDeque<T> { fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { s.emit_seq(self.len(), |s| { for (i, e) in self.iter().enumerate() { s.emit_seq_elt(i, |s| e.encode(s))?; } Ok(()) }) } } impl<T:DeSerializable> DeSerializable for VecDeque<T> { fn decode<D: Decoder>(d: &mut D) -> Result<VecDeque<T>, D::Error> { d.read_seq(|d, len| { let mut deque: VecDeque<T> = VecDeque::new(); for i in 0..len { deque.push_back(d.read_seq_elt(i, |d| DeSerializable::decode(d))?); } Ok(deque) }) } } impl<K: Serializable + Ord, V: Serializable> Serializable for BTreeMap<K, V> { fn encode<S: Encoder>(&self, e: &mut S) -> Result<(), S::Error> { e.emit_map(self.len(), |e| { let mut i = 0; for (key, val) in self.iter() { e.emit_map_elt_key(i, |e| key.encode(e))?; e.emit_map_elt_val(i, |e| val.encode(e))?; i += 1; } Ok(()) }) } } impl<K: DeSerializable + Ord, V: DeSerializable> DeSerializable for BTreeMap<K, V> { fn decode<D: Decoder>(d: &mut D) -> Result<BTreeMap<K, V>, D::Error> { d.read_map(|d, len| { let mut map = BTreeMap::new(); for i in 0..len { let key = d.read_map_elt_key(i, |d| DeSerializable::decode(d))?; let val = d.read_map_elt_val(i, |d| DeSerializable::decode(d))?; map.insert(key, val); } Ok(map) }) } } impl<T: Serializable + Ord> Serializable for BTreeSet<T> { fn encode<S: Encoder>(&self, s: &mut S) -> Result<(), S::Error> { s.emit_seq(self.len(), |s| { let mut i = 0; for e in self.iter() { s.emit_seq_elt(i, |s| e.encode(s))?; i += 1; } Ok(()) }) } } impl<T: DeSerializable + Ord> DeSerializable for BTreeSet<T> { fn decode<D: Decoder>(d: &mut D) -> Result<BTreeSet<T>, D::Error> { d.read_seq(|d, len| { let mut set = BTreeSet::new(); for i in 0..len { set.insert(d.read_seq_elt(i, |d| DeSerializable::decode(d))?); } Ok(set) }) } } impl<K, V> Serializable for HashMap<K, V> where K: Serializable + Hash + Eq, V: Serializable, { fn encode<E: Encoder>(&self, e: &mut E) -> Result<(), E::Error> { e.emit_map(self.len(), |e| { let mut i = 0; for (key, val) in self.iter() { e.emit_map_elt_key(i, |e| key.encode(e))?; e.emit_map_elt_val(i, |e| val.encode(e))?; i += 1; } Ok(()) }) } } impl<K, V> DeSerializable for HashMap<K, V> where K: DeSerializable + Hash + Eq, V: DeSerializable, { fn decode<D: Decoder>(d: &mut D) -> Result<HashMap<K, V>, D::Error> { d.read_map(|d, len| { let mut map = HashMap::with_capacity(cap_capacity::<(K, V)>(len)); for i in 0..len { let key = d.read_map_elt_key(i, |d| DeSerializable::decode(d))?; let val = d.read_map_elt_val(i, |d| DeSerializable::decode(d))?; map.insert(key, val); } Ok(map) }) } } impl<T> Serializable for HashSet<T> where T: Serializable + Hash + Eq, { fn encode<E: Encoder>(&self, s: &mut E) -> Result<(), E::Error> { s.emit_seq(self.len(), |s| { let mut i = 0; for e in self.iter() { s.emit_seq_elt(i, |s| e.encode(s))?; i += 1; } Ok(()) }) } } impl<T> DeSerializable for HashSet<T> where T: DeSerializable + Hash + Eq, { fn decode<D: Decoder>(d: &mut D) -> Result<HashSet<T>, D::Error> { d.read_seq(|d, len| { let mut set = HashSet::with_capacity(cap_capacity::<T>(len)); for i in 0..len { set.insert(d.read_seq_elt(i, |d| DeSerializable::decode(d))?); } Ok(set) }) } } use std::io::Cursor; use std::marker::PhantomData; use crate::opaque::Encoder as DataEncoder; use crate::opaque::Decoder as DataDecoder; /// SerializeHelper make it easy to obtain serialize function. pub struct SerializeHelper { cursor: RefCell<Cursor<Vec<u8>>>, } impl SerializeHelper { /// Create a new instance of SerializeHelper /// /// ``` /// let helper = SerializeHelper::new(); /// ``` /// pub fn new() -> SerializeHelper { SerializeHelper { cursor: RefCell::new(Cursor::new(Vec::new())), } } /// Get the size of the serialized buffer of the target. pub fn get_size(&self) -> usize { self.cursor.borrow().get_ref().len() } } impl SerializeHelper { /// Use encode to serialize a target type. The target must impl the tarit Serializable. /// The function return a Option::Some of `Vec<u8>`, if something error, return Option::None. /// /// ``` /// #[derive(Serializable, DeSerializable)] /// struct TestSturct { /// a1: u32, /// a2: u32, /// } /// let a = TestEnum::EnumStruct {a1: 2017, a2:829}; /// let helper = SerializeHelper::new(); /// let data = helper.encode(a).unwrap(); /// ``` /// pub fn encode< E: Serializable >(&self, target: E) -> Option<Vec<u8>> { { let mut cursor = self.cursor.borrow_mut(); let mut encoder = DataEncoder::new(&mut cursor); match target.encode(&mut encoder) { Result::Err(_) => return Option::None, _ => {}, } } let data = self.cursor.borrow().clone().into_inner(); Option::Some(data) } } /// DeSerializeHelper make it easy to obtain deserialize function. pub struct DeSerializeHelper<'a, T:'a + ?Sized> { data: Vec<u8>, marker: PhantomData<&'a T>, } impl<'a, T: 'a + ?Sized + DeSerializable> DeSerializeHelper<'a, T> { /// Create a new instance of DeSerializeHelper, parameter data must be a variable of /// `Vec<u8>` which return by SerializeHelper::encode. /// /// ``` /// #[derive(Serializable, DeSerializable)] /// struct TestSturct { /// a1: u32, /// a2: u32, /// } /// let a = TestEnum::EnumStruct {a1: 2017, a2:829}; /// let helper = SerializeHelper::new(); /// let data = helper.encode(a).unwrap(); /// let helper = DeSerializeHelper::<TestEnum>::new(data); /// ``` /// pub fn new(data: Vec<u8>) -> DeSerializeHelper<'a, T> { DeSerializeHelper { data: data, marker: PhantomData, } } /// Use decode to deserialize self data, and return the type T of SerializeHelper::encode. /// /// ``` /// #[derive(Serializable, DeSerializable)] /// struct TestSturct { /// a1: u32, /// a2: u32, /// } /// let a = TestEnum::EnumStruct {a1: 2017, a2:829}; /// let helper = SerializeHelper::new(); /// let data = helper.encode(a).unwrap(); /// let helper = DeSerializeHelper::<TestEnum>::new(data); /// let c = helper.decode().unwrap(); /// ``` /// pub fn decode(&self) -> Option<T> { let mut decoder = DataDecoder::new(&self.data[..], 0); match DeSerializable::decode(&mut decoder) { Result::Err(_) => Option::None, Result::Ok(d) => Option::Some(d), } } }