blob: c662d18f00c9b9c85b790cb564642c1ae4666c2c [file] [log] [blame]
// 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),
}
}
}