This is an automated email from the ASF dual-hosted git repository.

xuanwo pushed a commit to branch polish-details
in repository https://gitbox.apache.org/repos/asf/incubator-opendal.git

commit c96dde150b3da54b37e815874f11b7062ed5e969
Author: Xuanwo <[email protected]>
AuthorDate: Thu Sep 14 15:12:04 2023 +0800

    Save work
    
    Signed-off-by: Xuanwo <[email protected]>
---
 core/src/layers/complete.rs | 73 ++++++++++++++++++++++++---------------------
 1 file changed, 39 insertions(+), 34 deletions(-)

diff --git a/core/src/layers/complete.rs b/core/src/layers/complete.rs
index 33565c9c8..f3c617912 100644
--- a/core/src/layers/complete.rs
+++ b/core/src/layers/complete.rs
@@ -138,6 +138,16 @@ impl<A: Accessor> Debug for CompleteReaderAccessor<A> {
 }
 
 impl<A: Accessor> CompleteReaderAccessor<A> {
+    fn new_unsupported_error(&self, op: impl Into<&'static str>) -> Error {
+        let scheme = self.meta.scheme();
+        let op = op.into();
+        Error::new(
+            ErrorKind::Unsupported,
+            &format!("service {scheme} doesn't support operation {op}"),
+        )
+        .with_operation(op)
+    }
+
     async fn complete_reader(
         &self,
         path: &str,
@@ -145,7 +155,7 @@ impl<A: Accessor> CompleteReaderAccessor<A> {
     ) -> Result<(RpRead, CompleteReader<A, A::Reader>)> {
         let capability = self.meta.native_capability();
         if !capability.read {
-            return new_capability_unsupported_error(Operation::Read);
+            return Err(self.new_unsupported_error(Operation::Read));
         }
 
         let seekable = capability.read_can_seek;
@@ -198,7 +208,7 @@ impl<A: Accessor> CompleteReaderAccessor<A> {
     ) -> Result<(RpRead, CompleteReader<A, A::BlockingReader>)> {
         let capability = self.meta.full_capability();
         if !capability.read || !capability.blocking {
-            return new_capability_unsupported_error(Operation::BlockingRead);
+            return Err(self.new_unsupported_error(Operation::BlockingRead));
         }
 
         let seekable = capability.read_can_seek;
@@ -254,11 +264,7 @@ impl<A: Accessor> CompleteReaderAccessor<A> {
     ) -> Result<(RpList, CompletePager<A, A::Pager>)> {
         let cap = self.meta.full_capability();
         if !cap.list {
-            return Err(
-                Error::new(ErrorKind::Unsupported, "operation is not 
supported")
-                    .with_context("service", self.meta.scheme())
-                    .with_operation("list"),
-            );
+            return Err(self.new_unsupported_error(Operation::List));
         }
 
         let delimiter = args.delimiter();
@@ -303,11 +309,7 @@ impl<A: Accessor> CompleteReaderAccessor<A> {
     ) -> Result<(RpList, CompletePager<A, A::BlockingPager>)> {
         let cap = self.meta.full_capability();
         if !cap.list {
-            return Err(
-                Error::new(ErrorKind::Unsupported, "operation is not 
supported")
-                    .with_context("service", self.meta.scheme())
-                    .with_operation("list"),
-            );
+            return Err(self.new_unsupported_error(Operation::BlockingList));
         }
 
         let delimiter = args.delimiter();
@@ -377,7 +379,7 @@ impl<A: Accessor> LayeredAccessor for 
CompleteReaderAccessor<A> {
     async fn create_dir(&self, path: &str, args: OpCreateDir) -> 
Result<RpCreateDir> {
         let capability = self.meta.full_capability();
         if !capability.create_dir {
-            return new_capability_unsupported_error(Operation::CreateDir);
+            return Err(self.new_unsupported_error(Operation::CreateDir));
         }
 
         self.inner().create_dir(path, args).await
@@ -390,12 +392,15 @@ impl<A: Accessor> LayeredAccessor for 
CompleteReaderAccessor<A> {
     async fn write(&self, path: &str, args: OpWrite) -> Result<(RpWrite, 
Self::Writer)> {
         let capability = self.meta.full_capability();
         if !capability.write {
-            return new_capability_unsupported_error(Operation::Write);
+            return Err(self.new_unsupported_error(Operation::Write));
         }
         if args.append() && !capability.write_can_append {
             return Err(Error::new(
                 ErrorKind::Unsupported,
-                "write with append enabled is not supported",
+                &format!(
+                    "service {} doesn't support operation write with append",
+                    self.info().scheme()
+                ),
             ));
         }
 
@@ -430,7 +435,7 @@ impl<A: Accessor> LayeredAccessor for 
CompleteReaderAccessor<A> {
     async fn copy(&self, from: &str, to: &str, args: OpCopy) -> Result<RpCopy> 
{
         let capability = self.meta.full_capability();
         if !capability.copy {
-            return new_capability_unsupported_error(Operation::Copy);
+            return Err(self.new_unsupported_error(Operation::Copy));
         }
 
         self.inner().copy(from, to, args).await
@@ -439,7 +444,7 @@ impl<A: Accessor> LayeredAccessor for 
CompleteReaderAccessor<A> {
     async fn rename(&self, from: &str, to: &str, args: OpRename) -> 
Result<RpRename> {
         let capability = self.meta.full_capability();
         if !capability.rename {
-            return new_capability_unsupported_error(Operation::Rename);
+            return Err(self.new_unsupported_error(Operation::Rename));
         }
 
         self.inner().rename(from, to, args).await
@@ -448,7 +453,7 @@ impl<A: Accessor> LayeredAccessor for 
CompleteReaderAccessor<A> {
     async fn stat(&self, path: &str, args: OpStat) -> Result<RpStat> {
         let capability = self.meta.full_capability();
         if !capability.stat {
-            return new_capability_unsupported_error(Operation::Stat);
+            return Err(self.new_unsupported_error(Operation::Stat));
         }
 
         self.inner.stat(path, args).await.map(|v| {
@@ -462,7 +467,7 @@ impl<A: Accessor> LayeredAccessor for 
CompleteReaderAccessor<A> {
     async fn delete(&self, path: &str, args: OpDelete) -> Result<RpDelete> {
         let capability = self.meta.full_capability();
         if !capability.delete {
-            return new_capability_unsupported_error(Operation::Delete);
+            return Err(self.new_unsupported_error(Operation::Delete));
         }
 
         self.inner().delete(path, args).await
@@ -471,7 +476,7 @@ impl<A: Accessor> LayeredAccessor for 
CompleteReaderAccessor<A> {
     async fn list(&self, path: &str, args: OpList) -> Result<(RpList, 
Self::Pager)> {
         let capability = self.meta.full_capability();
         if !capability.list {
-            return new_capability_unsupported_error(Operation::List);
+            return Err(self.new_unsupported_error(Operation::List));
         }
 
         self.complete_list(path, args).await
@@ -480,7 +485,7 @@ impl<A: Accessor> LayeredAccessor for 
CompleteReaderAccessor<A> {
     async fn batch(&self, args: OpBatch) -> Result<RpBatch> {
         let capability = self.meta.full_capability();
         if !capability.batch {
-            return new_capability_unsupported_error(Operation::Batch);
+            return Err(self.new_unsupported_error(Operation::Batch));
         }
 
         self.inner().batch(args).await
@@ -489,7 +494,7 @@ impl<A: Accessor> LayeredAccessor for 
CompleteReaderAccessor<A> {
     async fn presign(&self, path: &str, args: OpPresign) -> Result<RpPresign> {
         let capability = self.meta.full_capability();
         if !capability.presign {
-            return new_capability_unsupported_error(Operation::Presign);
+            return Err(self.new_unsupported_error(Operation::Presign));
         }
 
         self.inner.presign(path, args).await
@@ -498,7 +503,7 @@ impl<A: Accessor> LayeredAccessor for 
CompleteReaderAccessor<A> {
     fn blocking_create_dir(&self, path: &str, args: OpCreateDir) -> 
Result<RpCreateDir> {
         let capability = self.meta.full_capability();
         if !capability.create_dir || !capability.blocking {
-            return 
new_capability_unsupported_error(Operation::BlockingCreateDir);
+            return 
Err(self.new_unsupported_error(Operation::BlockingCreateDir));
         }
 
         self.inner().blocking_create_dir(path, args)
@@ -511,12 +516,16 @@ impl<A: Accessor> LayeredAccessor for 
CompleteReaderAccessor<A> {
     fn blocking_write(&self, path: &str, args: OpWrite) -> Result<(RpWrite, 
Self::BlockingWriter)> {
         let capability = self.meta.full_capability();
         if !capability.write || !capability.blocking {
-            return new_capability_unsupported_error(Operation::BlockingWrite);
+            return Err(self.new_unsupported_error(Operation::BlockingWrite));
         }
+
         if args.append() && !capability.write_can_append {
             return Err(Error::new(
                 ErrorKind::Unsupported,
-                "write with append enabled is not supported",
+                &format!(
+                    "service {} doesn't support operation write with append",
+                    self.info().scheme()
+                ),
             ));
         }
 
@@ -528,7 +537,7 @@ impl<A: Accessor> LayeredAccessor for 
CompleteReaderAccessor<A> {
     fn blocking_copy(&self, from: &str, to: &str, args: OpCopy) -> 
Result<RpCopy> {
         let capability = self.meta.full_capability();
         if !capability.copy || !capability.blocking {
-            return new_capability_unsupported_error(Operation::BlockingCopy);
+            return Err(self.new_unsupported_error(Operation::BlockingCopy));
         }
 
         self.inner().blocking_copy(from, to, args)
@@ -537,7 +546,7 @@ impl<A: Accessor> LayeredAccessor for 
CompleteReaderAccessor<A> {
     fn blocking_rename(&self, from: &str, to: &str, args: OpRename) -> 
Result<RpRename> {
         let capability = self.meta.full_capability();
         if !capability.rename || !capability.blocking {
-            return new_capability_unsupported_error(Operation::BlockingRename);
+            return Err(self.new_unsupported_error(Operation::BlockingRename));
         }
 
         self.inner().blocking_rename(from, to, args)
@@ -546,7 +555,7 @@ impl<A: Accessor> LayeredAccessor for 
CompleteReaderAccessor<A> {
     fn blocking_stat(&self, path: &str, args: OpStat) -> Result<RpStat> {
         let capability = self.meta.full_capability();
         if !capability.stat || !capability.blocking {
-            return new_capability_unsupported_error(Operation::BlockingStat);
+            return Err(self.new_unsupported_error(Operation::BlockingStat));
         }
 
         self.inner.blocking_stat(path, args).map(|v| {
@@ -560,7 +569,7 @@ impl<A: Accessor> LayeredAccessor for 
CompleteReaderAccessor<A> {
     fn blocking_delete(&self, path: &str, args: OpDelete) -> Result<RpDelete> {
         let capability = self.meta.full_capability();
         if !capability.delete || !capability.blocking {
-            return new_capability_unsupported_error(Operation::BlockingDelete);
+            return Err(self.new_unsupported_error(Operation::BlockingDelete));
         }
 
         self.inner().blocking_delete(path, args)
@@ -569,7 +578,7 @@ impl<A: Accessor> LayeredAccessor for 
CompleteReaderAccessor<A> {
     fn blocking_list(&self, path: &str, args: OpList) -> Result<(RpList, 
Self::BlockingPager)> {
         let capability = self.meta.full_capability();
         if !capability.list || !capability.blocking {
-            return new_capability_unsupported_error(Operation::BlockingList);
+            return Err(self.new_unsupported_error(Operation::BlockingList));
         }
 
         self.complete_blocking_list(path, args)
@@ -783,10 +792,6 @@ where
     }
 }
 
-fn new_capability_unsupported_error<R>(operation: Operation) -> Result<R> {
-    Err(Error::new(ErrorKind::Unsupported, "operation is not 
supported").with_operation(operation))
-}
-
 #[cfg(test)]
 mod tests {
     use std::collections::HashMap;

Reply via email to