opendal/layers/
type_eraser.rs1use std::fmt::Debug;
19use std::fmt::Formatter;
20
21use crate::raw::*;
22use crate::*;
23
24pub struct TypeEraseLayer;
33
34impl<A: Access> Layer<A> for TypeEraseLayer {
35 type LayeredAccess = TypeEraseAccessor<A>;
36
37 fn layer(&self, inner: A) -> Self::LayeredAccess {
38 TypeEraseAccessor { inner }
39 }
40}
41
42pub struct TypeEraseAccessor<A: Access> {
44 inner: A,
45}
46
47impl<A: Access> Debug for TypeEraseAccessor<A> {
48 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
49 self.inner.fmt(f)
50 }
51}
52
53impl<A: Access> LayeredAccess for TypeEraseAccessor<A> {
54 type Inner = A;
55 type Reader = oio::Reader;
56 type Writer = oio::Writer;
57 type Lister = oio::Lister;
58 type Deleter = oio::Deleter;
59
60 fn inner(&self) -> &Self::Inner {
61 &self.inner
62 }
63
64 async fn read(&self, path: &str, args: OpRead) -> Result<(RpRead, Self::Reader)> {
65 self.inner
66 .read(path, args)
67 .await
68 .map(|(rp, r)| (rp, Box::new(r) as oio::Reader))
69 }
70
71 async fn write(&self, path: &str, args: OpWrite) -> Result<(RpWrite, Self::Writer)> {
72 self.inner
73 .write(path, args)
74 .await
75 .map(|(rp, w)| (rp, Box::new(w) as oio::Writer))
76 }
77
78 async fn delete(&self) -> Result<(RpDelete, Self::Deleter)> {
79 self.inner
80 .delete()
81 .await
82 .map(|(rp, p)| (rp, Box::new(p) as oio::Deleter))
83 }
84
85 async fn list(&self, path: &str, args: OpList) -> Result<(RpList, Self::Lister)> {
86 self.inner
87 .list(path, args)
88 .await
89 .map(|(rp, p)| (rp, Box::new(p) as oio::Lister))
90 }
91}