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
use error::Error; use pointer::Pointer; use pointer::Referenceable; use serde_cbor::{to_vec, Value}; use std::mem::transmute; pub trait Responsable { fn to_response(self) -> Pointer; } impl<V: Into<Value>> Responsable for Result<V, Error> { fn to_response(self: Result<V, Error>) -> Pointer { let (return_code, mut return_value) = match self { Ok(value) => (0, to_vec(&value.into()).unwrap()), Err(error) => { ( error.0, to_vec(&serde_cbor::Value::String(error.1)).unwrap(), ) } }; let mut return_code_bytes = unsafe { transmute::<u32, [u8; 4]>(return_code as u32) }.to_vec(); return_code_bytes.append(&mut return_value); return_code_bytes.as_pointer() } } pub trait Bytes<T> { fn value(&self) -> T; } impl Bytes<u64> for Vec<u8> { fn value(&self) -> u64 { if self.len() == 8 { let mut slice: [u8; 8] = [0; 8]; slice.copy_from_slice(&self[..]); unsafe { transmute::<[u8; 8], u64>(slice) } } else { 0 } } } impl Bytes<u32> for Vec<u8> { fn value(&self) -> u32 { if self.len() == 4 { let mut slice: [u8; 4] = [0; 4]; slice.copy_from_slice(&self[..]); unsafe { transmute::<[u8; 4], u32>(slice) } } else { 0 } } }