pub trait Serialize {
fn serialize(&self) -> Vec<u8>;
}
impl Serialize for u8 {
fn serialize(&self) -> Vec<u8> {
vec![*self]
}
}
impl Serialize for u16 {
fn serialize(&self) -> Vec<u8> {
self.to_le_bytes().to_vec()
}
}
impl Serialize for u32 {
fn serialize(&self) -> Vec<u8> {
self.to_le_bytes().to_vec()
}
}
impl Serialize for u64 {
fn serialize(&self) -> Vec<u8> {
self.to_le_bytes().to_vec()
}
}
impl Serialize for i32 {
fn serialize(&self) -> Vec<u8> {
self.to_le_bytes().to_vec()
}
}
impl Serialize for i64 {
fn serialize(&self) -> Vec<u8> {
self.to_le_bytes().to_vec()
}
}
impl Serialize for f32 {
fn serialize(&self) -> Vec<u8> {
self.to_le_bytes().to_vec()
}
}
impl Serialize for f64 {
fn serialize(&self) -> Vec<u8> {
self.to_le_bytes().to_vec()
}
}
impl Serialize for bool {
fn serialize(&self) -> Vec<u8> {
vec![*self as u8]
}
}
impl Serialize for char {
fn serialize(&self) -> Vec<u8> {
(*self as u32).serialize()
}
}
impl Serialize for String {
fn serialize(&self) -> Vec<u8> {
let mut bytes = Vec::new();
bytes.push(self.len() as u8);
bytes.extend(self.as_bytes());
bytes
}
}
impl Serialize for Vec<u8> {
fn serialize(&self) -> Vec<u8> {
self.clone()
}
}
impl<T: Serialize> Serialize for Option<T> {
fn serialize(&self) -> Vec<u8> {
match self {
None => vec![],
Some(value) => value.serialize(),
}
}
}