use extension_traits::extension; use opendal::{Buffer, Error, ErrorKind, FuturesAsyncReader, Operator}; #[extension(pub trait OperatorExt)] impl Operator { async fn read_if_exists(&self, path: &str) -> Result, Error> { match self.read(path).await { Ok(buffer) => Ok(Some(buffer)), Err(error) if matches!(error.kind(), ErrorKind::NotFound) => Ok(None), Err(error) => Err(error), } } async fn async_reader_if_exists( &self, path: &str, ) -> Result, Error> { 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), } } }