opendal/raw/oio/write/
api.rs1use std::future::Future;
19use std::ops::DerefMut;
20
21use crate::raw::*;
22use crate::*;
23
24pub type Writer = Box<dyn WriteDyn>;
26
27pub trait Write: Unpin + Send + Sync {
29 fn write(&mut self, bs: Buffer) -> impl Future<Output = Result<()>> + MaybeSend;
36
37 fn close(&mut self) -> impl Future<Output = Result<Metadata>> + MaybeSend;
39
40 fn abort(&mut self) -> impl Future<Output = Result<()>> + MaybeSend;
42}
43
44impl Write for () {
45 async fn write(&mut self, _: Buffer) -> Result<()> {
46 unimplemented!("write is required to be implemented for oio::Write")
47 }
48
49 async fn close(&mut self) -> Result<Metadata> {
50 Err(Error::new(
51 ErrorKind::Unsupported,
52 "output writer doesn't support close",
53 ))
54 }
55
56 async fn abort(&mut self) -> Result<()> {
57 Err(Error::new(
58 ErrorKind::Unsupported,
59 "output writer doesn't support abort",
60 ))
61 }
62}
63
64pub trait WriteDyn: Unpin + Send + Sync {
67 fn write_dyn(&mut self, bs: Buffer) -> BoxedFuture<'_, Result<()>>;
69
70 fn close_dyn(&mut self) -> BoxedFuture<'_, Result<Metadata>>;
72
73 fn abort_dyn(&mut self) -> BoxedFuture<'_, Result<()>>;
75}
76
77impl<T: Write + ?Sized> WriteDyn for T {
78 fn write_dyn(&mut self, bs: Buffer) -> BoxedFuture<'_, Result<()>> {
79 Box::pin(self.write(bs))
80 }
81
82 fn close_dyn(&mut self) -> BoxedFuture<'_, Result<Metadata>> {
83 Box::pin(self.close())
84 }
85
86 fn abort_dyn(&mut self) -> BoxedFuture<'_, Result<()>> {
87 Box::pin(self.abort())
88 }
89}
90
91impl<T: WriteDyn + ?Sized> Write for Box<T> {
92 async fn write(&mut self, bs: Buffer) -> Result<()> {
93 self.deref_mut().write_dyn(bs).await
94 }
95
96 async fn close(&mut self) -> Result<Metadata> {
97 self.deref_mut().close_dyn().await
98 }
99
100 async fn abort(&mut self) -> Result<()> {
101 self.deref_mut().abort_dyn().await
102 }
103}