pub(crate) trait Encode { fn encode(&self, e: &mut Vec); } impl Encode for &'_ T { fn encode(&self, e: &mut Vec) { T::encode(self, e) } } impl Encode for Box { fn encode(&self, e: &mut Vec) { T::encode(self, e) } } impl Encode for [T] { fn encode(&self, e: &mut Vec) { self.len().encode(e); for item in self { item.encode(e); } } } impl Encode for Vec { fn encode(&self, e: &mut Vec) { <[T]>::encode(self, e) } } impl Encode for str { fn encode(&self, e: &mut Vec) { self.len().encode(e); e.extend_from_slice(self.as_bytes()); } } impl Encode for usize { fn encode(&self, e: &mut Vec) { assert!(*self <= u32::max_value() as usize); (*self as u32).encode(e) } } impl Encode for u8 { fn encode(&self, e: &mut Vec) { e.push(*self); } } impl Encode for u32 { fn encode(&self, e: &mut Vec) { leb128::write::unsigned(e, (*self).into()).unwrap(); } } impl Encode for i32 { fn encode(&self, e: &mut Vec) { leb128::write::signed(e, (*self).into()).unwrap(); } } impl Encode for u64 { fn encode(&self, e: &mut Vec) { leb128::write::unsigned(e, *self).unwrap(); } } impl Encode for i64 { fn encode(&self, e: &mut Vec) { leb128::write::signed(e, *self).unwrap(); } } impl Encode for (T, U) { fn encode(&self, e: &mut Vec) { self.0.encode(e); self.1.encode(e); } } impl Encode for (T, U, V) { fn encode(&self, e: &mut Vec) { self.0.encode(e); self.1.encode(e); self.2.encode(e); } }