use std::io::{Cursor, Read};
use crate::{impl_stream_deserializer, utils::ParseResult};
use super::core::DataReader;
impl<T: StreamDecodable> StreamDecodable for Option<T> {
fn from_stream_parser<R: Read>(parser: &mut DataReader<R>) -> ParseResult<Self> {
let flag = parser.get_bool()?;
if flag {
Ok(Some(T::from_stream_parser(parser)?))
} else {
Ok(None)
}
}
}
impl<T: StreamDecodable> StreamDecodable for Vec<T> {
fn from_stream_parser<R: Read>(parser: &mut DataReader<R>) -> ParseResult<Self> {
let len = parser.get_u32()?;
let mut out = Vec::with_capacity(len as usize);
let options = parser.options.clone();
for _ in 0..len {
let item_len = parser.get_u32()?;
let item_bytes = parser.get_bytes(item_len as usize)?.to_vec();
let mut cursor = Cursor::new(item_bytes);
let mut temp_parser = DataReader::with_options(&mut cursor, options.clone());
out.push(T::from_stream_parser(&mut temp_parser)?);
}
Ok(out)
}
}
pub trait StreamDecodable: Sized {
fn from_stream_parser<R: Read>(parser: &mut DataReader<R>) -> ParseResult<Self>;
}
impl_stream_deserializer!(u8, u16, u32, u64, usize, i8, i16, i32, i64, isize, f32, f64);