diff --git a/README.md b/README.md index bcec8f21b84e..e833e02b81d8 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,9 @@ OpenDAL is in **alpha** stage and has been early adopted by [databend](https://g ```rust use anyhow::Result; use futures::AsyncReadExt; +use futures::StreamExt; use opendal::services::fs; +use opendal::ObjectMode; use opendal::Operator; #[tokio::main] @@ -38,6 +40,16 @@ async fn main() -> Result<()> { let meta = o.metadata().await?; assert_eq!(meta.content_length(), 13); + // List current dir. + let mut obs = op.objects("").map(|o| o.expect("list object")); + while let Some(o) = obs.next().await { + let meta = o.metadata().await?; + if meta.path().contains("test_file") { + let mode = meta.mode(); + assert!(mode.contains(ObjectMode::FILE)); + } + } + // Delete file. o.delete().await?; diff --git a/examples/basic.rs b/examples/basic.rs index ef4a5985d1e3..6c2631476081 100644 --- a/examples/basic.rs +++ b/examples/basic.rs @@ -40,7 +40,7 @@ async fn main() -> Result<()> { // Get file's Metadata let meta = o.metadata().await?; - assert_eq!(meta.content_length(), Some(13)); + assert_eq!(meta.content_length(), 13); // List current dir. let mut obs = op.objects("").map(|o| o.expect("list object")); @@ -48,7 +48,7 @@ async fn main() -> Result<()> { while let Some(o) = obs.next().await { let meta = o.metadata().await?; if meta.path().contains("test_file") { - let mode = meta.mode().expect("object mode"); + let mode = meta.mode(); assert!(mode.contains(ObjectMode::FILE)); found = true diff --git a/src/io.rs b/src/io.rs index aff3f99eee07..765025246493 100644 --- a/src/io.rs +++ b/src/io.rs @@ -127,12 +127,7 @@ impl AsyncSeek for Reader { ) -> Poll> { if let ReadState::Seeking(future) = &mut self.state { match ready!(Pin::new(future).poll(cx)) { - Ok(meta) => { - self.total_size = Some( - meta.content_length() - .expect("object doesn't have content length"), - ) - } + Ok(meta) => self.total_size = Some(meta.content_length()), Err(e) => return Poll::Ready(Err(io::Error::from(e))), } } diff --git a/src/object.rs b/src/object.rs index 6aabcf1ff84b..0c949b2e5bda 100644 --- a/src/object.rs +++ b/src/object.rs @@ -126,8 +126,10 @@ impl Metadata { self } - pub fn mode(&self) -> Option { - self.mode + pub fn mode(&self) -> ObjectMode { + debug_assert!(self.mode.is_some(), "mode must exist"); + + self.mode.unwrap_or_default() } pub(crate) fn set_mode(&mut self, mode: ObjectMode) -> &mut Self { @@ -135,8 +137,10 @@ impl Metadata { self } - pub fn content_length(&self) -> Option { - self.content_length + pub fn content_length(&self) -> u64 { + debug_assert!(self.content_length.is_some(), "content length must exist"); + + self.content_length.unwrap_or_default() } pub(crate) fn set_content_length(&mut self, content_length: u64) -> &mut Self { diff --git a/tests/behavior/behavior.rs b/tests/behavior/behavior.rs index 59c30f2f6b8f..82acaca8825f 100644 --- a/tests/behavior/behavior.rs +++ b/tests/behavior/behavior.rs @@ -67,7 +67,7 @@ impl BehaviorTest { // Step 3: Stat this file let meta = self.op.object(&path).metadata().await?; - assert_eq!(meta.content_length().unwrap(), size as u64, "stat file"); + assert_eq!(meta.content_length(), size as u64, "stat file"); // Step 4: Read this file's content // Step 4.1: Read the whole file. @@ -103,7 +103,7 @@ impl BehaviorTest { while let Some(o) = obs.next().await { let meta = o.metadata().await?; if meta.path() == path { - let mode = meta.mode().expect("object mode"); + let mode = meta.mode(); assert!( mode.contains(ObjectMode::FILE), "expected: {:?}, actual: {:?}",