use super::super::super::std::any::*;
use std::{any::*, io};
pub trait AnyWriter: io::Write + ToAny + Send {}
pub type AnyWriterRef = Box<dyn AnyWriter>;
pub trait AnySeekWriter: io::Seek + io::Write + ToAny + Send {}
pub type AnySeekWriterRef = Box<dyn AnySeekWriter>;
pub struct AnyWriterWrapper<WriteT> {
pub inner: Option<WriteT>,
}
impl<WriteT> AnyWriterWrapper<WriteT> {
pub fn new(inner: WriteT) -> Box<Self> {
Box::new(Self { inner: Some(inner) })
}
}
impl<WriteT> ToAny for AnyWriterWrapper<WriteT>
where
WriteT: Any,
{
fn to_any(&mut self) -> Option<Box<dyn Any>> {
self.inner.take().map(|inner| Box::new(inner) as Box<dyn Any>)
}
}
impl<WriteT> AnyWriter for AnyWriterWrapper<WriteT> where WriteT: io::Write + Any + Send {}
impl<WriteT> AnySeekWriter for AnyWriterWrapper<WriteT> where WriteT: io::Seek + io::Write + Any + Send {}
impl<WriteT> io::Seek for AnyWriterWrapper<WriteT>
where
WriteT: io::Seek,
{
fn seek(&mut self, from: io::SeekFrom) -> io::Result<u64> {
self.inner.as_mut().expect("initialized").seek(from)
}
}
impl<WriteT> io::Write for AnyWriterWrapper<WriteT>
where
WriteT: io::Write,
{
fn write(&mut self, buffer: &[u8]) -> io::Result<usize> {
self.inner.as_mut().expect("initialized").write(buffer)
}
fn flush(&mut self) -> io::Result<()> {
self.inner.as_mut().expect("initialized").flush()
}
}
pub trait IntoAnyWriter<WriteT> {
fn into_any_writer(self) -> Box<AnyWriterWrapper<WriteT>>;
}
impl<WriteT> IntoAnyWriter<WriteT> for WriteT
where
WriteT: io::Write + Any,
{
fn into_any_writer(self) -> Box<AnyWriterWrapper<WriteT>> {
AnyWriterWrapper::new(self)
}
}