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)),
}
}
}