use super::core::DataEncoder;
use crate::impl_encodable;
use crate::utils::ParseResult;
impl DataEncoder {
pub fn add_string(&mut self, data: impl Into<String>) -> ParseResult<()> {
let data: String = data.into();
self.add_u32(data.len() as u32)?;
self.add_item(data)
}
pub fn add_bool(&mut self, data: bool) -> ParseResult<()> {
self.add_item(vec![data as u8])
}
}
pub trait Encodable {
fn encode_data(&self, encoder: &mut DataEncoder) -> ParseResult<()>;
}
impl<T: Encodable> Encodable for Option<T> {
fn encode_data(&self, writer: &mut DataEncoder) -> ParseResult<()> {
match self {
Some(value) => {
writer.add_bool(true)?;
value.encode_data(writer)
}
None => {
writer.add_bool(false)?;
Ok(())
}
}
}
}
impl<T: Encodable> Encodable for Vec<T> {
fn encode_data(&self, encoder: &mut DataEncoder) -> ParseResult<()> {
encoder.add_slice(self)
}
}
impl<T: Encodable, const N: usize> Encodable for [T; N] {
fn encode_data(&self, encoder: &mut DataEncoder) -> ParseResult<()> {
for item in self {
item.encode_data(encoder)?;
}
Ok(())
}
}
impl Encodable for String {
fn encode_data(&self, encoder: &mut DataEncoder) -> ParseResult<()> {
encoder.add_u32(self.len() as u32)?;
encoder.add_item(self.as_bytes())
}
}
impl_encodable!(u8, u16, u32, u64, usize, i8, i16, i32, i64, isize, f32, f64);