1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
use crate::Data; use crate::serde::DataError; use serde::{Serialize, Deserialize}; use std::any::{TypeId, Any}; impl Data{ pub fn msgpack_to<'a,T:Deserialize<'a>>(&'a mut self) ->Result<T,DataError>{ rmp_serde::decode::from_read_ref(&self[..]).map_err(|err| DataError::Other(err.into())) } pub fn msgpack_from<T: Serialize>(value:T) ->Result<Data, DataError> { Ok(rmp_serde::encode::to_vec(&value).map_err(|err|DataError::Other(err.into()))?.into()) } pub fn msgpack_deserialize<'a,T:Deserialize<'a>+'static>(&'a mut self)->Result<T,DataError> { let typeid = TypeId::of::<T>(); if typeid == TypeId::of::<bool>() { self.serde_deserialize() } else if typeid == TypeId::of::<i8>() { self.serde_deserialize() } else if typeid == TypeId::of::<u8>() { self.serde_deserialize() } else if typeid == TypeId::of::<i16>() { self.serde_deserialize() } else if typeid == TypeId::of::<u16>() { self.serde_deserialize() } else if typeid == TypeId::of::<i32>() { self.serde_deserialize() } else if typeid == TypeId::of::<u32>() { self.serde_deserialize() } else if typeid == TypeId::of::<i64>() { self.serde_deserialize() } else if typeid == TypeId::of::<u64>() { self.serde_deserialize() } else if typeid == TypeId::of::<f32>() { self.serde_deserialize() } else if typeid == TypeId::of::<f32>() { self.serde_deserialize() } else if typeid == TypeId::of::<Vec<u8>>() { self.serde_deserialize() } else if typeid == TypeId::of::<&[u8]>() { self.serde_deserialize() } else if typeid == TypeId::of::<&str>() { self.serde_deserialize() } else if typeid == TypeId::of::<String>() { self.serde_deserialize() } else { let len = self.get_le::<u32>()? as usize; let start = self.offset; if !self.set_position(start + len) { return Err(DataError::Str(format!("index overflow {}", line!()))) } rmp_serde::decode::from_read_ref(&self[start..self.offset]).map_err(|err| DataError::Other(err.into())) } } pub fn msgpack_serialize<T:Serialize+'static>(&mut self,value:T)->Result<(), DataError>{ let typeid =value.type_id(); if typeid == TypeId::of::<bool>() { self.serde_serialize(value) } else if typeid == TypeId::of::<i8>() { self.serde_serialize(value) } else if typeid == TypeId::of::<u8>() { self.serde_serialize(value) } else if typeid == TypeId::of::<i16>() { self.serde_serialize(value) } else if typeid == TypeId::of::<u16>() { self.serde_serialize(value) } else if typeid == TypeId::of::<i32>() { self.serde_serialize(value) } else if typeid == TypeId::of::<u32>() { self.serde_serialize(value) } else if typeid == TypeId::of::<i64>() { self.serde_serialize(value) } else if typeid == TypeId::of::<u64>() { self.serde_serialize(value) } else if typeid == TypeId::of::<f32>() { self.serde_serialize(value) } else if typeid == TypeId::of::<f32>() { self.serde_serialize(value) } else if typeid == TypeId::of::<Vec<u8>>() { self.serde_serialize(value) } else if typeid == TypeId::of::<&[u8]>() { self.serde_serialize(value) } else if typeid == TypeId::of::<&str>() { self.serde_serialize(value) } else if typeid == TypeId::of::<String>() { self.serde_serialize(value) } else { let buff = rmp_serde::encode::to_vec(&value).map_err(|err| DataError::Other(err.into()))?; self.serde_serialize(buff) } } }