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

xuanwo pushed a commit to branch luban/oss-reqsign2
in repository https://gitbox.apache.org/repos/asf/opendal.git

commit 2c8c41e983d520d06907e8f227759fdccb7ec857
Author: Xuanwo <[email protected]>
AuthorDate: Tue Jan 27 19:03:28 2026 +0800

    refactor: Migrate oss to reqsign core v2
---
 core/Cargo.lock                  |  26 +++-
 core/DEPENDENCIES.rust.tsv       |   3 +-
 core/services/oss/Cargo.toml     |   8 +-
 core/services/oss/src/backend.rs |  94 ++++++++------
 core/services/oss/src/core.rs    | 119 ++++++++----------
 core/services/oss/src/writer.rs  |  10 +-
 dev/Cargo.lock                   | 260 +++++++++++++++++++++++++++++++++++----
 7 files changed, 380 insertions(+), 140 deletions(-)

diff --git a/core/Cargo.lock b/core/Cargo.lock
index bd9e70adf..0d6747982 100644
--- a/core/Cargo.lock
+++ b/core/Cargo.lock
@@ -6878,7 +6878,10 @@ dependencies = [
  "opendal-core",
  "pretty_assertions",
  "quick-xml",
- "reqsign",
+ "reqsign-aliyun-oss",
+ "reqsign-core",
+ "reqsign-file-read-tokio",
+ "reqsign-http-send-reqwest",
  "serde",
  "tokio",
 ]
@@ -8644,6 +8647,23 @@ dependencies = [
  "sha2",
 ]
 
+[[package]]
+name = "reqsign-aliyun-oss"
+version = "2.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "ca53e7f1b5767da409d861e864d6c2867e710a500103582196bd6fff8f103d32"
+dependencies = [
+ "anyhow",
+ "async-trait",
+ "form_urlencoded",
+ "http 1.4.0",
+ "log",
+ "percent-encoding",
+ "reqsign-core",
+ "serde",
+ "serde_json",
+]
+
 [[package]]
 name = "reqsign-aws-v4"
 version = "2.0.1"
