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

xuanwo pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/opendal.git


The following commit(s) were added to refs/heads/main by this push:
     new f7ed24673 refactor: Introduce VercelArtifactsCore for improved service 
structure (#5873)
f7ed24673 is described below

commit f7ed24673c828fd9c50b6ef45742b9d3125bb5b2
Author: miro <[email protected]>
AuthorDate: Tue Mar 25 11:27:54 2025 +0800

    refactor: Introduce VercelArtifactsCore for improved service structure 
(#5873)
---
 core/src/services/vercel_artifacts/backend.rs      | 105 ++++-----------------
 core/src/services/vercel_artifacts/builder.rs      |  52 +++++-----
 .../vercel_artifacts/{backend.rs => core.rs}       |  75 ++-------------
 core/src/services/vercel_artifacts/error.rs        |   4 +-
 core/src/services/vercel_artifacts/mod.rs          |   2 +
 core/src/services/vercel_artifacts/writer.rs       |  18 ++--
 6 files changed, 68 insertions(+), 188 deletions(-)

diff --git a/core/src/services/vercel_artifacts/backend.rs 
b/core/src/services/vercel_artifacts/backend.rs
index 3b8f87551..e6137349e 100644
--- a/core/src/services/vercel_artifacts/backend.rs
+++ b/core/src/services/vercel_artifacts/backend.rs
@@ -18,11 +18,10 @@
 use std::fmt::Debug;
 use std::sync::Arc;
 
-use http::header;
-use http::Request;
 use http::Response;
 use http::StatusCode;
 
+use super::core::VercelArtifactsCore;
 use super::error::parse_error;
 use super::writer::VercelArtifactsWriter;
 use crate::raw::*;
@@ -31,16 +30,14 @@ use crate::*;
 #[doc = include_str!("docs.md")]
 #[derive(Clone)]
 pub struct VercelArtifactsBackend {
-    pub info: Arc<AccessorInfo>,
-    pub(crate) access_token: String,
-    pub(crate) client: HttpClient,
+    pub core: Arc<VercelArtifactsCore>,
 }
 
 impl Debug for VercelArtifactsBackend {
     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let mut de = f.debug_struct("VercelArtifactsBackend");
-        de.field("access_token", &self.access_token);
-        de.finish()
+        f.debug_struct("VercelArtifactsBackend")
+            .field("core", &self.core)
+            .finish()
     }
 }
 
@@ -55,33 +52,38 @@ impl Access for VercelArtifactsBackend {
     type BlockingDeleter = ();
 
     fn info(&self) -> Arc<AccessorInfo> {
-        self.info.clone()
+        self.core.info.clone()
     }
 
     async fn stat(&self, path: &str, _args: OpStat) -> Result<RpStat> {
-        let res = self.vercel_artifacts_stat(path).await?;
+        let response = self.core.vercel_artifacts_stat(path).await?;
 
-        let status = res.status();
+        let status = response.status();
 
         match status {
             StatusCode::OK => {
-                let meta = parse_into_metadata(path, res.headers())?;
+                let meta = parse_into_metadata(path, response.headers())?;
                 Ok(RpStat::new(meta))
             }
 
-            _ => Err(parse_error(res)),
+            _ => Err(parse_error(response)),
         }
     }
 
     async fn read(&self, path: &str, args: OpRead) -> Result<(RpRead, 
Self::Reader)> {
-        let resp = self.vercel_artifacts_get(path, args.range(), &args).await?;
+        let response = self
+            .core
+            .vercel_artifacts_get(path, args.range(), &args)
+            .await?;
 
-        let status = resp.status();
+        let status = response.status();
 
         match status {
-            StatusCode::OK | StatusCode::PARTIAL_CONTENT => Ok((RpRead::new(), 
resp.into_body())),
+            StatusCode::OK | StatusCode::PARTIAL_CONTENT => {
+                Ok((RpRead::new(), response.into_body()))
+            }
             _ => {
-                let (part, mut body) = resp.into_parts();
+                let (part, mut body) = response.into_parts();
                 let buf = body.to_buffer().await?;
                 Err(parse_error(Response::from_parts(part, buf)))
             }
@@ -92,77 +94,10 @@ impl Access for VercelArtifactsBackend {
         Ok((
             RpWrite::default(),
             oio::OneShotWriter::new(VercelArtifactsWriter::new(
-                self.clone(),
+                self.core.clone(),
                 args,
                 path.to_string(),
             )),
         ))
     }
 }
-
-impl VercelArtifactsBackend {
-    pub async fn vercel_artifacts_get(
-        &self,
-        hash: &str,
-        range: BytesRange,
-        _: &OpRead,
-    ) -> Result<Response<HttpBody>> {
-        let url: String = format!(
-            "https://api.vercel.com/v8/artifacts/{}";,
-            percent_encode_path(hash)
-        );
-
-        let mut req = Request::get(&url);
-
-        if !range.is_full() {
-            req = req.header(header::RANGE, range.to_header());
-        }
-
-        let auth_header_content = format!("Bearer {}", self.access_token);
-        req = req.header(header::AUTHORIZATION, auth_header_content);
-
-        let req = req.body(Buffer::new()).map_err(new_request_build_error)?;
-
-        self.client.fetch(req).await
-    }
-
-    pub async fn vercel_artifacts_put(
-        &self,
-        hash: &str,
-        size: u64,
-        body: Buffer,
-    ) -> Result<Response<Buffer>> {
-        let url = format!(
-            "https://api.vercel.com/v8/artifacts/{}";,
-            percent_encode_path(hash)
-        );
-
-        let mut req = Request::put(&url);
-
-        let auth_header_content = format!("Bearer {}", self.access_token);
-        req = req.header(header::CONTENT_TYPE, "application/octet-stream");
-        req = req.header(header::AUTHORIZATION, auth_header_content);
-        req = req.header(header::CONTENT_LENGTH, size);
-
-        let req = req.body(body).map_err(new_request_build_error)?;
-
-        self.client.send(req).await
-    }
-
-    pub async fn vercel_artifacts_stat(&self, hash: &str) -> 
Result<Response<Buffer>> {
-        let url = format!(
-            "https://api.vercel.com/v8/artifacts/{}";,
-            percent_encode_path(hash)
-        );
-
-        let mut req = Request::head(&url);
-
-        let auth_header_content = format!("Bearer {}", self.access_token);
-        req = req.header(header::AUTHORIZATION, auth_header_content);
-        req = req.header(header::CONTENT_LENGTH, 0);
-
-        let req = req.body(Buffer::new()).map_err(new_request_build_error)?;
-
-        self.client.send(req).await
-    }
-}
diff --git a/core/src/services/vercel_artifacts/builder.rs 
b/core/src/services/vercel_artifacts/builder.rs
index 4881048e0..9c0fe426d 100644
--- a/core/src/services/vercel_artifacts/builder.rs
+++ b/core/src/services/vercel_artifacts/builder.rs
@@ -17,8 +17,10 @@
 
 use std::fmt::Debug;
 use std::fmt::Formatter;
+use std::sync::Arc;
 
 use super::backend::VercelArtifactsBackend;
+use super::core::VercelArtifactsCore;
 use crate::raw::HttpClient;
 use crate::raw::{Access, AccessorInfo};
 use crate::services::VercelArtifactsConfig;
@@ -86,36 +88,36 @@ impl Builder for VercelArtifactsBuilder {
             })?
         };
 
-        match self.config.access_token.clone() {
-            Some(access_token) => Ok(VercelArtifactsBackend {
-                info: {
-                    let ma = AccessorInfo::default();
-                    ma.set_scheme(Scheme::VercelArtifacts)
-                        .set_native_capability(Capability {
-                            stat: true,
-                            stat_has_cache_control: true,
-                            stat_has_content_length: true,
-                            stat_has_content_type: true,
-                            stat_has_content_encoding: true,
-                            stat_has_content_range: true,
-                            stat_has_etag: true,
-                            stat_has_content_md5: true,
-                            stat_has_last_modified: true,
-                            stat_has_content_disposition: true,
+        let info = AccessorInfo::default();
+        info.set_scheme(Scheme::VercelArtifacts)
+            .set_native_capability(Capability {
+                stat: true,
+                stat_has_cache_control: true,
+                stat_has_content_length: true,
+                stat_has_content_type: true,
+                stat_has_content_encoding: true,
+                stat_has_content_range: true,
+                stat_has_etag: true,
+                stat_has_content_md5: true,
+                stat_has_last_modified: true,
+                stat_has_content_disposition: true,
 
-                            read: true,
+                read: true,
 
-                            write: true,
+                write: true,
 
-                            shared: true,
+                shared: true,
 
-                            ..Default::default()
-                        });
+                ..Default::default()
+            });
 
-                    ma.into()
-                },
-                access_token,
-                client,
+        match self.config.access_token.clone() {
+            Some(access_token) => Ok(VercelArtifactsBackend {
+                core: Arc::new(VercelArtifactsCore {
+                    info: Arc::new(info),
+                    access_token,
+                    client,
+                }),
             }),
             None => Err(Error::new(ErrorKind::ConfigInvalid, "access_token not 
set")),
         }
diff --git a/core/src/services/vercel_artifacts/backend.rs 
b/core/src/services/vercel_artifacts/core.rs
similarity index 58%
copy from core/src/services/vercel_artifacts/backend.rs
copy to core/src/services/vercel_artifacts/core.rs
index 3b8f87551..5646428ca 100644
--- a/core/src/services/vercel_artifacts/backend.rs
+++ b/core/src/services/vercel_artifacts/core.rs
@@ -21,87 +21,26 @@ use std::sync::Arc;
 use http::header;
 use http::Request;
 use http::Response;
-use http::StatusCode;
 
-use super::error::parse_error;
-use super::writer::VercelArtifactsWriter;
 use crate::raw::*;
 use crate::*;
 
-#[doc = include_str!("docs.md")]
-#[derive(Clone)]
-pub struct VercelArtifactsBackend {
+pub struct VercelArtifactsCore {
     pub info: Arc<AccessorInfo>,
     pub(crate) access_token: String,
     pub(crate) client: HttpClient,
 }
 
-impl Debug for VercelArtifactsBackend {
+impl Debug for VercelArtifactsCore {
     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-        let mut de = f.debug_struct("VercelArtifactsBackend");
+        let mut de = f.debug_struct("VercelArtifactsCore");
         de.field("access_token", &self.access_token);
         de.finish()
     }
 }
 
-impl Access for VercelArtifactsBackend {
-    type Reader = HttpBody;
-    type Writer = oio::OneShotWriter<VercelArtifactsWriter>;
-    type Lister = ();
-    type Deleter = ();
-    type BlockingReader = ();
-    type BlockingWriter = ();
-    type BlockingLister = ();
-    type BlockingDeleter = ();
-
-    fn info(&self) -> Arc<AccessorInfo> {
-        self.info.clone()
-    }
-
-    async fn stat(&self, path: &str, _args: OpStat) -> Result<RpStat> {
-        let res = self.vercel_artifacts_stat(path).await?;
-
-        let status = res.status();
-
-        match status {
-            StatusCode::OK => {
-                let meta = parse_into_metadata(path, res.headers())?;
-                Ok(RpStat::new(meta))
-            }
-
-            _ => Err(parse_error(res)),
-        }
-    }
-
-    async fn read(&self, path: &str, args: OpRead) -> Result<(RpRead, 
Self::Reader)> {
-        let resp = self.vercel_artifacts_get(path, args.range(), &args).await?;
-
-        let status = resp.status();
-
-        match status {
-            StatusCode::OK | StatusCode::PARTIAL_CONTENT => Ok((RpRead::new(), 
resp.into_body())),
-            _ => {
-                let (part, mut body) = resp.into_parts();
-                let buf = body.to_buffer().await?;
-                Err(parse_error(Response::from_parts(part, buf)))
-            }
-        }
-    }
-
-    async fn write(&self, path: &str, args: OpWrite) -> Result<(RpWrite, 
Self::Writer)> {
-        Ok((
-            RpWrite::default(),
-            oio::OneShotWriter::new(VercelArtifactsWriter::new(
-                self.clone(),
-                args,
-                path.to_string(),
-            )),
-        ))
-    }
-}
-
-impl VercelArtifactsBackend {
-    pub async fn vercel_artifacts_get(
+impl VercelArtifactsCore {
+    pub(crate) async fn vercel_artifacts_get(
         &self,
         hash: &str,
         range: BytesRange,
@@ -126,7 +65,7 @@ impl VercelArtifactsBackend {
         self.client.fetch(req).await
     }
 
-    pub async fn vercel_artifacts_put(
+    pub(crate) async fn vercel_artifacts_put(
         &self,
         hash: &str,
         size: u64,
@@ -149,7 +88,7 @@ impl VercelArtifactsBackend {
         self.client.send(req).await
     }
 
-    pub async fn vercel_artifacts_stat(&self, hash: &str) -> 
Result<Response<Buffer>> {
+    pub(crate) async fn vercel_artifacts_stat(&self, hash: &str) -> 
Result<Response<Buffer>> {
         let url = format!(
             "https://api.vercel.com/v8/artifacts/{}";,
             percent_encode_path(hash)
diff --git a/core/src/services/vercel_artifacts/error.rs 
b/core/src/services/vercel_artifacts/error.rs
index 8564eedc6..19ad3aecf 100644
--- a/core/src/services/vercel_artifacts/error.rs
+++ b/core/src/services/vercel_artifacts/error.rs
@@ -22,8 +22,8 @@ use crate::raw::*;
 use crate::*;
 
 /// Parse error response into Error.
-pub(super) fn parse_error(resp: Response<Buffer>) -> Error {
-    let (parts, body) = resp.into_parts();
+pub(super) fn parse_error(response: Response<Buffer>) -> Error {
+    let (parts, body) = response.into_parts();
     let bs = body.to_bytes();
 
     let (kind, retryable) = match parts.status {
diff --git a/core/src/services/vercel_artifacts/mod.rs 
b/core/src/services/vercel_artifacts/mod.rs
index 2dd496cdb..2fe5a21db 100644
--- a/core/src/services/vercel_artifacts/mod.rs
+++ b/core/src/services/vercel_artifacts/mod.rs
@@ -18,6 +18,8 @@
 #[cfg(feature = "services-vercel-artifacts")]
 mod backend;
 #[cfg(feature = "services-vercel-artifacts")]
+mod core;
+#[cfg(feature = "services-vercel-artifacts")]
 mod error;
 #[cfg(feature = "services-vercel-artifacts")]
 mod writer;
diff --git a/core/src/services/vercel_artifacts/writer.rs 
b/core/src/services/vercel_artifacts/writer.rs
index 66dfa976f..18cc604cd 100644
--- a/core/src/services/vercel_artifacts/writer.rs
+++ b/core/src/services/vercel_artifacts/writer.rs
@@ -15,24 +15,26 @@
 // specific language governing permissions and limitations
 // under the License.
 
+use std::sync::Arc;
+
 use http::StatusCode;
 
-use super::backend::VercelArtifactsBackend;
+use super::core::VercelArtifactsCore;
 use super::error::parse_error;
 use crate::raw::*;
 use crate::*;
 
 pub struct VercelArtifactsWriter {
-    backend: VercelArtifactsBackend,
+    core: Arc<VercelArtifactsCore>,
     _op: OpWrite,
 
     path: String,
 }
 
 impl VercelArtifactsWriter {
-    pub fn new(backend: VercelArtifactsBackend, op: OpWrite, path: String) -> 
Self {
+    pub fn new(core: Arc<VercelArtifactsCore>, op: OpWrite, path: String) -> 
Self {
         VercelArtifactsWriter {
-            backend,
+            core,
             _op: op,
             path,
         }
@@ -41,16 +43,16 @@ impl VercelArtifactsWriter {
 
 impl oio::OneShotWrite for VercelArtifactsWriter {
     async fn write_once(&self, bs: Buffer) -> Result<Metadata> {
-        let resp = self
-            .backend
+        let response = self
+            .core
             .vercel_artifacts_put(self.path.as_str(), bs.len() as u64, bs)
             .await?;
 
-        let status = resp.status();
+        let status = response.status();
 
         match status {
             StatusCode::OK | StatusCode::ACCEPTED => Ok(Metadata::default()),
-            _ => Err(parse_error(resp)),
+            _ => Err(parse_error(response)),
         }
     }
 }

Reply via email to