opendal_core/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;
34
35 fn close(&mut self) -> impl Future<Output = Result<Metadata>> + MaybeSend;
37
38 fn abort(&mut self) -> impl Future<Output = Result<()>> + MaybeSend;
40}
41
42impl Write for () {
43 async fn write(&mut self, _: Buffer) -> Result<()> {
44 unimplemented!("write is required to be implemented for oio::Write")
45 }
46
47 async fn close(&mut self) -> Result<Metadata> {
48 Err(Error::new(
49 ErrorKind::Unsupported,
50 "output writer doesn't support close",
51 ))
52 }
53
54 async fn abort(&mut self) -> Result<()> {
55 Err(Error::new(
56 ErrorKind::Unsupported,
57 "output writer doesn't support abort",
58 ))
59 }
60}
61
62pub trait WriteDyn: Unpin + Send + Sync {
64 fn write_dyn(&mut self, bs: Buffer) -> BoxedFuture<'_, Result<()>>;
66
67 fn close_dyn(&mut self) -> BoxedFuture<'_, Result<Metadata>>;
69
70 fn abort_dyn(&mut self) -> BoxedFuture<'_, Result<()>>;
72}
73
74impl<T: Write + ?Sized> WriteDyn for T {
75 fn write_dyn(&mut self, bs: Buffer) -> BoxedFuture<'_, Result<()>> {
76 Box::pin(self.write(bs))
77 }
78
79 fn close_dyn(&mut self) -> BoxedFuture<'_, Result<Metadata>> {
80 Box::pin(self.close())
81 }
82
83 fn abort_dyn(&mut self) -> BoxedFuture<'_, Result<()>> {
84 Box::pin(self.abort())
85 }
86}
87
88impl<T: WriteDyn + ?Sized> Write for Box<T> {
89 async fn write(&mut self, bs: Buffer) -> Result<()> {
90 self.deref_mut().write_dyn(bs).await
91 }
92
93 async fn close(&mut self) -> Result<Metadata> {
94 self.deref_mut().close_dyn().await
95 }
96
97 async fn abort(&mut self) -> Result<()> {
98 self.deref_mut().abort_dyn().await
99 }
100}