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"
