use extension_traits::extension; use opendal::{Buffer, Error, ErrorKind, FuturesAsyncReader, Operator}; #[extension(pub trait OperatorExt)] impl Operator { fn read_if_exists( &self, path: &str, ) -> impl Future, Error>> + Send { async { match self.read(path).await { Ok(buffer) => Ok(Some(buffer)), Err(error) if matches!(error.kind(), ErrorKind::NotFound) => Ok(None), Err(error) => Err(error), } } } fn async_reader_if_exists( &self, path: &str, ) -> impl Future, Error>> + Send { async { let reader = self.reader(path).await?; match reader.into_futures_async_read(..).await { Ok(reader) => Ok(Some(reader)), Err(error) if matches!(error.kind(), ErrorKind::NotFound) => Ok(None), Err(error) => Err(error), } } } }