From 5040e0d7517e6d1fb36cb3abf69e58eb230a4114 Mon Sep 17 00:00:00 2001 From: Simon Date: Mon, 22 Sep 2025 08:32:21 -0700 Subject: [PATCH 1/2] Move tests to aws-smithy-mocks --- Cargo.lock | 1123 +++++++++++++------------ aws_secretsmanager_caching/Cargo.toml | 2 +- aws_secretsmanager_caching/src/lib.rs | 1102 ++++++++++++++++-------- 3 files changed, 1332 insertions(+), 895 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b66bd9c..050865c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -13,9 +13,9 @@ dependencies = [ [[package]] name = "adler2" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "ahash" @@ -44,12 +44,6 @@ version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - [[package]] name = "android_system_properties" version = "0.1.5" @@ -61,9 +55,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.98" +version = "1.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" +checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" [[package]] name = "arc-swap" @@ -79,11 +73,10 @@ checksum = "7d902e3d592a523def97af8f317b08ce16b7ab854c1985a0c671e6f15cebc236" [[package]] name = "assert-json-diff" -version = "1.1.0" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4259cbe96513d2f1073027a259fc2ca917feb3026a5a8d984e3628e490255cc0" +checksum = "47e4f2b81832e72834d7518d8487a0396a28cc408186a2e8854c0f98011faf12" dependencies = [ - "extend", "serde", "serde_json", ] @@ -107,18 +100,18 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn", ] [[package]] name = "async-trait" -version = "0.1.88" +version = "0.1.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn", ] [[package]] @@ -129,15 +122,15 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "autocfg" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "aws-config" -version = "1.6.2" +version = "1.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6fcc63c9860579e4cb396239570e979376e70aab79e496621748a09913f8b36" +checksum = "8bc1b40fb26027769f16960d2f4a6bc20c4bb755d403e552c8c1a73af433c246" dependencies = [ "aws-credential-types", "aws-runtime", @@ -165,9 +158,9 @@ dependencies = [ [[package]] name = "aws-credential-types" -version = "1.2.3" +version = "1.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "687bc16bc431a8533fe0097c7f0182874767f920989d7260950172ae8e3c4465" +checksum = "d025db5d9f52cbc413b167136afb3d8aeea708c0d8884783cf6253be5e22f6f2" dependencies = [ "aws-smithy-async", "aws-smithy-runtime-api", @@ -177,11 +170,11 @@ dependencies = [ [[package]] name = "aws-lc-fips-sys" -version = "0.13.6" +version = "0.13.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e99d74bb793a19f542ae870a6edafbc5ecf0bc0ba01d4636b7f7e0aba9ee9bd3" +checksum = "2608e5a7965cc9d58c56234d346c9c89b824c4c8652b6f047b3bd0a777c0644f" dependencies = [ - "bindgen", + "bindgen 0.69.5", "cc", "cmake", "dunce", @@ -191,9 +184,9 @@ dependencies = [ [[package]] name = "aws-lc-rs" -version = "1.13.1" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fcc8f365936c834db5514fc45aee5b1202d677e6b40e48468aaaa8183ca8c7" +checksum = "94b8ff6c09cd57b16da53641caa860168b88c172a5ee163b0288d3d6eea12786" dependencies = [ "aws-lc-fips-sys", "aws-lc-sys", @@ -202,11 +195,11 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.29.0" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61b1d86e7705efe1be1b569bab41d4fa1e14e220b60a160f78de2db687add079" +checksum = "0e44d16778acaf6a9ec9899b92cebd65580b83f685446bf2e1f5d3d732f99dcd" dependencies = [ - "bindgen", + "bindgen 0.72.1", "cc", "cmake", "dunce", @@ -215,9 +208,9 @@ dependencies = [ [[package]] name = "aws-runtime" -version = "1.5.7" +version = "1.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c4063282c69991e57faab9e5cb21ae557e59f5b0fb285c196335243df8dc25c" +checksum = "c034a1bc1d70e16e7f4e4caf7e9f7693e4c9c24cd91cf17c2a0b21abaebc7c8b" dependencies = [ "aws-credential-types", "aws-sigv4", @@ -239,9 +232,9 @@ dependencies = [ [[package]] name = "aws-sdk-secretsmanager" -version = "1.71.0" +version = "1.88.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9328a01c5c822fadf96be02187e0944eb6059067509ed32ad1af00e18cd5eb27" +checksum = "1656cc8753202f255a1bcc6e06f9e768f30968684022fd0dd2f8912cad00fcef" dependencies = [ "aws-credential-types", "aws-runtime", @@ -255,16 +248,15 @@ dependencies = [ "bytes", "fastrand", "http 0.2.12", - "once_cell", "regex-lite", "tracing", ] [[package]] name = "aws-sdk-sso" -version = "1.67.0" +version = "1.84.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d4863da26489d1e6da91d7e12b10c17e86c14f94c53f416bd10e0a9c34057ba" +checksum = "357a841807f6b52cb26123878b3326921e2a25faca412fabdd32bd35b7edd5d3" dependencies = [ "aws-credential-types", "aws-runtime", @@ -278,16 +270,15 @@ dependencies = [ "bytes", "fastrand", "http 0.2.12", - "once_cell", "regex-lite", "tracing", ] [[package]] name = "aws-sdk-ssooidc" -version = "1.68.0" +version = "1.85.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95caa3998d7237789b57b95a8e031f60537adab21fa84c91e35bef9455c652e4" +checksum = "67e05f33b6c9026fecfe9b3b6740f34d41bc6ff641a6a32dabaab60209245b75" dependencies = [ "aws-credential-types", "aws-runtime", @@ -301,16 +292,15 @@ dependencies = [ "bytes", "fastrand", "http 0.2.12", - "once_cell", "regex-lite", "tracing", ] [[package]] name = "aws-sdk-sts" -version = "1.68.0" +version = "1.86.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4939f6f449a37308a78c5a910fd91265479bd2bb11d186f0b8fc114d89ec828d" +checksum = "e7d835f123f307cafffca7b9027c14979f1d403b417d8541d67cf252e8a21e35" dependencies = [ "aws-credential-types", "aws-runtime", @@ -325,16 +315,15 @@ dependencies = [ "aws-types", "fastrand", "http 0.2.12", - "once_cell", "regex-lite", "tracing", ] [[package]] name = "aws-sigv4" -version = "1.3.1" +version = "1.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3503af839bd8751d0bdc5a46b9cac93a003a353e635b0c12cf2376b5b53e41ea" +checksum = "084c34162187d39e3740cb635acd73c4e3a551a36146ad6fe8883c929c9f876c" dependencies = [ "aws-credential-types", "aws-smithy-http", @@ -365,9 +354,9 @@ dependencies = [ [[package]] name = "aws-smithy-http" -version = "0.62.1" +version = "0.62.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99335bec6cdc50a346fda1437f9fefe33abf8c99060739a546a16457f2862ca9" +checksum = "7c4dacf2d38996cf729f55e7a762b30918229917eca115de45dfa8dfb97796c9" dependencies = [ "aws-smithy-runtime-api", "aws-smithy-types", @@ -385,56 +374,60 @@ dependencies = [ [[package]] name = "aws-smithy-http-client" -version = "1.0.2" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e44697a9bded898dcd0b1cb997430d949b87f4f8940d91023ae9062bf218250" +checksum = "147e8eea63a40315d704b97bf9bc9b8c1402ae94f89d5ad6f7550d963309da1b" dependencies = [ "aws-smithy-async", "aws-smithy-protocol-test", "aws-smithy-runtime-api", "aws-smithy-types", "bytes", - "h2 0.4.10", + "h2 0.3.27", + "h2 0.4.12", "http 0.2.12", "http 1.3.1", "http-body 0.4.6", "http-body 1.0.1", "http-body-util", "hyper 0.14.32", - "hyper 1.6.0", + "hyper 1.7.0", "hyper-rustls 0.24.2", - "hyper-rustls 0.27.5", + "hyper-rustls 0.27.7", "hyper-util", - "indexmap 2.9.0", + "indexmap 2.11.4", "pin-project-lite", "rustls 0.21.12", - "rustls 0.23.27", + "rustls 0.23.32", "rustls-native-certs 0.8.1", "rustls-pki-types", "serde", "serde_json", "tokio", + "tokio-rustls 0.26.3", "tower", "tracing", ] [[package]] name = "aws-smithy-json" -version = "0.61.3" +version = "0.61.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92144e45819cae7dc62af23eac5a038a58aa544432d2102609654376a900bd07" +checksum = "eaa31b350998e703e9826b2104dd6f63be0508666e1aba88137af060e8944047" dependencies = [ "aws-smithy-types", ] [[package]] -name = "aws-smithy-mocks-experimental" -version = "0.2.4" +name = "aws-smithy-mocks" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ce8a35535906a8a9ceadbe7ff70ae8686a36f7df03b288b1256c084a5c45c69" +checksum = "178b1ad961028a58d48ce857f86ffbd5233a4b7e2c7b56d026fb1c1afe46696e" dependencies = [ + "aws-smithy-http-client", "aws-smithy-runtime-api", "aws-smithy-types", + "http 1.3.1", ] [[package]] @@ -448,9 +441,9 @@ dependencies = [ [[package]] name = "aws-smithy-protocol-test" -version = "0.63.1" +version = "0.63.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b42f13304bed0b96d7471e4770c270bb3eb4fea277727fb03c811e84cb4bf3a" +checksum = "ee2116be0e3a8e18771b126f8eb69901b2780fbe12b1890370cb1c462337d13b" dependencies = [ "assert-json-diff", "aws-smithy-runtime-api", @@ -462,7 +455,7 @@ dependencies = [ "regex-lite", "roxmltree", "serde_json", - "thiserror 1.0.69", + "thiserror", ] [[package]] @@ -477,9 +470,9 @@ dependencies = [ [[package]] name = "aws-smithy-runtime" -version = "1.8.3" +version = "1.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14302f06d1d5b7d333fd819943075b13d27c7700b414f574c3c35859bfb55d5e" +checksum = "4fa63ad37685ceb7762fa4d73d06f1d5493feb88e3f27259b9ed277f4c01b185" dependencies = [ "aws-smithy-async", "aws-smithy-http", @@ -502,9 +495,9 @@ dependencies = [ [[package]] name = "aws-smithy-runtime-api" -version = "1.8.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1e5d9e3a80a18afa109391fb5ad09c3daf887b516c6fd805a157c6ea7994a57" +checksum = "07f5e0fc8a6b3f2303f331b94504bbf754d85488f402d6f1dd7a6080f99afe56" dependencies = [ "aws-smithy-async", "aws-smithy-types", @@ -519,9 +512,9 @@ dependencies = [ [[package]] name = "aws-smithy-types" -version = "1.3.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40076bd09fadbc12d5e026ae080d0930defa606856186e31d83ccc6a255eeaf3" +checksum = "d498595448e43de7f4296b7b7a18a8a02c61ec9349128c80a368f7c3b4ab11a8" dependencies = [ "base64-simd", "bytes", @@ -545,18 +538,18 @@ dependencies = [ [[package]] name = "aws-smithy-xml" -version = "0.60.9" +version = "0.60.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab0b0166827aa700d3dc519f72f8b3a91c35d0b8d042dc5d643a91e6f80648fc" +checksum = "3db87b96cb1b16c024980f133968d52882ca0daaee3a086c6decc500f6c99728" dependencies = [ "xmlparser", ] [[package]] name = "aws-types" -version = "1.3.7" +version = "1.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a322fec39e4df22777ed3ad8ea868ac2f94cd15e1a55f6ee8d8d6305057689a" +checksum = "b069d19bf01e46298eaedd7c6f283fe565a59263e53eebec945f3e6398f42390" dependencies = [ "aws-credential-types", "aws-smithy-async", @@ -581,7 +574,7 @@ dependencies = [ "config", "http 0.2.12", "http-body-util", - "hyper 1.6.0", + "hyper 1.7.0", "hyper-util", "log", "log4rs", @@ -599,18 +592,18 @@ version = "2.0.0" dependencies = [ "aws-config", "aws-sdk-secretsmanager", - "aws-smithy-mocks-experimental", + "aws-smithy-mocks", "aws-smithy-runtime", "aws-smithy-runtime-api", "aws-smithy-types", "http 0.2.12", "linked-hash-map", "log", - "rustls 0.23.27", + "rustls 0.23.32", "serde", "serde_json", "serde_with", - "thiserror 2.0.12", + "thiserror", "tokio", "tokio-test", ] @@ -627,7 +620,7 @@ dependencies = [ "miniz_oxide", "object", "rustc-demangle", - "windows-targets 0.52.6", + "windows-targets", ] [[package]] @@ -661,7 +654,7 @@ dependencies = [ "bitflags", "cexpr", "clang-sys", - "itertools", + "itertools 0.12.1", "lazy_static", "lazycell", "log", @@ -669,17 +662,37 @@ dependencies = [ "proc-macro2", "quote", "regex", - "rustc-hash", + "rustc-hash 1.1.0", "shlex", - "syn 2.0.101", + "syn", "which", ] +[[package]] +name = "bindgen" +version = "0.72.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895" +dependencies = [ + "bitflags", + "cexpr", + "clang-sys", + "itertools 0.13.0", + "log", + "prettyplease", + "proc-macro2", + "quote", + "regex", + "rustc-hash 2.1.1", + "shlex", + "syn", +] + [[package]] name = "bitflags" -version = "2.9.1" +version = "2.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" +checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" dependencies = [ "serde", ] @@ -704,9 +717,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.17.0" +version = "3.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" [[package]] name = "bytes" @@ -745,10 +758,11 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.23" +version = "1.2.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f4ac86a9e5bc1e2b3449ab9d7d3a6a405e3d1bb28d7b9be8614f55846ae3766" +checksum = "80f41ae168f955c12fb8960b057d70d0ca153fb83182b57d86380443527be7e9" dependencies = [ + "find-msvc-tools", "jobserver", "libc", "shlex", @@ -765,17 +779,16 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" [[package]] name = "chrono" -version = "0.4.41" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" +checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" dependencies = [ - "android-tzdata", "iana-time-zone", "num-traits", "serde", @@ -889,9 +902,9 @@ dependencies = [ [[package]] name = "core-foundation" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" dependencies = [ "core-foundation-sys", "libc", @@ -914,18 +927,18 @@ dependencies = [ [[package]] name = "crc32fast" -version = "1.4.2" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" dependencies = [ "cfg-if", ] [[package]] name = "crunchy" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" [[package]] name = "crypto-common" @@ -939,9 +952,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.20.11" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" +checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" dependencies = [ "darling_core", "darling_macro", @@ -949,27 +962,27 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.11" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" +checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", "strsim", - "syn 2.0.101", + "syn", ] [[package]] name = "darling_macro" -version = "0.20.11" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" +checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" dependencies = [ "darling_core", "quote", - "syn 2.0.101", + "syn", ] [[package]] @@ -980,23 +993,33 @@ checksum = "2a2330da5de22e8a3cb63252ce2abb30116bf5265e89c0e01bc17015ce30a476" [[package]] name = "deranged" -version = "0.4.0" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" +checksum = "d630bccd429a5bb5a64b5e94f693bfc48c9f8566418fda4c494cc94f911f87cc" dependencies = [ "powerfmt", "serde", ] [[package]] -name = "derivative" -version = "2.2.0" +name = "derive_more" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +checksum = "093242cf7570c207c83073cf82f79706fe7b8317e98620a47d5be7c3d8497678" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn", + "unicode-xid", ] [[package]] @@ -1030,7 +1053,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn", ] [[package]] @@ -1048,6 +1071,12 @@ version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + [[package]] name = "either" version = "1.15.0" @@ -1084,24 +1113,12 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" -version = "0.3.12" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cea14ef9355e3beab063703aa9dab15afd25f0667c341310c1e5274bb1d0da18" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.59.0", -] - -[[package]] -name = "extend" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f47da3a72ec598d9c8937a7ebca8962a5c7a1f28444e38c2b33c771ba3f55f05" -dependencies = [ - "proc-macro-error", - "proc-macro2", - "quote", - "syn 1.0.109", + "windows-sys 0.61.0", ] [[package]] @@ -1110,11 +1127,17 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +[[package]] +name = "find-msvc-tools" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ced73b1dacfc750a6db6c0a0c3a3853c8b41997e2e2c563dc90804ae6867959" + [[package]] name = "flate2" -version = "1.1.1" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ced92e76e966ca2fd84c8f7aa01a4aea65b0eb6648d72f7c8f3e2764a67fece" +checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" dependencies = [ "crc32fast", "miniz_oxide", @@ -1128,9 +1151,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "form_urlencoded" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" dependencies = [ "percent-encoding", ] @@ -1198,7 +1221,7 @@ checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" dependencies = [ "cfg-if", "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi 0.11.1+wasi-snapshot-preview1", ] [[package]] @@ -1210,7 +1233,7 @@ dependencies = [ "cfg-if", "libc", "r-efi", - "wasi 0.14.2+wasi-0.2.4", + "wasi 0.14.7+wasi-0.2.4", ] [[package]] @@ -1221,15 +1244,15 @@ checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "glob" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" [[package]] name = "h2" -version = "0.3.26" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +checksum = "0beca50380b1fc32983fc1cb4587bfa4bb9e78fc259aad4a0032d2080309222d" dependencies = [ "bytes", "fnv", @@ -1237,7 +1260,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.9.0", + "indexmap 2.11.4", "slab", "tokio", "tokio-util", @@ -1246,9 +1269,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.10" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9421a676d1b147b16b82c9225157dc629087ef8ec4d5e2960f9437a90dac0a5" +checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" dependencies = [ "atomic-waker", "bytes", @@ -1256,7 +1279,7 @@ dependencies = [ "futures-core", "futures-sink", "http 1.3.1", - "indexmap 2.9.0", + "indexmap 2.11.4", "slab", "tokio", "tokio-util", @@ -1291,9 +1314,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.3" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3" +checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" [[package]] name = "hashlink" @@ -1306,9 +1329,9 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f154ce46856750ed433c8649605bf7ed2de3bc35fd9d2a9f30cddd873c80cb08" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" [[package]] name = "hex" @@ -1404,9 +1427,9 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "humantime" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b112acc8b3adf4b107a8ec20977da0273a8c386765a3ec0229bd500a1443f9f" +checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424" [[package]] name = "hyper" @@ -1418,14 +1441,14 @@ dependencies = [ "futures-channel", "futures-core", "futures-util", - "h2 0.3.26", + "h2 0.3.27", "http 0.2.12", "http-body 0.4.6", "httparse", "httpdate", "itoa", "pin-project-lite", - "socket2", + "socket2 0.5.10", "tokio", "tower-service", "tracing", @@ -1434,20 +1457,22 @@ dependencies = [ [[package]] name = "hyper" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" +checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" dependencies = [ + "atomic-waker", "bytes", "futures-channel", - "futures-util", - "h2 0.4.10", + "futures-core", + "h2 0.4.12", "http 1.3.1", "http-body 1.0.1", "httparse", "httpdate", "itoa", "pin-project-lite", + "pin-utils", "smallvec", "tokio", "want", @@ -1471,37 +1496,40 @@ dependencies = [ [[package]] name = "hyper-rustls" -version = "0.27.5" +version = "0.27.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" dependencies = [ - "futures-util", "http 1.3.1", - "hyper 1.6.0", + "hyper 1.7.0", "hyper-util", - "rustls 0.23.27", + "rustls 0.23.32", "rustls-native-certs 0.8.1", "rustls-pki-types", "tokio", - "tokio-rustls 0.26.2", + "tokio-rustls 0.26.3", "tower-service", ] [[package]] name = "hyper-util" -version = "0.1.11" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497bbc33a26fdd4af9ed9c70d63f61cf56a938375fbb32df34db9b1cd6d643f2" +checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8" dependencies = [ + "base64 0.22.1", "bytes", "futures-channel", + "futures-core", "futures-util", "http 1.3.1", "http-body 1.0.1", - "hyper 1.6.0", + "hyper 1.7.0", + "ipnet", "libc", + "percent-encoding", "pin-project-lite", - "socket2", + "socket2 0.6.0", "tokio", "tower-service", "tracing", @@ -1509,9 +1537,9 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.63" +version = "0.1.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" +checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -1580,9 +1608,9 @@ checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" [[package]] name = "icu_properties" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2549ca8c7241c82f59c80ba2a6f415d931c5b58d24fb8412caa1a1f02c49139a" +checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" dependencies = [ "displaydoc", "icu_collections", @@ -1596,9 +1624,9 @@ dependencies = [ [[package]] name = "icu_properties_data" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8197e866e47b68f8f7d95249e172903bec06004b18b2937f1095d40a0c57de04" +checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" [[package]] name = "icu_provider" @@ -1625,9 +1653,9 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" -version = "1.0.3" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" dependencies = [ "idna_adapter", "smallvec", @@ -1657,15 +1685,33 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.9.0" +version = "2.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" +checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" dependencies = [ "equivalent", - "hashbrown 0.15.3", + "hashbrown 0.16.0", "serde", + "serde_core", ] +[[package]] +name = "io-uring" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" +dependencies = [ + "bitflags", + "cfg-if", + "libc", +] + +[[package]] +name = "ipnet" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" + [[package]] name = "is-terminal" version = "0.4.16" @@ -1686,6 +1732,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.15" @@ -1694,9 +1749,9 @@ checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "jobserver" -version = "0.1.33" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" dependencies = [ "getrandom 0.3.3", "libc", @@ -1704,9 +1759,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.77" +version = "0.3.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +checksum = "852f13bec5eba4ba9afbeb93fd7c13fe56147f055939ae21c43a29a0ecb2702e" dependencies = [ "once_cell", "wasm-bindgen", @@ -1737,18 +1792,18 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.172" +version = "0.2.175" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" +checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" [[package]] name = "libloading" -version = "0.8.7" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a793df0d7afeac54f95b471d3af7f0d4fb975699f972341a4b76988d49cdf0c" +checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" dependencies = [ "cfg-if", - "windows-targets 0.53.0", + "windows-link", ] [[package]] @@ -1771,9 +1826,9 @@ checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" [[package]] name = "lock_api" -version = "0.4.12" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" dependencies = [ "autocfg", "scopeguard", @@ -1781,9 +1836,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.27" +version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" dependencies = [ "serde", ] @@ -1796,47 +1851,48 @@ checksum = "a94d21414c1f4a51209ad204c1776a3d0765002c76c6abcb602a6f09f1e881c7" [[package]] name = "log4rs" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0816135ae15bd0391cf284eab37e6e3ee0a6ee63d2ceeb659862bd8d0a984ca6" +checksum = "3e947bb896e702c711fccc2bf02ab2abb6072910693818d1d6b07ee2b9dfd86c" dependencies = [ "anyhow", "arc-swap", "chrono", - "derivative", + "derive_more", "flate2", "fnv", "humantime", "libc", "log", "log-mdc", - "once_cell", + "mock_instant", "parking_lot", "rand", "serde", "serde-value", "serde_json", "serde_yaml", - "thiserror 1.0.69", + "thiserror", "thread-id", "typemap-ors", + "unicode-segmentation", "winapi", ] [[package]] name = "matchers" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" dependencies = [ - "regex-automata 0.1.10", + "regex-automata", ] [[package]] name = "memchr" -version = "2.7.4" +version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" [[package]] name = "minimal-lexical" @@ -1846,24 +1902,30 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.8.8" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" dependencies = [ "adler2", ] [[package]] name = "mio" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" dependencies = [ "libc", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.52.0", + "wasi 0.11.1+wasi-snapshot-preview1", + "windows-sys 0.59.0", ] +[[package]] +name = "mock_instant" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dce6dd36094cac388f119d2e9dc82dc730ef91c32a6222170d630e5414b956e6" + [[package]] name = "nom" version = "7.1.3" @@ -1876,12 +1938,11 @@ dependencies = [ [[package]] name = "nu-ansi-term" -version = "0.46.0" +version = "0.50.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +checksum = "d4a28e057d01f97e61255210fcff094d74ed0466038633e95017f5beb68e4399" dependencies = [ - "overload", - "winapi", + "windows-sys 0.52.0", ] [[package]] @@ -1975,17 +2036,11 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a80800c0488c3a21695ea981a54918fbb37abf04f4d0720c453632255e2ff0e" -[[package]] -name = "overload" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" - [[package]] name = "parking_lot" -version = "0.12.3" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" dependencies = [ "lock_api", "parking_lot_core", @@ -1993,15 +2048,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.10" +version = "0.9.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-targets 0.52.6", + "windows-targets", ] [[package]] @@ -2012,26 +2067,26 @@ checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" [[package]] name = "percent-encoding" -version = "2.3.1" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pest" -version = "2.8.0" +version = "2.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "198db74531d58c70a361c42201efde7e2591e976d518caf7662a47dc5720e7b6" +checksum = "21e0a3a33733faeaf8651dfee72dd0f388f0c8e5ad496a3478fa5a922f49cfa8" dependencies = [ "memchr", - "thiserror 2.0.12", + "thiserror", "ucd-trie", ] [[package]] name = "pest_derive" -version = "2.8.0" +version = "2.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d725d9cfd79e87dccc9341a2ef39d1b6f6353d68c4b33c177febbe1a402c97c5" +checksum = "bc58706f770acb1dbd0973e6530a3cff4746fb721207feb3a8a6064cd0b6c663" dependencies = [ "pest", "pest_generator", @@ -2039,24 +2094,23 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.8.0" +version = "2.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db7d01726be8ab66ab32f9df467ae8b1148906685bbe75c82d1e65d7f5b3f841" +checksum = "6d4f36811dfe07f7b8573462465d5cb8965fffc2e71ae377a33aecf14c2c9a2f" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote", - "syn 2.0.101", + "syn", ] [[package]] name = "pest_meta" -version = "2.8.0" +version = "2.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f9f832470494906d1fca5329f8ab5791cc60beb230c74815dff541cbd2b5ca0" +checksum = "42919b05089acbd0a5dcd5405fb304d17d1053847b81163d09c4ad18ce8e8420" dependencies = [ - "once_cell", "pest", "sha2", ] @@ -2075,9 +2129,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "potential_utf" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" +checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" dependencies = [ "zerovec", ] @@ -2119,43 +2173,19 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "664ec5419c51e34154eec046ebcba56312d5a2fc3b09a06da188e1ad21afadf6" -dependencies = [ - "proc-macro2", - "syn 2.0.101", -] - -[[package]] -name = "proc-macro-error" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "syn 1.0.109", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr" -version = "1.0.4" +version = "0.2.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", - "quote", - "version_check", + "syn", ] [[package]] name = "proc-macro2" -version = "1.0.95" +version = "1.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" dependencies = [ "unicode-ident", ] @@ -2171,26 +2201,25 @@ dependencies = [ [[package]] name = "r-efi" -version = "5.2.0" +version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" [[package]] name = "rand" -version = "0.8.5" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" dependencies = [ - "libc", "rand_chacha", "rand_core", ] [[package]] name = "rand_chacha" -version = "0.3.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" dependencies = [ "ppv-lite86", "rand_core", @@ -2198,71 +2227,76 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.6.4" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ - "getrandom 0.2.16", + "getrandom 0.3.3", ] [[package]] name = "redox_syscall" -version = "0.5.12" +version = "0.5.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af" +checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" dependencies = [ "bitflags", ] [[package]] -name = "regex" -version = "1.11.1" +name = "ref-cast" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +checksum = "4a0ae411dbe946a674d89546582cea4ba2bb8defac896622d6496f14c23ba5cf" dependencies = [ - "aho-corasick", - "memchr", - "regex-automata 0.4.9", - "regex-syntax 0.8.5", + "ref-cast-impl", ] [[package]] -name = "regex-automata" -version = "0.1.10" +name = "ref-cast-impl" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" dependencies = [ - "regex-syntax 0.6.29", + "proc-macro2", + "quote", + "syn", ] [[package]] -name = "regex-automata" -version = "0.4.9" +name = "regex" +version = "1.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +checksum = "23d7fd106d8c02486a8d64e778353d1cffe08ce79ac2e82f540c86d0facf6912" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.5", + "regex-automata", + "regex-syntax", ] [[package]] -name = "regex-lite" -version = "0.1.6" +name = "regex-automata" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53a49587ad06b26609c52e423de037e7f57f20d53535d66e08c695f347df952a" +checksum = "6b9458fa0bfeeac22b5ca447c63aaf45f28439a709ccd244698632f9aa6394d6" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] [[package]] -name = "regex-syntax" -version = "0.6.29" +name = "regex-lite" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" +checksum = "943f41321c63ef1c92fd763bfe054d2668f7f225a5c29f0105903dc2fc04ba30" [[package]] name = "regex-syntax" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001" [[package]] name = "ring" @@ -2311,9 +2345,9 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.24" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" +checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" [[package]] name = "rustc-hash" @@ -2321,6 +2355,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" +[[package]] +name = "rustc-hash" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" + [[package]] name = "rustc_version" version = "0.4.1" @@ -2357,15 +2397,15 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.27" +version = "0.23.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "730944ca083c1c233a75c09f199e973ca499344a2b7ba9e755c457e86fb4a321" +checksum = "cd3c25631629d034ce7cd9940adc9d45762d46de2b0f57193c4443b92c6d4d40" dependencies = [ "aws-lc-rs", "log", "once_cell", "rustls-pki-types", - "rustls-webpki 0.103.3", + "rustls-webpki 0.103.6", "subtle", "zeroize", ] @@ -2391,7 +2431,7 @@ dependencies = [ "openssl-probe", "rustls-pki-types", "schannel", - "security-framework 3.2.0", + "security-framework 3.5.0", ] [[package]] @@ -2424,9 +2464,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.3" +version = "0.103.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4a72fe2bcf7a6ac6fd7d0b9e5cb68aeb7d4c0a0271730218b3e92d43b4eb435" +checksum = "8572f3c2cb9934231157b45499fc41e1f58c589fdfb81a844ba873265e80f8eb" dependencies = [ "aws-lc-rs", "ring", @@ -2436,9 +2476,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.20" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "ryu" @@ -2448,11 +2488,35 @@ checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "schannel" -version = "0.1.27" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" +checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.0", +] + +[[package]] +name = "schemars" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82d20c4491bc164fa2f6c5d44565947a52ad80b9505d8e36f8d54c27c739fcd0" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", ] [[package]] @@ -2486,12 +2550,12 @@ dependencies = [ [[package]] name = "security-framework" -version = "3.2.0" +version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271720403f46ca04f7ba6f55d438f8bd878d6b8ca0a1046e8228c4145bcbb316" +checksum = "cc198e42d9b7510827939c9a15f5062a0c913f3371d765977e586d2fe6c16f4a" dependencies = [ "bitflags", - "core-foundation 0.10.0", + "core-foundation 0.10.1", "core-foundation-sys", "libc", "security-framework-sys", @@ -2499,9 +2563,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.14.0" +version = "2.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" +checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" dependencies = [ "core-foundation-sys", "libc", @@ -2509,9 +2573,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.26" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" [[package]] name = "separator" @@ -2521,10 +2585,11 @@ checksum = "f97841a747eef040fcd2e7b3b9a220a7205926e60488e673d9e4926d27772ce5" [[package]] name = "serde" -version = "1.0.219" +version = "1.0.226" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +checksum = "0dca6411025b24b60bfa7ec1fe1f8e710ac09782dca409ee8237ba74b51295fd" dependencies = [ + "serde_core", "serde_derive", ] @@ -2538,50 +2603,62 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_core" +version = "1.0.226" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba2ba63999edb9dac981fb34b3e5c0d111a69b0924e253ed29d83f7c99e966a4" +dependencies = [ + "serde_derive", +] + [[package]] name = "serde_derive" -version = "1.0.219" +version = "1.0.226" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +checksum = "8db53ae22f34573731bafa1db20f04027b2d25e02d8205921b569171699cdb33" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn", ] [[package]] name = "serde_json" -version = "1.0.140" +version = "1.0.145" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" dependencies = [ - "indexmap 2.9.0", + "indexmap 2.11.4", "itoa", "memchr", "ryu", "serde", + "serde_core", ] [[package]] name = "serde_spanned" -version = "0.6.8" +version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" dependencies = [ "serde", ] [[package]] name = "serde_with" -version = "3.12.0" +version = "3.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6b6f7f2fcb69f747921f79f3926bd1e203fce4fef62c268dd3abfb6d86029aa" +checksum = "c522100790450cf78eeac1507263d0a350d4d5b30df0c8e1fe051a10c22b376e" dependencies = [ "base64 0.22.1", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.9.0", + "indexmap 2.11.4", + "schemars 0.9.0", + "schemars 1.0.4", "serde", "serde_derive", "serde_json", @@ -2591,14 +2668,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.12.0" +version = "3.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d00caa5193a3c8362ac2b73be6b9e768aa5a4b2f721d8f4b339600c3cb51f8e" +checksum = "327ada00f7d64abaac1e55a6911e90cf665aa051b9a561c7006c157f4633135e" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.101", + "syn", ] [[package]] @@ -2607,7 +2684,7 @@ version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap 2.9.0", + "indexmap 2.11.4", "itoa", "ryu", "serde", @@ -2642,38 +2719,45 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook-registry" -version = "1.4.5" +version = "1.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" +checksum = "b2a4719bff48cee6b39d12c020eeb490953ad2443b7055bd0b21fca26bd8c28b" dependencies = [ "libc", ] [[package]] name = "slab" -version = "0.4.9" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" [[package]] name = "smallvec" -version = "1.15.0" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] name = "socket2" -version = "0.5.9" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" +checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" dependencies = [ "libc", "windows-sys 0.52.0", ] +[[package]] +name = "socket2" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -2694,20 +2778,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.101" +version = "2.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" +checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" dependencies = [ "proc-macro2", "quote", @@ -2722,7 +2795,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn", ] [[package]] @@ -2736,69 +2809,48 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" -dependencies = [ - "thiserror-impl 1.0.69", -] - -[[package]] -name = "thiserror" -version = "2.0.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" -dependencies = [ - "thiserror-impl 2.0.12", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.69" +version = "2.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +checksum = "3467d614147380f2e4e374161426ff399c91084acd2363eaf549172b3d5e60c0" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.101", + "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "2.0.12" +version = "2.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +checksum = "6c5e1be1c48b9172ee610da68fd9cd2770e7a4056cb3fc98710ee6906f0c7960" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn", ] [[package]] name = "thread-id" -version = "4.2.2" +version = "5.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfe8f25bbdd100db7e1d34acf7fd2dc59c4bf8f7483f505eaa7d4f12f76cc0ea" +checksum = "99043e46c5a15af379c06add30d9c93a6c0e8849de00d244c4a2c417da128d80" dependencies = [ "libc", - "winapi", + "windows-sys 0.59.0", ] [[package]] name = "thread_local" -version = "1.1.8" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" dependencies = [ "cfg-if", - "once_cell", ] [[package]] name = "time" -version = "0.3.41" +version = "0.3.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" +checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" dependencies = [ "deranged", "itoa", @@ -2811,15 +2863,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.4" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" +checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" [[package]] name = "time-macros" -version = "0.2.22" +version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" +checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" dependencies = [ "num-conv", "time-core", @@ -2846,9 +2898,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" +checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" dependencies = [ "tinyvec_macros", ] @@ -2861,19 +2913,21 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.45.0" +version = "1.47.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2513ca694ef9ede0fb23fe71a4ee4107cb102b9dc1930f6d0fd77aae068ae165" +checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" dependencies = [ "backtrace", "bytes", + "io-uring", "libc", "mio", "pin-project-lite", "signal-hook-registry", - "socket2", + "slab", + "socket2 0.6.0", "tokio-macros", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -2884,7 +2938,7 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn", ] [[package]] @@ -2899,11 +2953,11 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.26.2" +version = "0.26.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" +checksum = "05f63835928ca123f1bef57abbcd23bb2ba0ac9ae1235f1e65bda0d06e7786bd" dependencies = [ - "rustls 0.23.27", + "rustls 0.23.32", "tokio", ] @@ -2933,9 +2987,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.15" +version = "0.7.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" +checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" dependencies = [ "bytes", "futures-core", @@ -2946,9 +3000,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.22" +version = "0.8.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05ae329d1f08c4d17a59bed7ff5b5a769d062e64a62d34a3261b219e62cd5aae" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" dependencies = [ "serde", "serde_spanned", @@ -2958,20 +3012,20 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.9" +version = "0.6.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3da5db5a963e24bc68be8b17b6fa82814bb22ee8660f192bb182771d498f09a3" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" dependencies = [ "serde", ] [[package]] name = "toml_edit" -version = "0.22.26" +version = "0.22.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ - "indexmap 2.9.0", + "indexmap 2.11.4", "serde", "serde_spanned", "toml_datetime", @@ -2981,9 +3035,9 @@ dependencies = [ [[package]] name = "toml_write" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfb942dfe1d8e29a7ee7fcbde5bd2b9a25fb89aa70caea2eba3bee836ff41076" +checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" [[package]] name = "tower" @@ -3020,20 +3074,20 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.28" +version = "0.1.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn", ] [[package]] name = "tracing-core" -version = "0.1.33" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" dependencies = [ "once_cell", "valuable", @@ -3062,14 +3116,14 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.19" +version = "0.3.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" +checksum = "2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5" dependencies = [ "matchers", "nu-ansi-term", "once_cell", - "regex", + "regex-automata", "serde", "serde_json", "sharded-slab", @@ -3110,9 +3164,9 @@ checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" [[package]] name = "unicode-ident" -version = "1.0.18" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" +checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" [[package]] name = "unicode-segmentation" @@ -3120,6 +3174,12 @@ version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + [[package]] name = "unsafe-any-ors" version = "1.0.0" @@ -3143,13 +3203,14 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.4" +version = "2.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" dependencies = [ "form_urlencoded", "idna", "percent-encoding", + "serde", ] [[package]] @@ -3166,9 +3227,13 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] name = "uuid" -version = "1.16.0" +version = "1.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9" +checksum = "2f87b8aa10b915a06587d0dec516c282ff295b475d94abf425d62b57710070a2" +dependencies = [ + "js-sys", + "wasm-bindgen", +] [[package]] name = "valuable" @@ -3199,50 +3264,60 @@ dependencies = [ [[package]] name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasi" -version = "0.14.2+wasi-0.2.4" +version = "0.14.7+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c" +dependencies = [ + "wasip2", +] + +[[package]] +name = "wasip2" +version = "1.0.1+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" dependencies = [ - "wit-bindgen-rt", + "wit-bindgen", ] [[package]] name = "wasm-bindgen" -version = "0.2.100" +version = "0.2.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +checksum = "ab10a69fbd0a177f5f649ad4d8d3305499c42bab9aef2f7ff592d0ec8f833819" dependencies = [ "cfg-if", "once_cell", "rustversion", "wasm-bindgen-macro", + "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.100" +version = "0.2.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +checksum = "0bb702423545a6007bbc368fde243ba47ca275e549c8a28617f56f6ba53b1d1c" dependencies = [ "bumpalo", "log", "proc-macro2", "quote", - "syn 2.0.101", + "syn", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.100" +version = "0.2.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +checksum = "fc65f4f411d91494355917b605e1480033152658d71f722a90647f56a70c88a0" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -3250,22 +3325,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.100" +version = "0.2.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +checksum = "ffc003a991398a8ee604a401e194b6b3a39677b3173d6e74495eb51b82e99a32" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.100" +version = "0.2.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +checksum = "293c37f4efa430ca14db3721dfbe48d8c33308096bd44d80ebaa775ab71ba1cf" dependencies = [ "unicode-ident", ] @@ -3300,11 +3375,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.9" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.0", ] [[package]] @@ -3315,9 +3390,9 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows-core" -version = "0.61.1" +version = "0.62.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46ec44dc15085cea82cf9c78f85a9114c463a369786585ad2882d1ff0b0acf40" +checksum = "57fe7168f7de578d2d8a05b07fd61870d2e73b4020e9f49aa00da8471723497c" dependencies = [ "windows-implement", "windows-interface", @@ -3334,7 +3409,7 @@ checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn", ] [[package]] @@ -3345,29 +3420,29 @@ checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn", ] [[package]] name = "windows-link" -version = "0.1.1" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" +checksum = "45e46c0661abb7180e7b9c281db115305d49ca1709ab8242adf09666d2173c65" [[package]] name = "windows-result" -version = "0.3.3" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b895b5356fc36103d0f64dd1e94dfa7ac5633f1c9dd6e80fe9ec4adef69e09d" +checksum = "7084dcc306f89883455a206237404d3eaf961e5bd7e0f312f7c91f57eb44167f" dependencies = [ "windows-link", ] [[package]] name = "windows-strings" -version = "0.4.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a7ab927b2637c19b3dbe0965e75d8f2d30bdd697a1516191cad2ec4df8fb28a" +checksum = "7218c655a553b0bed4426cf54b20d7ba363ef543b52d515b3e48d7fd55318dda" dependencies = [ "windows-link", ] @@ -3378,7 +3453,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.6", + "windows-targets", ] [[package]] @@ -3387,39 +3462,32 @@ version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" dependencies = [ - "windows-targets 0.52.6", + "windows-targets", ] [[package]] -name = "windows-targets" -version = "0.52.6" +name = "windows-sys" +version = "0.61.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +checksum = "e201184e40b2ede64bc2ea34968b28e33622acdbbf37104f0e4a33f7abe657aa" dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm 0.52.6", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", + "windows-link", ] [[package]] name = "windows-targets" -version = "0.53.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.53.0", - "windows_aarch64_msvc 0.53.0", - "windows_i686_gnu 0.53.0", - "windows_i686_gnullvm 0.53.0", - "windows_i686_msvc 0.53.0", - "windows_x86_64_gnu 0.53.0", - "windows_x86_64_gnullvm 0.53.0", - "windows_x86_64_msvc 0.53.0", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", ] [[package]] @@ -3428,113 +3496,62 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" - [[package]] name = "windows_aarch64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" -[[package]] -name = "windows_aarch64_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" - [[package]] name = "windows_i686_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" -[[package]] -name = "windows_i686_gnu" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" - [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" -[[package]] -name = "windows_i686_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" - [[package]] name = "windows_i686_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" -[[package]] -name = "windows_i686_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" - [[package]] name = "windows_x86_64_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" -[[package]] -name = "windows_x86_64_gnu" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" - [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" - [[package]] name = "windows_x86_64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" -[[package]] -name = "windows_x86_64_msvc" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" - [[package]] name = "winnow" -version = "0.7.10" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06928c8748d81b05c9be96aad92e1b6ff01833332f281e8cfca3be4b35fc9ec" +checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" dependencies = [ "memchr", ] [[package]] -name = "wit-bindgen-rt" -version = "0.39.0" +name = "wit-bindgen" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" -dependencies = [ - "bitflags", -] +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" [[package]] name = "writeable" @@ -3585,28 +3602,28 @@ checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn", "synstructure", ] [[package]] name = "zerocopy" -version = "0.8.25" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" +checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.25" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" +checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn", ] [[package]] @@ -3626,7 +3643,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn", "synstructure", ] @@ -3649,9 +3666,9 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.11.2" +version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a05eb080e015ba39cc9e23bbe5e7fb04d5fb040350f99f34e338d5fdd294428" +checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" dependencies = [ "yoke", "zerofrom", @@ -3666,5 +3683,5 @@ checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn", ] diff --git a/aws_secretsmanager_caching/Cargo.toml b/aws_secretsmanager_caching/Cargo.toml index 631ab7c..b2b4e8e 100644 --- a/aws_secretsmanager_caching/Cargo.toml +++ b/aws_secretsmanager_caching/Cargo.toml @@ -23,7 +23,7 @@ rustls = "0" log = "0.4.20" [dev-dependencies] -aws-smithy-mocks-experimental = "0" +aws-smithy-mocks = "0.1" aws-smithy-runtime = { version = "1", features = ["test-util", "wire-mock"] } aws-sdk-secretsmanager = { version = "1", features = ["test-util"] } tokio = { version = "1", features = ["macros", "rt", "sync", "test-util"] } diff --git a/aws_secretsmanager_caching/src/lib.rs b/aws_secretsmanager_caching/src/lib.rs index 0704f74..25070e2 100644 --- a/aws_secretsmanager_caching/src/lib.rs +++ b/aws_secretsmanager_caching/src/lib.rs @@ -430,37 +430,49 @@ impl SecretsManagerCachingClient { counter.load(Ordering::Relaxed) } } - #[cfg(test)] mod tests { + use aws_sdk_secretsmanager::{ + config::http::HttpResponse, + operation::{ + describe_secret::{DescribeSecretError, DescribeSecretOutput}, + get_secret_value::{GetSecretValueError, GetSecretValueOutput}, + }, + types::error::ResourceNotFoundException, + }; + use aws_smithy_mocks::{mock, mock_client, RuleMode}; + use aws_smithy_types::{body::SdkBody, error::ErrorMetadata}; use tokio::time::sleep; use super::*; - use aws_smithy_runtime_api::client::http::SharedHttpClient; - - fn fake_client( - ttl: Option, - ignore_transient_errors: bool, - http_client: Option, - endpoint_url: Option, - ) -> SecretsManagerCachingClient { - SecretsManagerCachingClient::new( - asm_mock::def_fake_client(http_client, endpoint_url), - NonZeroUsize::new(1000).unwrap(), - match ttl { - Some(ttl) => ttl, - None => Duration::from_secs(1000), - }, - ignore_transient_errors, - ) - .expect("client should create") - } + use aws_smithy_runtime_api::{client::result::SdkError, http::StatusCode}; #[tokio::test] async fn test_get_secret_value() { - let client = fake_client(None, false, None, None); let secret_id = "test_secret"; + let arn = "arn"; + + let gsv = mock!(aws_sdk_secretsmanager::Client::get_secret_value) + .match_requests(|req| req.secret_id() == Some(secret_id)) + .then_output(move || { + GetSecretValueOutput::builder() + .name(secret_id) + .arn(arn) + .secret_string("hunter2") + .version_stages("AWSCURRENT") + .build() + }); + + let asm_mock = mock_client!(aws_sdk_secretsmanager, [&gsv]); + + let client = SecretsManagerCachingClient::new( + asm_mock, + NonZeroUsize::new(1000).unwrap(), + Duration::from_secs(1000), + true, + ) + .unwrap(); let response = client .get_secret_value(secret_id, None, None, false) @@ -469,53 +481,87 @@ mod tests { assert_eq!(response.name, Some(secret_id.to_string())); assert_eq!(response.secret_string, Some("hunter2".to_string())); - assert_eq!( - response.arn, - Some( - asm_mock::FAKE_ARN - .replace("{{name}}", secret_id) - .to_string() - ) - ); + assert_eq!(response.arn, Some(arn.into())); assert_eq!( response.version_stages, Some(vec!["AWSCURRENT".to_string()]) ); + assert_eq!(gsv.num_calls(), 1) } #[tokio::test] async fn test_get_secret_value_version_id() { - let client = fake_client(None, false, None, None); let secret_id = "test_secret"; let version_id = "test_version"; + let arn = "arn"; + + let gsv = mock!(aws_sdk_secretsmanager::Client::get_secret_value) + .match_requests(|req| { + req.secret_id() == Some(secret_id) && req.version_id() == Some(version_id) + }) + .then_output(move || { + GetSecretValueOutput::builder() + .name(secret_id) + .arn(arn) + .secret_string("hunter2") + .version_id(version_id) + .version_stages("AWSCURRENT") + .build() + }); + + let asm_mock = mock_client!(aws_sdk_secretsmanager, [&gsv]); + + let client = SecretsManagerCachingClient::new( + asm_mock, + NonZeroUsize::new(1000).unwrap(), + Duration::from_secs(1000), + true, + ) + .unwrap(); let response = client .get_secret_value(secret_id, Some(version_id), None, false) .await .unwrap(); - assert_eq!(response.name, Some(secret_id.to_string())); assert_eq!(response.secret_string, Some("hunter2".to_string())); assert_eq!(response.version_id, Some(version_id.to_string())); - assert_eq!( - response.arn, - Some( - asm_mock::FAKE_ARN - .replace("{{name}}", secret_id) - .to_string() - ) - ); + assert_eq!(response.arn, Some(arn.into())); assert_eq!( response.version_stages, Some(vec!["AWSCURRENT".to_string()]) ); + assert_eq!(gsv.num_calls(), 1) } #[tokio::test] async fn test_get_secret_value_version_stage() { - let client = fake_client(None, false, None, None); let secret_id = "test_secret"; let stage_label = "STAGEHERE"; + let arn = "arn"; + + let gsv = mock!(aws_sdk_secretsmanager::Client::get_secret_value) + .match_requests(|req| { + req.secret_id() == Some(secret_id) && req.version_stage() == Some(stage_label) + }) + .then_output(move || { + GetSecretValueOutput::builder() + .name(secret_id) + .arn(arn) + .secret_string("hunter2") + .version_stages(stage_label) + .build() + }); + + let asm_mock = mock_client!(aws_sdk_secretsmanager, [&gsv]); + + let client = SecretsManagerCachingClient::new( + asm_mock, + NonZeroUsize::new(1000).unwrap(), + Duration::from_secs(1000), + true, + ) + .unwrap(); let response = client .get_secret_value(secret_id, None, Some(stage_label), false) @@ -524,47 +570,97 @@ mod tests { assert_eq!(response.name, Some(secret_id.to_string())); assert_eq!(response.secret_string, Some("hunter2".to_string())); - assert_eq!( - response.arn, - Some( - asm_mock::FAKE_ARN - .replace("{{name}}", secret_id) - .to_string() - ) - ); + assert_eq!(response.arn, Some(arn.into())); assert_eq!(response.version_stages, Some(vec![stage_label.to_string()])); + assert_eq!(gsv.num_calls(), 1) } #[tokio::test] async fn test_get_secret_value_version_id_and_stage() { - let client = fake_client(None, false, None, None); let secret_id = "test_secret"; let version_id = "test_version"; let stage_label = "STAGEHERE"; + let arn = "arn"; + + let gsv = mock!(aws_sdk_secretsmanager::Client::get_secret_value) + .match_requests(|req| { + req.secret_id() == Some(secret_id) + && req.version_stage() == Some(stage_label) + && req.version_id() == Some(version_id) + }) + .then_output(move || { + GetSecretValueOutput::builder() + .name(secret_id) + .arn(arn) + .secret_string("hunter2") + .version_stages(stage_label) + .version_id(version_id) + .build() + }); + + let asm_mock = mock_client!(aws_sdk_secretsmanager, [&gsv]); + + let client = SecretsManagerCachingClient::new( + asm_mock, + NonZeroUsize::new(1000).unwrap(), + Duration::from_secs(1000), + true, + ) + .unwrap(); let response = client .get_secret_value(secret_id, Some(version_id), Some(stage_label), false) .await .unwrap(); - assert_eq!(response.name, Some(secret_id.to_string())); assert_eq!(response.secret_string, Some("hunter2".to_string())); assert_eq!(response.version_id, Some(version_id.to_string())); - assert_eq!( - response.arn, - Some( - asm_mock::FAKE_ARN - .replace("{{name}}", secret_id) - .to_string() - ) - ); + assert_eq!(response.arn, Some(arn.into())); assert_eq!(response.version_stages, Some(vec![stage_label.to_string()])); + assert_eq!(gsv.num_calls(), 1) } #[tokio::test] async fn test_get_cache_expired() { - let client = fake_client(Some(Duration::from_secs(0)), false, None, None); let secret_id = "test_secret"; + let version_id = "version_id"; + let version_stage = "AWSCURRENT"; + let arn = "arn"; + + let gsv = mock!(aws_sdk_secretsmanager::Client::get_secret_value) + .match_requests(|req| req.secret_id() == Some(secret_id)) + .then_output(move || { + GetSecretValueOutput::builder() + .name(secret_id) + .arn(arn) + .secret_string("hunter2") + .version_id(version_id) + .version_stages(version_stage) + .build() + }); + + let describe_secret = + mock!(aws_sdk_secretsmanager::Client::describe_secret).then_output(move || { + // Don't serve the same value + DescribeSecretOutput::builder() + .name(secret_id) + .version_ids_to_stages("different_version_id", vec![version_stage.into()]) + .build() + }); + + let asm_mock = mock_client!( + aws_sdk_secretsmanager, + RuleMode::MatchAny, + [&gsv, &describe_secret] + ); + + let client = SecretsManagerCachingClient::new( + asm_mock, + NonZeroUsize::new(1000).unwrap(), + Duration::from_secs(0), + true, + ) + .unwrap(); // Run through this twice to test the cache expiration for i in 0..2 { @@ -575,14 +671,7 @@ mod tests { assert_eq!(response.name, Some(secret_id.to_string())); assert_eq!(response.secret_string, Some("hunter2".to_string())); - assert_eq!( - response.arn, - Some( - asm_mock::FAKE_ARN - .replace("{{name}}", secret_id) - .to_string() - ) - ); + assert_eq!(response.arn, Some(arn.into())); assert_eq!( response.version_stages, Some(vec!["AWSCURRENT".to_string()]) @@ -592,229 +681,518 @@ mod tests { sleep(Duration::from_millis(50)).await; } } + + assert_eq!(gsv.num_calls(), 2) } #[tokio::test] - #[should_panic] async fn test_get_secret_value_kms_access_denied() { - let client = fake_client(None, false, None, None); + let gsv = + mock!(aws_sdk_secretsmanager::Client::get_secret_value).then_http_response(|| { + HttpResponse::new( + StatusCode::try_from(400).unwrap(), + SdkBody::from( + r##"{ + "__type":"AccessDeniedException", + "message":"Access to KMS is not allowed" + }"##, + ), + ) + }); + + let asm_mock = mock_client!(aws_sdk_secretsmanager, &[gsv]); + + let client = SecretsManagerCachingClient::new( + asm_mock, + NonZeroUsize::new(1000).unwrap(), + Duration::from_secs(1000), + true, + ) + .unwrap(); let secret_id = "KMSACCESSDENIEDabcdef"; - client - .get_secret_value(secret_id, None, None, false) - .await - .unwrap(); + match client.get_secret_value(secret_id, None, None, false).await { + Ok(_) => panic!(), + Err(e) => e.to_string().contains("Access to KMS is not allowed"), + }; } #[tokio::test] - #[should_panic] async fn test_get_secret_value_resource_not_found() { - let client = fake_client(None, false, None, None); + let gsv = mock!(aws_sdk_secretsmanager::Client::get_secret_value).then_error(|| { + GetSecretValueError::ResourceNotFoundException( + ResourceNotFoundException::builder() + .message("Secrets Manager can't find the specified secret.") + .build(), + ) + }); + + let asm_mock = mock_client!(aws_sdk_secretsmanager, &[gsv]); + + let client = SecretsManagerCachingClient::new( + asm_mock, + NonZeroUsize::new(1000).unwrap(), + Duration::from_secs(1000), + true, + ) + .unwrap(); + let secret_id = "NOTFOUNDfasefasef"; - client - .get_secret_value(secret_id, None, None, false) - .await - .unwrap(); + match client.get_secret_value(secret_id, None, None, false).await { + Ok(_) => panic!(), + Err(e) => assert!(e + .downcast::>() + .unwrap() + .into_service_error() + .is_resource_not_found_exception()), + }; } #[tokio::test] - async fn test_is_current_default_succeeds() { - let client = fake_client(Some(Duration::from_secs(0)), false, None, None); + async fn test_get_cache_is_current_fast_refreshes() { let secret_id = "test_secret"; + let version_id = "version_id"; + let version_stage = "AWSCURRENT"; + let arn = "arn"; + + let gsv = mock!(aws_sdk_secretsmanager::Client::get_secret_value) + .match_requests(|req| req.secret_id() == Some(secret_id)) + .then_output(move || { + GetSecretValueOutput::builder() + .name(secret_id) + .arn(arn) + .secret_string("hunter2") + .version_id(version_id) + .version_stages(version_stage) + .build() + }); + + let describe_secret = + mock!(aws_sdk_secretsmanager::Client::describe_secret).then_output(move || { + // Cache is current. We fast-refresh + DescribeSecretOutput::builder() + .name(secret_id) + .version_ids_to_stages(version_id, vec![version_stage.into()]) + .build() + }); + + let asm_mock = mock_client!( + aws_sdk_secretsmanager, + RuleMode::MatchAny, + [&gsv, &describe_secret] + ); - let res1 = client - .get_secret_value(secret_id, None, None, false) - .await - .unwrap(); + let client = SecretsManagerCachingClient::new( + asm_mock, + NonZeroUsize::new(1000).unwrap(), + Duration::from_secs(0), + true, + ) + .unwrap(); - let res2 = client - .get_secret_value(secret_id, None, None, false) - .await - .unwrap(); + // Run through this twice to test the cache expiration + for i in 0..2 { + let response = client + .get_secret_value(secret_id, None, None, false) + .await + .unwrap(); - assert_eq!(res1, res2) + assert_eq!(response.name, Some(secret_id.to_string())); + assert_eq!(response.secret_string, Some("hunter2".to_string())); + assert_eq!(response.arn, Some(arn.into())); + assert_eq!( + response.version_stages, + Some(vec!["AWSCURRENT".to_string()]) + ); + // let the entry expire + if i == 0 { + sleep(Duration::from_millis(50)).await; + } + } + + assert_eq!(gsv.num_calls(), 1); + assert_eq!(describe_secret.num_calls(), 1); } #[tokio::test] async fn test_is_current_version_id_succeeds() { - let client = fake_client(Some(Duration::from_secs(0)), false, None, None); let secret_id = "test_secret"; - let version_id = Some("test_version"); + let version_id = "version_id"; + let version_stage = "AWSCURRENT"; + let arn = "arn"; + + let gsv = mock!(aws_sdk_secretsmanager::Client::get_secret_value) + .match_requests(|req| { + req.secret_id() == Some(secret_id) && req.version_id() == Some(version_id) + }) + .then_output(move || { + GetSecretValueOutput::builder() + .name(secret_id) + .arn(arn) + .secret_string("hunter2") + .version_id(version_id) + .version_stages(version_stage) + .build() + }); + + let describe_secret = + mock!(aws_sdk_secretsmanager::Client::describe_secret).then_output(move || { + // Cache is current. We fast-refresh + DescribeSecretOutput::builder() + .name(secret_id) + .version_ids_to_stages(version_id, vec![version_stage.into()]) + .build() + }); + + let asm_mock = mock_client!( + aws_sdk_secretsmanager, + RuleMode::MatchAny, + [&gsv, &describe_secret] + ); - let res1 = client - .get_secret_value(secret_id, version_id, None, false) - .await - .unwrap(); + let client = SecretsManagerCachingClient::new( + asm_mock, + NonZeroUsize::new(1000).unwrap(), + Duration::from_secs(0), + true, + ) + .unwrap(); - let res2 = client - .get_secret_value(secret_id, version_id, None, false) - .await - .unwrap(); + // Run through this twice to test the cache expiration + for i in 0..2 { + let response = client + .get_secret_value(secret_id, Some(version_id), None, false) + .await + .unwrap(); - assert_eq!(res1, res2) + assert_eq!(response.name, Some(secret_id.to_string())); + assert_eq!(response.secret_string, Some("hunter2".to_string())); + assert_eq!(response.arn, Some(arn.into())); + assert_eq!( + response.version_stages, + Some(vec!["AWSCURRENT".to_string()]) + ); + // let the entry expire + if i == 0 { + sleep(Duration::from_millis(50)).await; + } + } + + assert_eq!(gsv.num_calls(), 1); + assert_eq!(describe_secret.num_calls(), 1); } #[tokio::test] async fn test_is_current_version_stage_succeeds() { - let client = fake_client(Some(Duration::from_secs(0)), false, None, None); let secret_id = "test_secret"; - let version_stage = Some("VERSIONSTAGE"); + let version_id = "version_id"; + let version_stage = "VERSIONSTAGE"; + let arn = "arn"; + + let gsv = mock!(aws_sdk_secretsmanager::Client::get_secret_value) + .match_requests(|req| { + req.secret_id() == Some(secret_id) && req.version_stage() == Some(version_stage) + }) + .then_output(move || { + GetSecretValueOutput::builder() + .name(secret_id) + .arn(arn) + .secret_string("hunter2") + .version_id(version_id) + .version_stages(version_stage) + .build() + }); + + let describe_secret = + mock!(aws_sdk_secretsmanager::Client::describe_secret).then_output(move || { + // Cache is current. We fast-refresh + DescribeSecretOutput::builder() + .name(secret_id) + .version_ids_to_stages(version_id, vec![version_stage.into()]) + .build() + }); + + let asm_mock = mock_client!( + aws_sdk_secretsmanager, + RuleMode::MatchAny, + [&gsv, &describe_secret] + ); - let res1 = client - .get_secret_value(secret_id, None, version_stage, false) - .await - .unwrap(); + let client = SecretsManagerCachingClient::new( + asm_mock, + NonZeroUsize::new(1000).unwrap(), + Duration::from_secs(0), + true, + ) + .unwrap(); - let res2 = client - .get_secret_value(secret_id, None, version_stage, false) - .await - .unwrap(); + // Run through this twice to test the cache expiration + for i in 0..2 { + let response = client + .get_secret_value(secret_id, None, Some(version_stage), false) + .await + .unwrap(); - assert_eq!(res1, res2) + assert_eq!(response.name, Some(secret_id.to_string())); + assert_eq!(response.secret_string, Some("hunter2".to_string())); + assert_eq!(response.arn, Some(arn.into())); + assert_eq!( + response.version_stages, + Some(vec![version_stage.to_string()]) + ); + // let the entry expire + if i == 0 { + sleep(Duration::from_millis(50)).await; + } + } + + assert_eq!(gsv.num_calls(), 1); + assert_eq!(describe_secret.num_calls(), 1); } #[tokio::test] - async fn test_is_current_both_version_id_and_version_stage_succeeds() { - let client = fake_client(Some(Duration::from_secs(0)), false, None, None); + async fn test_is_current_both_version_id_and_version_stage_succeed() { let secret_id = "test_secret"; - let version_id = Some("test_version"); - let version_stage = Some("VERSIONSTAGE"); + let version_id = "version_id"; + let version_stage = "VERSIONSTAGE"; + let arn = "arn"; + + let gsv = mock!(aws_sdk_secretsmanager::Client::get_secret_value) + .match_requests(|req| { + req.secret_id() == Some(secret_id) + && req.version_stage() == Some(version_stage) + && req.version_id() == Some(version_id) + }) + .then_output(move || { + GetSecretValueOutput::builder() + .name(secret_id) + .arn(arn) + .secret_string("hunter2") + .version_id(version_id) + .version_stages(version_stage) + .build() + }); + + let describe_secret = + mock!(aws_sdk_secretsmanager::Client::describe_secret).then_output(move || { + // Cache is current. We fast-refresh + DescribeSecretOutput::builder() + .name(secret_id) + .version_ids_to_stages(version_id, vec![version_stage.into()]) + .build() + }); + + let asm_mock = mock_client!( + aws_sdk_secretsmanager, + RuleMode::MatchAny, + [&gsv, &describe_secret] + ); - let res1 = client - .get_secret_value(secret_id, version_id, version_stage, false) - .await - .unwrap(); + let client = SecretsManagerCachingClient::new( + asm_mock, + NonZeroUsize::new(1000).unwrap(), + Duration::from_secs(0), + true, + ) + .unwrap(); - let res2 = client - .get_secret_value(secret_id, version_id, version_stage, false) - .await - .unwrap(); + // Run through this twice to test the cache expiration + for i in 0..2 { + let response = client + .get_secret_value(secret_id, Some(version_id), Some(version_stage), false) + .await + .unwrap(); - assert_eq!(res1, res2) + assert_eq!(response.name, Some(secret_id.to_string())); + assert_eq!(response.secret_string, Some("hunter2".to_string())); + assert_eq!(response.arn, Some(arn.into())); + assert_eq!( + response.version_stages, + Some(vec![version_stage.to_string()]) + ); + // let the entry expire + if i == 0 { + sleep(Duration::from_millis(50)).await; + } + } + + assert_eq!(gsv.num_calls(), 1); + assert_eq!(describe_secret.num_calls(), 1); } #[tokio::test] async fn test_is_current_describe_access_denied_fails() { - let client = fake_client(Some(Duration::from_secs(0)), false, None, None); - let secret_id = "DESCRIBEACCESSDENIED_test_secret"; - let version_id = Some("test_version"); - - client - .get_secret_value(secret_id, version_id, None, false) - .await - .unwrap(); + let secret_id = "test_secret"; + let version_id = "version_id"; + let version_stage = "VERSIONSTAGE"; + let arn = "arn"; + let secret_string = "hunter2"; + + let gsv = mock!(aws_sdk_secretsmanager::Client::get_secret_value) + .match_requests(|req| { + req.secret_id() == Some(secret_id) + && req.version_stage() == Some(version_stage) + && req.version_id() == Some(version_id) + }) + .then_output(move || { + GetSecretValueOutput::builder() + .name(secret_id) + .arn(arn) + .secret_string(secret_string) + .version_id(version_id) + .version_stages(version_stage) + .build() + }); + + let describe_secret = + mock!(aws_sdk_secretsmanager::Client::describe_secret).then_error(|| { + // TODO: Figure out how to set __type + DescribeSecretError::generic( + ErrorMetadata::builder() + .code("400") + .message("is not authorized to perform: secretsmanager:DescribeSecret on resource: XXXXXXXX") + .build(), + ) + }); - if (client - .get_secret_value(secret_id, version_id, None, false) - .await) - .is_ok() - { - panic!("Expected failure") - } - } + let asm_mock = mock_client!( + aws_sdk_secretsmanager, + RuleMode::MatchAny, + [&gsv, &describe_secret] + ); - #[tokio::test] - async fn test_is_current_describe_timeout_error_succeeds() { - use asm_mock::GSV_BODY; - use aws_smithy_runtime::client::http::test_util::wire::{ReplayedEvent, WireMockServer}; - - let mock = WireMockServer::start(vec![ - ReplayedEvent::with_body(GSV_BODY), - ReplayedEvent::Timeout, - ]) - .await; - let client = fake_client( - Some(Duration::from_secs(0)), + let client = SecretsManagerCachingClient::new( + asm_mock, + NonZeroUsize::new(1000).unwrap(), + Duration::from_secs(0), true, - Some(mock.http_client()), - Some(mock.endpoint_url()), - ); - let secret_id = "DESCRIBETIMEOUT_test_secret"; - let version_id = Some("test_version"); + ) + .unwrap(); - let res1 = client - .get_secret_value(secret_id, version_id, None, false) + // Run through this twice to test the cache expiration + let response = client + .get_secret_value(secret_id, Some(version_id), Some(version_stage), false) .await .unwrap(); - let res2 = client - .get_secret_value(secret_id, version_id, None, false) - .await - .unwrap(); + assert_eq!(response.name, Some(secret_id.to_string())); + assert_eq!(response.secret_string, Some(secret_string.to_string())); + assert_eq!(response.arn, Some(arn.into())); + assert_eq!( + response.version_stages, + Some(vec![version_stage.to_string()]) + ); + // let the entry expire + sleep(Duration::from_millis(50)).await; - mock.shutdown(); + if client + .get_secret_value(secret_id, Some(version_id), Some(version_stage), false) + .await + .is_ok() + { + panic!("Expected failure") + } - assert_eq!(res1, res2) + assert_eq!(gsv.num_calls(), 1) } #[tokio::test] async fn test_is_current_describe_service_error_succeeds() { - let client = fake_client(Some(Duration::from_secs(0)), true, None, None); let secret_id = "DESCRIBESERVICEERROR_test_secret"; - let version_id = Some("test_version"); - let version_stage = Some("VERSIONSTAGE"); - - let res1 = client - .get_secret_value(secret_id, version_id, version_stage, false) - .await - .unwrap(); - - let res2 = client - .get_secret_value(secret_id, version_id, version_stage, false) - .await - .unwrap(); - - assert_eq!(res1, res2) - } + let version_id = "test_version"; + let version_stage = "VERSIONSTAGE"; + let arn = "arn"; + + let gsv = mock!(aws_sdk_secretsmanager::Client::get_secret_value) + .match_requests(|req| { + req.secret_id() == Some(secret_id) + && req.version_stage() == Some(version_stage) + && req.version_id() == Some(version_id) + }) + .then_output(move || { + GetSecretValueOutput::builder() + .name(secret_id) + .arn(arn) + .secret_string("hunter2") + .version_id(version_id) + .version_stages(version_stage) + .build() + }); + + let describe_secret = mock!(aws_sdk_secretsmanager::Client::describe_secret) + .then_http_response(|| { + HttpResponse::new( + StatusCode::try_from(500).unwrap(), + SdkBody::from( + r##"{ + "__type": "InternalServiceError", + "message": "Internal service error" + }"##, + ), + ) + }); - #[tokio::test] - async fn test_is_current_gsv_timeout_error_succeeds() { - use asm_mock::DESC_BODY; - use asm_mock::GSV_BODY; - use aws_smithy_runtime::client::http::test_util::wire::{ReplayedEvent, WireMockServer}; - - let mock = WireMockServer::start(vec![ - ReplayedEvent::with_body( - GSV_BODY - .replace("{{version}}", "old_version") - .replace("{{label}}", "AWSCURRENT"), - ), - ReplayedEvent::with_body( - DESC_BODY - .replace("{{version}}", "new_version") - .replace("{{label}}", "AWSCURRENT"), - ), - ReplayedEvent::Timeout, - ]) - .await; - let client = fake_client( - Some(Duration::from_secs(0)), - true, - Some(mock.http_client()), - Some(mock.endpoint_url()), + let asm_mock = mock_client!( + aws_sdk_secretsmanager, + RuleMode::MatchAny, + [&gsv, &describe_secret] ); - let secret_id = "GSVTIMEOUT_test_secret"; + let client = SecretsManagerCachingClient::new( + asm_mock, + NonZeroUsize::new(1000).unwrap(), + Duration::ZERO, + true, + ) + .unwrap(); let res1 = client - .get_secret_value(secret_id, None, None, false) + .get_secret_value(secret_id, Some(version_id), Some(version_stage), false) .await .unwrap(); let res2 = client - .get_secret_value(secret_id, None, None, false) + .get_secret_value(secret_id, Some(version_id), Some(version_stage), false) .await .unwrap(); - mock.shutdown(); - assert_eq!(res1, res2) } #[tokio::test] async fn test_get_secret_value_refresh_now_true() { - let client = fake_client(Some(Duration::from_secs(30)), false, None, None); let secret_id = "REFRESHNOW_test_secret"; + let arn = "arn"; + + let gsv = mock!(aws_sdk_secretsmanager::Client::get_secret_value) + .match_requests(|req| req.secret_id() == Some(secret_id)) + .sequence() + .output(move || { + GetSecretValueOutput::builder() + .name(secret_id) + .arn(arn) + .secret_string("hunter2") + .version_stages("AWSCURRENT") + .build() + }) + .output(move || { + GetSecretValueOutput::builder() + .name(secret_id) + .arn(arn) + .secret_string("some other string") + .version_stages("AWSCURRENT") + .build() + }) + .build(); + + let asm_mock = mock_client!(aws_sdk_secretsmanager, [&gsv]); + let client = SecretsManagerCachingClient::new( + asm_mock, + NonZeroUsize::new(1000).unwrap(), + Duration::from_secs(30), + true, + ) + .unwrap(); let response1 = client .get_secret_value(secret_id, None, None, false) @@ -822,35 +1200,57 @@ mod tests { .unwrap(); assert_eq!(response1.name, Some(secret_id.to_string())); - assert_eq!( - response1.arn, - Some( - asm_mock::FAKE_ARN - .replace("{{name}}", secret_id) - .to_string() - ) - ); + assert_eq!(response1.arn, Some(arn.into())); assert_eq!( response1.version_stages, Some(vec!["AWSCURRENT".to_string()]) ); - sleep(Duration::from_millis(1)).await; - let response2 = client .get_secret_value(secret_id, None, None, true) .await .unwrap(); - assert_ne!(response1.secret_string, response2.secret_string); assert_eq!(response1.arn, response2.arn); assert_eq!(response1.version_stages, response2.version_stages); + + assert_eq!(gsv.num_calls(), 2) } #[tokio::test] async fn test_get_secret_value_refresh_now_false() { - let client = fake_client(Some(Duration::from_secs(30)), false, None, None); let secret_id = "REFRESHNOW_test_secret"; + let arn = "arn"; + + let gsv = mock!(aws_sdk_secretsmanager::Client::get_secret_value) + .match_requests(|req| req.secret_id() == Some(secret_id)) + .sequence() + .output(move || { + GetSecretValueOutput::builder() + .name(secret_id) + .arn(arn) + .secret_string("hunter2") + .version_stages("AWSCURRENT") + .build() + }) + .output(move || { + GetSecretValueOutput::builder() + .name(secret_id) + .arn(arn) + .secret_string("some other string") + .version_stages("AWSCURRENT") + .build() + }) + .build(); + + let asm_mock = mock_client!(aws_sdk_secretsmanager, [&gsv]); + let client = SecretsManagerCachingClient::new( + asm_mock, + NonZeroUsize::new(1000).unwrap(), + Duration::from_secs(30), + true, + ) + .unwrap(); let response1 = client .get_secret_value(secret_id, None, None, false) @@ -858,69 +1258,88 @@ mod tests { .unwrap(); assert_eq!(response1.name, Some(secret_id.to_string())); - assert_eq!( - response1.arn, - Some( - asm_mock::FAKE_ARN - .replace("{{name}}", secret_id) - .to_string() - ) - ); + assert_eq!(response1.arn, Some(arn.into())); assert_eq!( response1.version_stages, Some(vec!["AWSCURRENT".to_string()]) ); - sleep(Duration::from_millis(1)).await; - let response2 = client .get_secret_value(secret_id, None, None, false) .await .unwrap(); assert_eq!(response1, response2); + + assert_eq!(gsv.num_calls(), 1) } #[tokio::test] async fn test_get_secret_value_version_id_and_stage_refresh_now() { - let client = fake_client(Some(Duration::from_secs(30)), false, None, None); let secret_id = "REFRESHNOW_test_secret"; let version_id = "test_version"; let stage_label = "STAGEHERE"; + let arn = "arn"; + + let gsv = mock!(aws_sdk_secretsmanager::Client::get_secret_value) + .match_requests(|req| req.secret_id() == Some(secret_id)) + .sequence() + .output(move || { + GetSecretValueOutput::builder() + .name(secret_id) + .arn(arn) + .secret_string("hunter2") + .version_stages("AWSCURRENT") + .build() + }) + .output(move || { + GetSecretValueOutput::builder() + .name(secret_id) + .arn(arn) + .secret_string("some other string") + .version_stages("AWSCURRENT") + .build() + }) + .build(); + + let asm_mock = mock_client!(aws_sdk_secretsmanager, [&gsv]); + let client = SecretsManagerCachingClient::new( + asm_mock, + NonZeroUsize::new(1000).unwrap(), + Duration::from_secs(30), + true, + ) + .unwrap(); let response1 = client .get_secret_value(secret_id, Some(version_id), Some(stage_label), false) .await .unwrap(); - sleep(Duration::from_millis(1)).await; - let response2 = client .get_secret_value(secret_id, Some(version_id), Some(stage_label), true) .await .unwrap(); - assert_ne!(response1.secret_string, response2.secret_string); assert_eq!(response1.arn, response2.arn); assert_eq!(response1.version_stages, response2.version_stages); + + assert_eq!(gsv.num_calls(), 2); } - mod asm_mock { + mod wire_tests { use aws_sdk_secretsmanager as secretsmanager; - use aws_smithy_runtime::client::http::test_util::infallible_client_fn; + + use aws_smithy_runtime::client::http::test_util::wire::WireMockServer; use aws_smithy_runtime_api::client::http::SharedHttpClient; - use aws_smithy_types::body::SdkBody; + use aws_smithy_types::timeout::TimeoutConfig; - use http::{Request, Response}; + use secretsmanager::config::BehaviorVersion; - use serde_json::Value; - use std::time::{Duration, SystemTime, UNIX_EPOCH}; - pub const FAKE_ARN: &str = - "arn:aws:secretsmanager:us-west-2:123456789012:secret:{{name}}-NhBWsc"; - pub const DEFAULT_VERSION: &str = "5767290c-d089-49ed-b97c-17086f8c9d79"; - pub const DEFAULT_LABEL: &str = "AWSCURRENT"; - pub const DEFAULT_SECRET_STRING: &str = "hunter2"; + use std::{num::NonZeroUsize, time::Duration}; + + use crate::SecretsManagerCachingClient; // Template GetSecretValue responses for testing pub const GSV_BODY: &str = r###"{ @@ -933,7 +1352,6 @@ mod tests { ], "CreatedDate": 1569534789.046 }"###; - // Template DescribeSecret responses for testing pub const DESC_BODY: &str = r###"{ "ARN": "{{arn}}", @@ -950,83 +1368,10 @@ mod tests { "CreatedDate": 1569534789.046 }"###; - // Template for access denied testing - const KMS_ACCESS_DENIED_BODY: &str = r###"{ - "__type":"AccessDeniedException", - "Message":"Access to KMS is not allowed" - }"###; - - // Template for testing resource not found with DescribeSecret - const NOT_FOUND_EXCEPTION_BODY: &str = r###"{ - "__type":"ResourceNotFoundException", - "message":"Secrets Manager can't find the specified secret." - }"###; - - const SECRETSMANAGER_ACCESS_DENIED_BODY: &str = r###"{ - "__type:"AccessDeniedException", - "Message": "is not authorized to perform: secretsmanager:DescribeSecret on resource: XXXXXXXX" - }"###; - - const SECRETSMANAGER_INTERNAL_SERVICE_ERROR_BODY: &str = r###"{ - "__type:"InternalServiceError", - "Message": "Internal service error" - }"###; - - // Private helper to look at the request and provide the correct response. - fn format_rsp(req: Request) -> (u16, String) { - let (parts, body) = req.into_parts(); - - let req_map: serde_json::Map = - serde_json::from_slice(body.bytes().unwrap()).unwrap(); - let version = req_map - .get("VersionId") - .map_or(DEFAULT_VERSION, |x| x.as_str().unwrap()); - let label = req_map - .get("VersionStage") - .map_or(DEFAULT_LABEL, |x| x.as_str().unwrap()); - let name = req_map.get("SecretId").unwrap().as_str().unwrap(); // Does not handle full ARN case. - - let secret_string = match name { - secret if secret.starts_with("REFRESHNOW") => SystemTime::now() - .duration_since(UNIX_EPOCH) - .unwrap() - .as_millis() - .to_string(), - _ => DEFAULT_SECRET_STRING.to_string(), - }; - - let (code, template) = match parts.headers["x-amz-target"].to_str().unwrap() { - "secretsmanager.GetSecretValue" if name.starts_with("KMSACCESSDENIED") => { - (400, KMS_ACCESS_DENIED_BODY) - } - "secretsmanager.GetSecretValue" if name.starts_with("NOTFOUND") => { - (400, NOT_FOUND_EXCEPTION_BODY) - } - "secretsmanager.GetSecretValue" => (200, GSV_BODY), - "secretsmanager.DescribeSecret" if name.contains("DESCRIBEACCESSDENIED") => { - (400, SECRETSMANAGER_ACCESS_DENIED_BODY) - } - "secretsmanager.DescribeSecret" if name.contains("DESCRIBESERVICEERROR") => { - (500, SECRETSMANAGER_INTERNAL_SERVICE_ERROR_BODY) - } - "secretsmanager.DescribeSecret" => (200, DESC_BODY), - _ => panic!("Unknown operation"), - }; - - // Fill in the template and return the response. - let rsp = template - .replace("{{arn}}", FAKE_ARN) - .replace("{{name}}", name) - .replace("{{version}}", version) - .replace("{{secret}}", &secret_string) - .replace("{{label}}", label); - (code, rsp) - } - // Test client that stubs off network call and provides a canned response. pub fn def_fake_client( - http_client: Option, - endpoint_url: Option, + http_client: SharedHttpClient, + endpoint_url: String, ) -> secretsmanager::Client { let fake_creds = secretsmanager::config::Credentials::new( "AKIDTESTKEY", @@ -1035,7 +1380,6 @@ mod tests { None, "", ); - let mut config_builder = secretsmanager::Config::builder() .behavior_version(BehaviorVersion::latest()) .credentials_provider(fake_creds) @@ -1045,22 +1389,98 @@ mod tests { .operation_attempt_timeout(Duration::from_millis(100)) .build(), ) - .http_client(match http_client { - Some(custom_client) => custom_client, - None => infallible_client_fn(|_req| { - let (code, rsp) = format_rsp(_req); - Response::builder() - .status(code) - .body(SdkBody::from(rsp)) - .unwrap() - }), - }); - config_builder = match endpoint_url { - Some(endpoint_url) => config_builder.endpoint_url(endpoint_url), - None => config_builder, - }; + .http_client(http_client); + config_builder = config_builder.endpoint_url(endpoint_url); secretsmanager::Client::from_conf(config_builder.build()) } + + fn fake_client( + ttl: Option, + ignore_transient_errors: bool, + wire_server: &WireMockServer, + ) -> SecretsManagerCachingClient { + SecretsManagerCachingClient::new( + def_fake_client(wire_server.http_client(), wire_server.endpoint_url()), + NonZeroUsize::new(1000).unwrap(), + match ttl { + Some(ttl) => ttl, + None => Duration::from_secs(1000), + }, + ignore_transient_errors, + ) + .expect("client should create") + } + + #[tokio::test] + async fn test_is_current_gsv_timeout_error_succeeds() { + use aws_smithy_runtime::client::http::test_util::wire::{ + ReplayedEvent, WireMockServer, + }; + + let mock = WireMockServer::start(vec![ + ReplayedEvent::with_body( + GSV_BODY + .replace("{{version}}", "old_version") + .replace("{{label}}", "AWSCURRENT"), + ), + ReplayedEvent::with_body( + DESC_BODY + .replace("{{version}}", "new_version") + .replace("{{label}}", "AWSCURRENT"), + ), + ReplayedEvent::Timeout, + ]) + .await; + + let client = fake_client(Some(Duration::from_secs(0)), true, &mock); + + let secret_id = "GSVTIMEOUT_test_secret"; + + let res1 = client + .get_secret_value(secret_id, None, None, false) + .await + .unwrap(); + + let res2 = client + .get_secret_value(secret_id, None, None, false) + .await + .unwrap(); + + mock.shutdown(); + + assert_eq!(res1, res2) + } + + #[tokio::test] + async fn test_is_current_describe_timeout_error_succeeds() { + // TODO: Figure out how to do this with mocks + use aws_smithy_runtime::client::http::test_util::wire::{ + ReplayedEvent, WireMockServer, + }; + + let mock = WireMockServer::start(vec![ + ReplayedEvent::with_body(GSV_BODY), + ReplayedEvent::Timeout, + ]) + .await; + let client = fake_client(Some(Duration::from_secs(0)), true, &mock); + let secret_id = "DESCRIBETIMEOUT_test_secret"; + let version_id = Some("test_version"); + + let res1 = client + .get_secret_value(secret_id, version_id, None, false) + .await + .unwrap(); + + let res2 = client + .get_secret_value(secret_id, version_id, None, false) + .await + .unwrap(); + + mock.shutdown(); + + assert_eq!(res1, res2) + } } } From 5488dfbd694d5965fd68829a949b994df4bdd19e Mon Sep 17 00:00:00 2001 From: Simon Marty Date: Mon, 22 Sep 2025 11:32:38 -0700 Subject: [PATCH 2/2] Allowlist 0-clause BSD --- deny.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deny.toml b/deny.toml index c509382..668c4d7 100644 --- a/deny.toml +++ b/deny.toml @@ -2,4 +2,4 @@ # List of explicitly allowed licenses # See https://spdx.org/licenses/ for list of possible licenses # [possible values: any SPDX 3.11 short identifier (+ optional exception)]. -allow = ["MIT", "Apache-2.0", "Unicode-3.0", "ISC", "BSD-3-Clause", "OpenSSL"] +allow = ["MIT", "Apache-2.0", "Unicode-3.0", "ISC", "BSD-3-Clause", "OpenSSL", "0BSD"]