use super::{Error, Result};
use std::{any::TypeId, fmt::Debug, io::Write};
mod owned;
use owned::OwnedDataSource;
mod file;
use file::FileDataSource;
pub trait DataSource: Debug {
fn len(&self) -> Option<u64>;
fn prepare(&mut self) -> Result<u64>;
fn as_datatype(&mut self) -> &mut dyn std::any::Any;
}
pub trait StdWriter: DataSource {
fn write(&mut self, writer: &mut dyn Write) -> Result<()>;
}
impl<'a> TryInto<&'a mut dyn StdWriter> for &'a mut Box<dyn DataSource> {
type Error = Error;
fn try_into(self) -> Result<&'a mut dyn StdWriter> {
let data_type = self.as_datatype();
if data_type.type_id() == TypeId::of::<OwnedDataSource>() {
Ok(data_type.downcast_mut::<OwnedDataSource>().unwrap())
} else if data_type.type_id() == TypeId::of::<FileDataSource>() {
Ok(data_type.downcast_mut::<FileDataSource>().unwrap())
} else {
Err(Error::Invalid("Unknown data type.".into()))
}
}
}