use crate::raw::*;
use crate::*;
use std::fmt::Debug;
use std::fmt::Formatter;
pub struct TypeEraseLayer;
impl<A: Access> Layer<A> for TypeEraseLayer {
type LayeredAccess = TypeEraseAccessor<A>;
fn layer(&self, inner: A) -> Self::LayeredAccess {
TypeEraseAccessor { inner }
}
}
pub struct TypeEraseAccessor<A: Access> {
inner: A,
}
impl<A: Access> Debug for TypeEraseAccessor<A> {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
self.inner.fmt(f)
}
}
impl<A: Access> LayeredAccess for TypeEraseAccessor<A> {
type Inner = A;
type Reader = oio::Reader;
type Writer = oio::Writer;
type Lister = oio::Lister;
type Deleter = oio::Deleter;
type BlockingReader = oio::BlockingReader;
type BlockingWriter = oio::BlockingWriter;
type BlockingLister = oio::BlockingLister;
type BlockingDeleter = oio::BlockingDeleter;
fn inner(&self) -> &Self::Inner {
&self.inner
}
async fn read(&self, path: &str, args: OpRead) -> Result<(RpRead, Self::Reader)> {
self.inner
.read(path, args)
.await
.map(|(rp, r)| (rp, Box::new(r) as oio::Reader))
}
async fn write(&self, path: &str, args: OpWrite) -> Result<(RpWrite, Self::Writer)> {
self.inner
.write(path, args)
.await
.map(|(rp, w)| (rp, Box::new(w) as oio::Writer))
}
async fn delete(&self) -> Result<(RpDelete, Self::Deleter)> {
self.inner
.delete()
.await
.map(|(rp, p)| (rp, Box::new(p) as oio::Deleter))
}
async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Lister)> {
self.inner
.list(path, args)
.await
.map(|(rp, p)| (rp, Box::new(p) as oio::Lister))
}
fn blocking_read(&self, path: &str, args: OpRead) -> Result<(RpRead, Self::BlockingReader)> {
self.inner
.blocking_read(path, args)
.map(|(rp, r)| (rp, Box::new(r) as oio::BlockingReader))
}
fn blocking_write(&self, path: &str, args: OpWrite) -> Result<(RpWrite, Self::BlockingWriter)> {
self.inner
.blocking_write(path, args)
.map(|(rp, w)| (rp, Box::new(w) as oio::BlockingWriter))
}
fn blocking_delete(&self) -> Result<(RpDelete, Self::BlockingDeleter)> {
self.inner
.blocking_delete()
.map(|(rp, p)| (rp, Box::new(p) as oio::BlockingDeleter))
}
fn blocking_list(&self, path: &str, args: OpList) -> Result<(RpList, Self::BlockingLister)> {
self.inner
.blocking_list(path, args)
.map(|(rp, p)| (rp, Box::new(p) as oio::BlockingLister))
}
}