use crate::{error::DecodeResult, reader::TdfReader, tag::TdfType, writer::TdfWriter};
use std::io;
pub trait Decodable: Sized {
fn decode(reader: &mut TdfReader) -> DecodeResult<Self>;
}
pub trait Encodable: Sized {
fn encode(&self, writer: &mut TdfWriter);
fn encode_bytes(&self) -> Vec<u8> {
let mut output = TdfWriter::default();
self.encode(&mut output);
output.into()
}
}
pub trait ValueType {
fn value_type() -> TdfType;
}
#[macro_export]
macro_rules! value_type {
($for:ty, $type:expr) => {
impl $crate::codec::ValueType for $for {
fn value_type() -> $crate::tag::TdfType {
$type
}
}
};
}
pub(crate) fn decode_u16_be(value: &[u8]) -> io::Result<u16> {
Ok(u16::from_be_bytes(value.try_into().map_err(|_| {
io::Error::new(
io::ErrorKind::InvalidData,
"Unable to fit u16 bytes into u16",
)
})?))
}
pub(crate) fn encode_u16_be(value: &u16, output: &mut Vec<u8>) {
let bytes = value.to_be_bytes();
output.extend_from_slice(&bytes);
}