@@ -8668,9 +8688,9 @@ dependencies = [
 
 [[package]]
 name = "reqsign-core"
-version = "2.0.1"
+version = "2.0.2"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "39da118ccf3bdb067ac6cc40136fec99bc5ba418cbd388dc88e4ce0e5d0b1423"
+checksum = "9ba66eb941c0f723269a394baf3b19a2fa697a1e593f3e902779df6c35d24e21"
 dependencies = [
  "anyhow",
  "async-trait",
diff --git a/core/DEPENDENCIES.rust.tsv b/core/DEPENDENCIES.rust.tsv
index 38c5b4f61..e91cf64bb 100644
--- a/core/DEPENDENCIES.rust.tsv
+++ b/core/DEPENDENCIES.rust.tsv
@@ -99,8 +99,9 @@ [email protected]    X                                               
                        X
 [email protected]      X                                                       
                X               
 [email protected]        X                                                       
                X               
 [email protected] X                                                               
                        
[email protected]       X                                               
                                        
 [email protected]   X                                                       
                                
[email protected]     X                                                       
                                
[email protected]     X                                                       
                                
 [email protected]  X                                               
                                        
 [email protected]        X                                       
                                                
 [email protected]        X                                                       
                X               
diff --git a/core/services/oss/Cargo.toml b/core/services/oss/Cargo.toml
index 47eff2941..22ebd0192 100644
--- a/core/services/oss/Cargo.toml
+++ b/core/services/oss/Cargo.toml
@@ -36,10 +36,10 @@ http = { workspace = true }
 log = { workspace = true }
 opendal-core = { path = "../../core", version = "0.55.0", default-features = 
false }
 quick-xml = { workspace = true, features = ["serialize", "overlapped-lists"] }
-reqsign = { workspace = true, features = [
-  "services-aliyun",
-  "reqwest_request",
-] }
+reqsign-aliyun-oss = { version = "2.0.2", default-features = false }
+reqsign-core = { version = "2.0.1", default-features = false }
+reqsign-file-read-tokio = { version = "2.0.1", default-features = false }
+reqsign-http-send-reqwest = { version = "2.0.1", default-features = false }
 serde = { workspace = true, features = ["derive"] }
 
 [dev-dependencies]
diff --git a/core/services/oss/src/backend.rs b/core/services/oss/src/backend.rs
index 0b79c196f..c152872d7 100644
--- a/core/services/oss/src/backend.rs
+++ b/core/services/oss/src/backend.rs
@@ -22,9 +22,18 @@ use http::Response;
 use http::StatusCode;
 use http::Uri;
 use log::debug;
-use reqsign::AliyunConfig;
-use reqsign::AliyunLoader;
-use reqsign::AliyunOssSigner;
+use reqsign_aliyun_oss::AssumeRoleWithOidcCredentialProvider;
+use reqsign_aliyun_oss::EnvCredentialProvider;
+use reqsign_aliyun_oss::RequestSigner;
+use reqsign_aliyun_oss::StaticCredentialProvider;
+use reqsign_core::Context;
+use reqsign_core::Env as _;
+use reqsign_core::OsEnv;
+use reqsign_core::ProvideCredentialChain;
+use reqsign_core::Signer;
+use reqsign_core::StaticEnv;
+use reqsign_file_read_tokio::TokioFileRead;
+use reqsign_http_send_reqwest::ReqwestHttpSend;
 
 use super::OSS_SCHEME;
 use super::config::OssConfig;
@@ -431,46 +440,63 @@ impl Builder for OssBuilder {
             ),
         };
 
-        let mut cfg = AliyunConfig::default();
-        // Load cfg from env first.
-        cfg = cfg.from_env();
+        // NOTE: `AssumeRoleWithOidcCredentialProvider` still reads 
`role_arn`, `oidc_provider_arn`
+        // and `oidc_token_file` from `Context` environment variables at 
runtime. Until reqsign
+        // exposes typed builder APIs for all of them, we overlay config 
values into a `StaticEnv`
+        // snapshot here.
+        let os_env = OsEnv;
+        let mut envs = os_env.vars();
 
-        if let Some(v) = self.config.access_key_id {
-            cfg.access_key_id = Some(v);
+        if let Some(v) = &self.config.role_arn {
+            envs.insert("ALIBABA_CLOUD_ROLE_ARN".to_string(), v.clone());
         }
-
-        if let Some(v) = self.config.access_key_secret {
-            cfg.access_key_secret = Some(v);
-        }
-
-        if let Some(v) = self.config.security_token {
-            cfg.security_token = Some(v);
+        if let Some(v) = &self.config.oidc_provider_arn {
+            envs.insert("ALIBABA_CLOUD_OIDC_PROVIDER_ARN".to_string(), 
v.clone());
         }
-
-        if let Some(v) = self.config.role_arn {
-            cfg.role_arn = Some(v);
+        if let Some(v) = &self.config.oidc_token_file {
+            envs.insert("ALIBABA_CLOUD_OIDC_TOKEN_FILE".to_string(), 
v.clone());
         }
 
-        // override default role_session_name if set
-        if let Some(v) = self.config.role_session_name {
-            cfg.role_session_name = v;
-        }
+        let mut assume_role = AssumeRoleWithOidcCredentialProvider::new();
 
-        if let Some(v) = self.config.oidc_provider_arn {
-            cfg.oidc_provider_arn = Some(v);
+        if let Some(sts_endpoint) = &self.config.sts_endpoint {
+            if sts_endpoint.starts_with("http://";) || 
sts_endpoint.starts_with("https://";) {
+                assume_role = 
assume_role.with_sts_endpoint(sts_endpoint.clone());
+            } else {
+                envs.insert(
+                    "ALIBABA_CLOUD_STS_ENDPOINT".to_string(),
+                    sts_endpoint.clone(),
+                );
+            }
         }
 
-        if let Some(v) = self.config.oidc_token_file {
-            cfg.oidc_token_file = Some(v);
+        if let Some(role_session_name) = &self.config.role_session_name {
+            assume_role = 
assume_role.with_role_session_name(role_session_name.clone());
         }
 
-        if let Some(v) = self.config.sts_endpoint {
-            cfg.sts_endpoint = Some(v);
+        let ctx = Context::new()
+            .with_file_read(TokioFileRead)
+            
.with_http_send(ReqwestHttpSend::new(GLOBAL_REQWEST_CLIENT.clone()))
+            .with_env(StaticEnv {
+                home_dir: os_env.home_dir(),
+                envs,
+            });
+
+        let mut provider = ProvideCredentialChain::new()
+            .push(EnvCredentialProvider::new())
+            .push(assume_role);
+
+        if let (Some(ak), Some(sk)) = (&self.config.access_key_id, 
&self.config.access_key_secret) {
+            let static_provider = if let Some(token) = 
self.config.security_token.as_deref() {
+                StaticCredentialProvider::new(ak, 
sk).with_security_token(token)
+            } else {
+                StaticCredentialProvider::new(ak, sk)
+            };
+            provider = provider.push_front(static_provider);
         }
 
-        let loader = AliyunLoader::new(GLOBAL_REQWEST_CLIENT.clone(), cfg);
-
-        let signer = AliyunOssSigner::new(bucket);
+        let request_signer = RequestSigner::new(bucket);
+        let signer = Signer::new(ctx, provider, request_signer);
 
         let delete_max_size = self
             .config
@@ -554,7 +580,6 @@ impl Builder for OssBuilder {
                 presign_endpoint,
                 allow_anonymous: self.config.allow_anonymous,
                 signer,
-                loader,
                 server_side_encryption,
                 server_side_encryption_key_id,
             }),
@@ -689,9 +714,8 @@ impl Access for OssBackend {
                 "operation is not supported",
             )),
         };
-        let mut req = req?;
-
-        self.core.sign_query(&mut req, args.expire()).await?;
+        let req = req?;
+        let req = self.core.sign_query(req, args.expire()).await?;
 
         // We don't need this request anymore, consume it directly.
         let (parts, _) = req.into_parts();
diff --git a/core/services/oss/src/core.rs b/core/services/oss/src/core.rs
index 9df696380..b539aed84 100644
--- a/core/services/oss/src/core.rs
+++ b/core/services/oss/src/core.rs
@@ -29,14 +29,14 @@ use http::header::CACHE_CONTROL;
 use http::header::CONTENT_DISPOSITION;
 use http::header::CONTENT_LENGTH;
 use http::header::CONTENT_TYPE;
+use http::header::HOST;
 use http::header::IF_MATCH;
 use http::header::IF_MODIFIED_SINCE;
 use http::header::IF_NONE_MATCH;
 use http::header::IF_UNMODIFIED_SINCE;
 use http::header::RANGE;
-use reqsign::AliyunCredential;
-use reqsign::AliyunLoader;
-use reqsign::AliyunOssSigner;
+use reqsign_aliyun_oss::Credential;
+use reqsign_core::Signer;
 use serde::Deserialize;
 use serde::Serialize;
 
@@ -76,8 +76,7 @@ pub struct OssCore {
     pub server_side_encryption: Option<HeaderValue>,
     pub server_side_encryption_key_id: Option<HeaderValue>,
 
-    pub loader: AliyunLoader,
-    pub signer: AliyunOssSigner,
+    pub signer: Signer<Credential>,
 }
 
 impl Debug for OssCore {
@@ -92,48 +91,36 @@ impl Debug for OssCore {
 }
 
 impl OssCore {
-    async fn load_credential(&self) -> Result<Option<AliyunCredential>> {
-        let cred = self
-            .loader
-            .load()
-            .await
-            .map_err(new_request_credential_error)?;
-
-        if let Some(cred) = cred {
-            Ok(Some(cred))
-        } else if self.allow_anonymous {
-            // If allow_anonymous has been set, we will not sign the request.
-            Ok(None)
-        } else {
-            // Mark this error as temporary since it could be caused by Aliyun 
STS.
-            Err(Error::new(
-                ErrorKind::PermissionDenied,
-                "no valid credential found, please check configuration or try 
again",
-            )
-            .set_temporary())
+    pub async fn sign<T>(&self, req: Request<T>) -> Result<Request<T>> {
+        // Skip signing for anonymous access.
+        if self.allow_anonymous {
+            return Ok(req);
         }
-    }
 
-    pub async fn sign<T>(&self, req: &mut Request<T>) -> Result<()> {
-        let cred = if let Some(cred) = self.load_credential().await? {
-            cred
-        } else {
-            return Ok(());
-        };
+        let (mut parts, body) = req.into_parts();
 
-        self.signer.sign(req, &cred).map_err(new_request_sign_error)
+        self.signer
+            .sign(&mut parts, None)
+            .await
+            .map_err(|e| new_request_sign_error(e.into()))?;
+
+        Ok(Request::from_parts(parts, body))
     }
 
-    pub async fn sign_query<T>(&self, req: &mut Request<T>, duration: 
Duration) -> Result<()> {
-        let cred = if let Some(cred) = self.load_credential().await? {
-            cred
-        } else {
-            return Ok(());
-        };
+    pub async fn sign_query<T>(&self, req: Request<T>, duration: Duration) -> 
Result<Request<T>> {
+        // Skip signing for anonymous access.
+        if self.allow_anonymous {
+            return Ok(req);
+        }
+
+        let (mut parts, body) = req.into_parts();
 
         self.signer
-            .sign_query(req, duration, &cred)
-            .map_err(new_request_sign_error)
+            .sign(&mut parts, Some(duration))
+            .await
+            .map_err(|e| new_request_sign_error(e.into()))?;
+
+        Ok(Request::from_parts(parts, body))
     }
 
     #[inline]
@@ -475,15 +462,14 @@ impl OssCore {
     }
 
     pub async fn oss_get_object(&self, path: &str, args: &OpRead) -> 
Result<Response<HttpBody>> {
-        let mut req = self.oss_get_object_request(path, false, args)?;
-        self.sign(&mut req).await?;
+        let req = self.oss_get_object_request(path, false, args)?;
+        let req = self.sign(req).await?;
         self.info.http_client().fetch(req).await
     }
 
     pub async fn oss_head_object(&self, path: &str, args: &OpStat) -> 
Result<Response<Buffer>> {
-        let mut req = self.oss_head_object_request(path, false, args)?;
-
-        self.sign(&mut req).await?;
+        let req = self.oss_head_object_request(path, false, args)?;
+        let req = self.sign(req).await?;
         self.send(req).await
     }
 
@@ -506,9 +492,8 @@ impl OssCore {
 
         let req = req.extension(Operation::Copy);
 
-        let mut req = 
req.body(Buffer::new()).map_err(new_request_build_error)?;
-
-        self.sign(&mut req).await?;
+        let req = req.body(Buffer::new()).map_err(new_request_build_error)?;
+        let req = self.sign(req).await?;
         self.send(req).await
     }
 
@@ -520,9 +505,8 @@ impl OssCore {
         limit: Option<usize>,
         start_after: Option<String>,
     ) -> Result<Response<Buffer>> {
-        let mut req = self.oss_list_object_request(path, token, delimiter, 
limit, start_after)?;
-
-        self.sign(&mut req).await?;
+        let req = self.oss_list_object_request(path, token, delimiter, limit, 
start_after)?;
+        let req = self.sign(req).await?;
         self.send(req).await
     }
 
@@ -556,19 +540,17 @@ impl OssCore {
             url = url.push("version-id-marker", 
&percent_encode_path(version_id_marker));
         }
 
-        let mut req = Request::get(url.finish())
+        let req = Request::get(url.finish())
             .extension(Operation::List)
             .body(Buffer::new())
             .map_err(new_request_build_error)?;
-
-        self.sign(&mut req).await?;
-
+        let req = self.sign(req).await?;
         self.send(req).await
     }
 
     pub async fn oss_delete_object(&self, path: &str, args: &OpDelete) -> 
Result<Response<Buffer>> {
-        let mut req = self.oss_delete_object_request(path, args)?;
-        self.sign(&mut req).await?;
+        let req = self.oss_delete_object_request(path, args)?;
+        let req = self.sign(req).await?;
         self.send(req).await
     }
 
@@ -600,12 +582,10 @@ impl OssCore {
 
         let req = req.extension(Operation::Delete);
 
-        let mut req = req
+        let req = req
             .body(Buffer::from(Bytes::from(content)))
             .map_err(new_request_build_error)?;
-
-        self.sign(&mut req).await?;
-
+        let req = self.sign(req).await?;
         self.send(req).await
     }
 
@@ -642,8 +622,8 @@ impl OssCore {
 
         let req = req.extension(Operation::Write);
 
-        let mut req = 
req.body(Buffer::new()).map_err(new_request_build_error)?;
-        self.sign(&mut req).await?;
+        let req = req.body(Buffer::new()).map_err(new_request_build_error)?;
+        let req = self.sign(req).await?;
         self.send(req).await
     }
 
@@ -673,8 +653,8 @@ impl OssCore {
 
         let req = req.extension(Operation::Write);
 
-        let mut req = req.body(body).map_err(new_request_build_error)?;
-        self.sign(&mut req).await?;
+        let req = req.body(body).map_err(new_request_build_error)?;
+        let req = self.sign(req).await?;
         self.send(req).await
     }
 
@@ -707,11 +687,10 @@ impl OssCore {
 
         let req = req.extension(Operation::Write);
 
-        let mut req = req
+        let req = req
             .body(Buffer::from(Bytes::from(content)))
             .map_err(new_request_build_error)?;
-
-        self.sign(&mut req).await?;
+        let req = self.sign(req).await?;
         self.send(req).await
     }
 
@@ -731,11 +710,11 @@ impl OssCore {
             percent_encode_path(upload_id)
         );
 
-        let mut req = Request::delete(&url)
+        let req = Request::delete(&url)
             .extension(Operation::Write)
             .body(Buffer::new())
             .map_err(new_request_build_error)?;
-        self.sign(&mut req).await?;
+        let req = self.sign(req).await?;
         self.send(req).await
     }
 }
diff --git a/core/services/oss/src/writer.rs b/core/services/oss/src/writer.rs
index 6668f3386..7a71a9a08 100644
--- a/core/services/oss/src/writer.rs
+++ b/core/services/oss/src/writer.rs
@@ -62,11 +62,10 @@ impl OssWriter {
 
 impl oio::MultipartWrite for OssWriter {
     async fn write_once(&self, size: u64, body: Buffer) -> Result<Metadata> {
-        let mut req =
+        let req =
             self.core
                 .oss_put_object_request(&self.path, Some(size), &self.op, 
body, false)?;
-
-        self.core.sign(&mut req).await?;
+        let req = self.core.sign(req).await?;
 
         let resp = self.core.send(req).await?;
 
@@ -209,11 +208,10 @@ impl oio::AppendWrite for OssWriter {
     }
 
     async fn append(&self, offset: u64, size: u64, body: Buffer) -> 
Result<Metadata> {
-        let mut req = self
+        let req = self
             .core
             .oss_append_object_request(&self.path, offset, size, &self.op, 
body)?;
-
-        self.core.sign(&mut req).await?;
+        let req = self.core.sign(req).await?;
 
         let resp = self.core.send(req).await?;
 
diff --git a/dev/Cargo.lock b/dev/Cargo.lock
index b776dabb2..f3c500b8f 100644
--- a/dev/Cargo.lock
+++ b/dev/Cargo.lock
@@ -1,6 +1,6 @@
 # This file is automatically @generated by Cargo.
 # It is not intended for manual editing.
-version = 3
+version = 4
 
 [[package]]
 name = "adler2"
@@ -149,6 +149,15 @@ version = "1.0.3"
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990"
 
+[[package]]
+name = "colored"
+version = "3.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "faf9468729b8cbcea668e36183cb69d317348c2e08e994829fb56ebfdfbaac34"
+dependencies = [
+ "windows-sys",
+]
+
 [[package]]
 name = "cpufeatures"
 version = "0.2.17"
@@ -224,16 +233,6 @@ version = "1.13.0"
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0"
 
-[[package]]
-name = "env_filter"
-version = "0.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "186e05a59d4c50738528153b83b0b0194d3a29507dfec16eccd4b342903397d0"
-dependencies = [
- "log",
- "regex",
-]
-
 [[package]]
 name = "env_home"
 version = "0.1.0"
@@ -246,6 +245,17 @@ version = "1.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
 
+[[package]]
+name = "erased-serde"
+version = "0.4.9"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "89e8918065695684b2b0702da20382d5ae6065cf3327bc2d6436bd49a71ce9f3"
+dependencies = [
+ "serde",
+ "serde_core",
+ "typeid",
+]
+
 [[package]]
 name = "errno"
 version = "0.3.10"
@@ -427,20 +437,79 @@ checksum = 
"d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab"
 
 [[package]]
 name = "log"
-version = "0.4.22"
+version = "0.4.29"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24"
+checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897"
+dependencies = [
+ "sval",
+ "sval_ref",
+ "value-bag",
+]
 
 [[package]]
 name = "logforth"
-version = "0.23.1"
+version = "0.29.1"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "f9b81df91671a0a96902d950498cc69b509291c37f6d49105d5a1b7ddacc727d"
+checksum = "40c105c59828d07aeb95b06f9a345b12869ddc249d44a7302697a66da439076f"
+dependencies = [
+ "logforth-append-file",
+ "logforth-bridge-log",
+ "logforth-core",
+ "logforth-layout-json",
+ "logforth-layout-text",
+]
+
+[[package]]
+name = "logforth-append-file"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "7d2ccb8b7e501c114e80069eb2b83c02a48039c23a7037e717b5b09a4ed306fb"
 dependencies = [
- "anyhow",
- "env_filter",
  "jiff",
+ "logforth-core",
+]
+
+[[package]]
+name = "logforth-bridge-log"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "a4aa6ca548389fd166a995b5940e15b0dacbdd5a30f2f24eac9aa4bf664bda5c"
+dependencies = [
  "log",
+ "logforth-core",
+]
+
+[[package]]
+name = "logforth-core"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "a77869b8dba38c67ed19e1753e59d9faefdcc60557bc4e84db0348606a304ac5"
+dependencies = [
+ "anyhow",
+ "value-bag",
+]
+
+[[package]]
+name = "logforth-layout-json"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "01b80d310e0670560404a825f64dbd78a8761c5bb7da952513e90ba9dd525bd2"
+dependencies = [
+ "jiff",
+ "logforth-core",
+ "serde",
+ "serde_json",
+]
+
+[[package]]
+name = "logforth-layout-text"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "e2a4674e549a59eeac8e301584143186c433181bdc5460046a130becedef6a3d"
+dependencies = [
+ "colored",
+ "jiff",
+ "logforth-core",
 ]
 
 [[package]]
@@ -618,24 +687,52 @@ checksum = 
"f79dfe2d285b0488816f30e700a7438c5a73d816b5b7d3ac72fbc48b0d185e03"
 
 [[package]]
 name = "serde"
-version = "1.0.216"
+version = "1.0.228"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e"
+dependencies = [
+ "serde_core",
+ "serde_derive",
+]
+
+[[package]]
+name = "serde_buf"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "fc948de1bbead18a61be0b33182636603ea0239ca2577b9704fc39eba900e4e5"
+dependencies = [
+ "serde_core",
+]
+
+[[package]]
+name = "serde_core"
+version = "1.0.228"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "0b9781016e935a97e8beecf0c933758c97a5520d32930e460142b4cd80c6338e"
+checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad"
 dependencies = [
  "serde_derive",
 ]
 
 [[package]]
 name = "serde_derive"
-version = "1.0.216"
+version = "1.0.228"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "46f859dbbf73865c6627ed570e78961cd3ac92407a2d117204c49232485da55e"
+checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
 dependencies = [
  "proc-macro2",
  "quote",
  "syn",
 ]
 
+[[package]]
+name = "serde_fmt"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "6e497af288b3b95d067a23a4f749f2861121ffcb2f6d8379310dcda040c345ed"
+dependencies = [
+ "serde_core",
+]
+
 [[package]]
 name = "serde_json"
 version = "1.0.138"
@@ -675,6 +772,84 @@ version = "0.11.1"
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
 
+[[package]]
+name = "sval"
+version = "2.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "502b8906c4736190684646827fbab1e954357dfe541013bbd7994d033d53a1ca"
+
+[[package]]
+name = "sval_buffer"
+version = "2.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "c4b854348b15b6c441bdd27ce9053569b016a0723eab2d015b1fd8e6abe4f708"
+dependencies = [
+ "sval",
+ "sval_ref",
+]
+
+[[package]]
+name = "sval_dynamic"
+version = "2.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "a0bd9e8b74410ddad37c6962587c5f9801a2caadba9e11f3f916ee3f31ae4a1f"
+dependencies = [
+ "sval",
+]
+
+[[package]]
+name = "sval_fmt"
+version = "2.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "6fe17b8deb33a9441280b4266c2d257e166bafbaea6e66b4b34ca139c91766d9"
+dependencies = [
+ "itoa",
+ "ryu",
+ "sval",
+]
+
+[[package]]
+name = "sval_json"
+version = "2.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "854addb048a5bafb1f496c98e0ab5b9b581c3843f03ca07c034ae110d3b7c623"
+dependencies = [
+ "itoa",
+ "ryu",
+ "sval",
+]
+
+[[package]]
+name = "sval_nested"
+version = "2.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "96cf068f482108ff44ae8013477cb047a1665d5f1a635ad7cf79582c1845dce9"
+dependencies = [
+ "sval",
+ "sval_buffer",
+ "sval_ref",
+]
+
+[[package]]
+name = "sval_ref"
+version = "2.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "ed02126365ffe5ab8faa0abd9be54fbe68d03d607cd623725b0a71541f8aaa6f"
+dependencies = [
+ "sval",
+]
+
+[[package]]
+name = "sval_serde"
+version = "2.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "a263383c6aa2076c4ef6011d3bae1b356edf6ea2613e3d8e8ebaa7b57dd707d5"
+dependencies = [
+ "serde_core",
+ "sval",
+ "sval_nested",
+]
+
 [[package]]
 name = "syn"
 version = "2.0.100"
@@ -719,6 +894,12 @@ dependencies = [
  "winnow",
 ]
 
+[[package]]
+name = "typeid"
+version = "1.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c"
+
 [[package]]
 name = "typenum"
 version = "1.17.0"
@@ -743,6 +924,43 @@ version = "0.2.2"
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
 
+[[package]]
+name = "value-bag"
+version = "1.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "7ba6f5989077681266825251a52748b8c1d8a4ad098cc37e440103d0ea717fc0"
+dependencies = [
+ "value-bag-serde1",
+ "value-bag-sval2",
+]
+
+[[package]]
+name = "value-bag-serde1"
+version = "1.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "16530907bfe2999a1773ca5900a65101e092c70f642f25cc23ca0c43573262c5"
+dependencies = [
+ "erased-serde",
+ "serde_buf",
+ "serde_core",
+ "serde_fmt",
+]
+
+[[package]]
+name = "value-bag-sval2"
+version = "1.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "d00ae130edd690eaa877e4f40605d534790d1cf1d651e7685bd6a144521b251f"
+dependencies = [
+ "sval",
+ "sval_buffer",
+ "sval_dynamic",
+ "sval_fmt",
+ "sval_json",
+ "sval_ref",
+ "sval_serde",
+]
+
 [[package]]
 name = "version_check"
 version = "0.9.5"

Reply via email to