From 3b125169fde035d6ee3da20d869ef611c85e53b0 Mon Sep 17 00:00:00 2001 From: Kyle Strand Date: Thu, 18 Dec 2025 02:25:23 +0000 Subject: [PATCH 1/3] chore: prepare new release(s) --- .gitignore | 1 + Cargo.lock | 4783 ----------------- Cargo.toml | 98 +- qcs-api-client-common/CHANGELOG-py.md | 7 + qcs-api-client-common/CHANGELOG.md | 7 + qcs-api-client-common/Cargo.toml | 76 +- qcs-api-client-common/pyproject.toml | 2 +- .../configuration/__init__.pyi | 64 +- .../qcs_api_client_common/grpc.py | 4 +- .../src/configuration/mod.rs | 68 +- .../src/configuration/pkce.rs | 6 +- qcs-api-client-common/src/configuration/py.rs | 80 +- .../src/configuration/secret_string.rs | 146 + .../src/configuration/secrets.rs | 90 +- .../src/configuration/settings.rs | 112 +- .../src/configuration/tokens.rs | 229 +- qcs-api-client-common/src/py/mod.rs | 29 +- .../src/tracing_configuration.rs | 2 +- .../tests/client_credentials_test.rs | 10 +- .../tests/token_refresh_test.rs | 14 +- .../tests_py/test_configuration.py | 26 +- qcs-api-client-grpc/CHANGELOG.md | 7 + qcs-api-client-grpc/Cargo.toml | 12 +- qcs-api-client-grpc/build.rs | 2 +- .../src/gen/models.controller.rs | 10 +- .../src/gen/models.controller.serde.rs | 26 +- .../src/gen/models.translation.serde.rs | 2 +- .../src/gen/services.controller.rs | 60 +- .../src/gen/services.controller.serde.rs | 26 +- .../src/gen/services.translation.rs | 32 +- .../src/gen/services.translation.serde.rs | 18 +- qcs-api-client-grpc/src/tonic/channel.rs | 17 +- qcs-api-client-grpc/src/tonic/grpc_web.rs | 2 +- qcs-api-client-grpc/src/tonic/mod.rs | 84 +- qcs-api-client-grpc/src/tonic/refresh.rs | 14 +- qcs-api-client-grpc/src/tonic/retry.rs | 6 +- qcs-api-client-grpc/src/tonic/trace/shared.rs | 4 +- .../src/tonic/trace/trace_layer.rs | 6 +- .../src/tonic/trace/trace_layer_otel_ext.rs | 9 +- qcs-api-client-openapi/CHANGELOG.md | 7 + qcs-api-client-openapi/Cargo.toml | 8 +- .../src/apis/account_api.rs | 439 +- .../src/apis/authentication_api.rs | 78 +- .../src/apis/client_applications_api.rs | 59 +- .../src/apis/configuration.rs | 10 +- .../src/apis/default_api.rs | 59 +- .../src/apis/endpoints_api.rs | 116 +- .../src/apis/engagements_api.rs | 21 +- .../src/apis/quantum_processors_api.rs | 97 +- .../src/apis/reservations_api.rs | 135 +- .../src/models/account_type.rs | 9 +- .../src/models/billing_invoice_line.rs | 12 +- .../src/models/billing_invoice_status.rs | 10 +- .../src/models/billing_price.rs | 21 +- .../src/models/billing_price_recurrence.rs | 31 +- .../src/models/billing_price_scheme.rs | 9 +- .../src/models/billing_price_tiers_mode.rs | 9 +- .../src/models/billing_product.rs | 11 +- .../src/models/checksum_description.rs | 12 +- qcs-api-client-openapi/src/models/code.rs | 9 +- qcs-api-client-openapi/src/models/family.rs | 9 +- .../src/models/nomad_job_datacenters.rs | 9 +- qcs-api-client-openapi/src/models/product.rs | 9 +- .../models/quantum_processor_accessor_type.rs | 9 +- .../src/models/validation_error.rs | 12 +- .../src/models/validation_location.rs | 10 +- 66 files changed, 1466 insertions(+), 5945 deletions(-) delete mode 100644 Cargo.lock create mode 100644 qcs-api-client-common/src/configuration/secret_string.rs diff --git a/.gitignore b/.gitignore index 69e8530..258d840 100644 --- a/.gitignore +++ b/.gitignore @@ -17,5 +17,6 @@ bacon.toml **/__pycache__ **/*.pyc **/*.so +**/uv.lock # sphinx build artifacts qcs_api_client_common/docs/build diff --git a/Cargo.lock b/Cargo.lock deleted file mode 100644 index 01c70ee..0000000 --- a/Cargo.lock +++ /dev/null @@ -1,4783 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "aho-corasick" -version = "1.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" -dependencies = [ - "memchr", -] - -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - -[[package]] -name = "anyhow" -version = "1.0.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" - -[[package]] -name = "assert-json-diff" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47e4f2b81832e72834d7518d8487a0396a28cc408186a2e8854c0f98011faf12" -dependencies = [ - "serde", - "serde_json", -] - -[[package]] -name = "async-attributes" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3203e79f4dd9bdda415ed03cf14dae5a2bf775c683a00f94e9cd1faf0f596e5" -dependencies = [ - "quote", - "syn 1.0.109", -] - -[[package]] -name = "async-channel" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" -dependencies = [ - "concurrent-queue", - "event-listener 2.5.3", - "futures-core", -] - -[[package]] -name = "async-channel" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" -dependencies = [ - "concurrent-queue", - "event-listener-strategy", - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "async-executor" -version = "1.13.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497c00e0fd83a72a79a39fcbd8e3e2f055d6f6c7e025f3b3d91f4f8e76527fb8" -dependencies = [ - "async-task", - "concurrent-queue", - "fastrand", - "futures-lite", - "pin-project-lite", - "slab", -] - -[[package]] -name = "async-global-executor" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c" -dependencies = [ - "async-channel 2.5.0", - "async-executor", - "async-io", - "async-lock", - "blocking", - "futures-lite", - "once_cell", -] - -[[package]] -name = "async-io" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" -dependencies = [ - "autocfg", - "cfg-if", - "concurrent-queue", - "futures-io", - "futures-lite", - "parking", - "polling", - "rustix", - "slab", - "windows-sys 0.61.2", -] - -[[package]] -name = "async-lock" -version = "3.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fd03604047cee9b6ce9de9f70c6cd540a0520c813cbd49bae61f33ab80ed1dc" -dependencies = [ - "event-listener 5.4.1", - "event-listener-strategy", - "pin-project-lite", -] - -[[package]] -name = "async-object-pool" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1ac0219111eb7bb7cb76d4cf2cb50c598e7ae549091d3616f9e95442c18486f" -dependencies = [ - "async-lock", - "event-listener 5.4.1", -] - -[[package]] -name = "async-socks5" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8da2537846e16b96d2972ee52a3b355663872a1a687ce6d57a3b6f6b6a181c89" -dependencies = [ - "thiserror 1.0.69", - "tokio", -] - -[[package]] -name = "async-std" -version = "1.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c8e079a4ab67ae52b7403632e4618815d6db36d2a010cfe41b02c1b1578f93b" -dependencies = [ - "async-attributes", - "async-channel 1.9.0", - "async-global-executor", - "async-io", - "async-lock", - "crossbeam-utils", - "futures-channel", - "futures-core", - "futures-io", - "futures-lite", - "gloo-timers", - "kv-log-macro", - "log", - "memchr", - "once_cell", - "pin-project-lite", - "pin-utils", - "slab", - "wasm-bindgen-futures", -] - -[[package]] -name = "async-stream" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" -dependencies = [ - "async-stream-impl", - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "async-stream-impl" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.111", -] - -[[package]] -name = "async-task" -version = "4.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" - -[[package]] -name = "async-tempfile" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8a57b75c36e16f4d015e60e6a177552976a99b6947724403c551bcfa7cb1207" -dependencies = [ - "tokio", - "uuid", -] - -[[package]] -name = "async-trait" -version = "0.1.89" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.111", -] - -[[package]] -name = "atomic" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a89cbf775b137e9b968e67227ef7f775587cde3fd31b0d8599dbd0f598a48340" -dependencies = [ - "bytemuck", -] - -[[package]] -name = "atomic-waker" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" - -[[package]] -name = "autocfg" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" - -[[package]] -name = "aws-lc-rs" -version = "1.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b5ce75405893cd713f9ab8e297d8e438f624dde7d706108285f7e17a25a180f" -dependencies = [ - "aws-lc-sys", - "untrusted 0.7.1", - "zeroize", -] - -[[package]] -name = "aws-lc-sys" -version = "0.34.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "179c3777a8b5e70e90ea426114ffc565b2c1a9f82f6c4a0c5a34aa6ef5e781b6" -dependencies = [ - "cc", - "cmake", - "dunce", - "fs_extra", -] - -[[package]] -name = "axum" -version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f" -dependencies = [ - "async-trait", - "axum-core 0.4.5", - "bytes", - "futures-util", - "http", - "http-body", - "http-body-util", - "itoa", - "matchit 0.7.3", - "memchr", - "mime", - "percent-encoding", - "pin-project-lite", - "rustversion", - "serde", - "sync_wrapper", - "tower 0.5.2", - "tower-layer", - "tower-service", -] - -[[package]] -name = "axum" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b098575ebe77cb6d14fc7f32749631a6e44edbef6b796f89b020e99ba20d425" -dependencies = [ - "axum-core 0.5.5", - "bytes", - "form_urlencoded", - "futures-util", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-util", - "itoa", - "matchit 0.8.4", - "memchr", - "mime", - "percent-encoding", - "pin-project-lite", - "serde_core", - "serde_json", - "serde_path_to_error", - "serde_urlencoded", - "sync_wrapper", - "tokio", - "tower 0.5.2", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "axum-core" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" -dependencies = [ - "async-trait", - "bytes", - "futures-util", - "http", - "http-body", - "http-body-util", - "mime", - "pin-project-lite", - "rustversion", - "sync_wrapper", - "tower-layer", - "tower-service", -] - -[[package]] -name = "axum-core" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59446ce19cd142f8833f856eb31f3eb097812d1479ab224f54d72428ca21ea22" -dependencies = [ - "bytes", - "futures-core", - "http", - "http-body", - "http-body-util", - "mime", - "pin-project-lite", - "sync_wrapper", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "backoff" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b62ddb9cb1ec0a098ad4bbf9344d0713fa193ae1a80af55febcff2627b6a00c1" -dependencies = [ - "futures-core", - "getrandom 0.2.16", - "instant", - "pin-project-lite", - "rand 0.8.5", - "tokio", -] - -[[package]] -name = "base64" -version = "0.21.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" - -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "base64ct" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" - -[[package]] -name = "bitflags" -version = "2.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" - -[[package]] -name = "block-buffer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] - -[[package]] -name = "blocking" -version = "1.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" -dependencies = [ - "async-channel 2.5.0", - "async-task", - "futures-io", - "futures-lite", - "piper", -] - -[[package]] -name = "bumpalo" -version = "3.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" - -[[package]] -name = "bytemuck" -version = "1.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" - -[[package]] -name = "bytes" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" -dependencies = [ - "serde", -] - -[[package]] -name = "cc" -version = "1.2.48" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c481bdbf0ed3b892f6f806287d72acd515b352a4ec27a208489b8c1bc839633a" -dependencies = [ - "find-msvc-tools", - "jobserver", - "libc", - "shlex", -] - -[[package]] -name = "cesu8" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" - -[[package]] -name = "cfg-if" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" - -[[package]] -name = "cfg_aliases" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" - -[[package]] -name = "chrono" -version = "0.4.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" -dependencies = [ - "iana-time-zone", - "js-sys", - "num-traits", - "serde", - "wasm-bindgen", - "windows-link", -] - -[[package]] -name = "cmake" -version = "0.1.54" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7caa3f9de89ddbe2c607f4101924c5abec803763ae9534e4f4d7d8f84aa81f0" -dependencies = [ - "cc", -] - -[[package]] -name = "colored" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fde0e0ec90c9dfb3b4b1a0891a7dcd0e2bffde2f7efed5fe7c9bb00e5bfb915e" -dependencies = [ - "windows-sys 0.59.0", -] - -[[package]] -name = "combine" -version = "4.6.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" -dependencies = [ - "bytes", - "memchr", -] - -[[package]] -name = "concurrent-queue" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "const-oid" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" - -[[package]] -name = "cookie" -version = "0.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747" -dependencies = [ - "percent-encoding", - "time", - "version_check", -] - -[[package]] -name = "cookie_store" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2eac901828f88a5241ee0600950ab981148a18f2f756900ffba1b125ca6a3ef9" -dependencies = [ - "cookie", - "document-features", - "idna", - "log", - "publicsuffix", - "serde", - "serde_derive", - "serde_json", - "time", - "url", -] - -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" - -[[package]] -name = "cpufeatures" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" -dependencies = [ - "libc", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" - -[[package]] -name = "crypto-common" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" -dependencies = [ - "generic-array", - "typenum", -] - -[[package]] -name = "darling" -version = "0.20.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" -dependencies = [ - "darling_core", - "darling_macro", -] - -[[package]] -name = "darling_core" -version = "0.20.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn 2.0.111", -] - -[[package]] -name = "darling_macro" -version = "0.20.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" -dependencies = [ - "darling_core", - "quote", - "syn 2.0.111", -] - -[[package]] -name = "der" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" -dependencies = [ - "const-oid", - "pem-rfc7468", - "zeroize", -] - -[[package]] -name = "deranged" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" -dependencies = [ - "powerfmt", - "serde", -] - -[[package]] -name = "derive_builder" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947" -dependencies = [ - "derive_builder_macro", -] - -[[package]] -name = "derive_builder_core" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.111", -] - -[[package]] -name = "derive_builder_macro" -version = "0.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" -dependencies = [ - "derive_builder_core", - "syn 2.0.111", -] - -[[package]] -name = "digest" -version = "0.10.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer", - "const-oid", - "crypto-common", -] - -[[package]] -name = "displaydoc" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.111", -] - -[[package]] -name = "document-features" -version = "0.2.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" -dependencies = [ - "litrs", -] - -[[package]] -name = "dunce" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" - -[[package]] -name = "either" -version = "1.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" - -[[package]] -name = "encoding_rs" -version = "0.8.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "equivalent" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" - -[[package]] -name = "errno" -version = "0.3.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" -dependencies = [ - "libc", - "windows-sys 0.61.2", -] - -[[package]] -name = "event-listener" -version = "2.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" - -[[package]] -name = "event-listener" -version = "5.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" -dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite", -] - -[[package]] -name = "event-listener-strategy" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" -dependencies = [ - "event-listener 5.4.1", - "pin-project-lite", -] - -[[package]] -name = "fastrand" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" - -[[package]] -name = "figment" -version = "0.10.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cb01cd46b0cf372153850f4c6c272d9cbea2da513e07538405148f95bd789f3" -dependencies = [ - "atomic", - "parking_lot", - "pear", - "serde", - "tempfile", - "toml 0.8.23", - "uncased", - "version_check", -] - -[[package]] -name = "find-msvc-tools" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844" - -[[package]] -name = "fixedbitset" -version = "0.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - -[[package]] -name = "form_urlencoded" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "fs_extra" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" - -[[package]] -name = "futures" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" - -[[package]] -name = "futures-executor" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" - -[[package]] -name = "futures-lite" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" -dependencies = [ - "fastrand", - "futures-core", - "futures-io", - "parking", - "pin-project-lite", -] - -[[package]] -name = "futures-macro" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.111", -] - -[[package]] -name = "futures-sink" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" - -[[package]] -name = "futures-task" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" - -[[package]] -name = "futures-timer" -version = "3.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" - -[[package]] -name = "futures-util" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", -] - -[[package]] -name = "getrandom" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" -dependencies = [ - "cfg-if", - "js-sys", - "libc", - "wasi", - "wasm-bindgen", -] - -[[package]] -name = "getrandom" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" -dependencies = [ - "cfg-if", - "js-sys", - "libc", - "r-efi", - "wasip2", - "wasm-bindgen", -] - -[[package]] -name = "glob" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" - -[[package]] -name = "gloo-timers" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" -dependencies = [ - "futures-channel", - "futures-core", - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "h2" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" -dependencies = [ - "atomic-waker", - "bytes", - "fnv", - "futures-core", - "futures-sink", - "http", - "indexmap 2.12.1", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" - -[[package]] -name = "hashbrown" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" - -[[package]] -name = "headers" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3314d5adb5d94bcdf56771f2e50dbbc80bb4bdf88967526706205ac9eff24eb" -dependencies = [ - "base64 0.22.1", - "bytes", - "headers-core", - "http", - "httpdate", - "mime", - "sha1", -] - -[[package]] -name = "headers-core" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54b4a22553d4242c49fddb9ba998a99962b5cc6f22cb5a3482bec22522403ce4" -dependencies = [ - "http", -] - -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - -[[package]] -name = "hermit-abi" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" - -[[package]] -name = "home" -version = "0.5.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" -dependencies = [ - "windows-sys 0.61.2", -] - -[[package]] -name = "http" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" -dependencies = [ - "bytes", - "itoa", -] - -[[package]] -name = "http-body" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" -dependencies = [ - "bytes", - "http", -] - -[[package]] -name = "http-body-util" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" -dependencies = [ - "bytes", - "futures-core", - "http", - "http-body", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" - -[[package]] -name = "httpdate" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" - -[[package]] -name = "httpmock" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "511f510e9b1888d67f10bab4397f8b019d2a9b249a2c10acbce2d705b1b32e26" -dependencies = [ - "assert-json-diff", - "async-object-pool", - "async-trait", - "base64 0.22.1", - "bytes", - "crossbeam-utils", - "form_urlencoded", - "futures-timer", - "futures-util", - "headers", - "http", - "http-body-util", - "hyper", - "hyper-util", - "path-tree", - "regex", - "serde", - "serde_json", - "serde_regex", - "similar", - "stringmetrics", - "tabwriter", - "thiserror 2.0.17", - "tokio", - "tracing", - "url", -] - -[[package]] -name = "hyper" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" -dependencies = [ - "atomic-waker", - "bytes", - "futures-channel", - "futures-core", - "h2", - "http", - "http-body", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "pin-utils", - "smallvec", - "tokio", - "want", -] - -[[package]] -name = "hyper-proxy2" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9043b7b23fb0bc4a1c7014c27b50a4fc42cc76206f71d34fc0dfe5b28ddc3faf" -dependencies = [ - "bytes", - "futures-util", - "headers", - "http", - "hyper", - "hyper-rustls 0.26.0", - "hyper-util", - "pin-project-lite", - "rustls-native-certs 0.7.3", - "tokio", - "tokio-rustls 0.25.0", - "tower-service", - "webpki", -] - -[[package]] -name = "hyper-rustls" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0bea761b46ae2b24eb4aef630d8d1c398157b6fc29e6350ecf090a0b70c952c" -dependencies = [ - "futures-util", - "http", - "hyper", - "hyper-util", - "log", - "rustls 0.22.4", - "rustls-native-certs 0.7.3", - "rustls-pki-types", - "tokio", - "tokio-rustls 0.25.0", - "tower-service", -] - -[[package]] -name = "hyper-rustls" -version = "0.27.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" -dependencies = [ - "http", - "hyper", - "hyper-util", - "rustls 0.23.35", - "rustls-native-certs 0.8.2", - "rustls-pki-types", - "tokio", - "tokio-rustls 0.26.4", - "tower-service", - "webpki-roots", -] - -[[package]] -name = "hyper-socks2" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51c227614c208f7e7c2e040526912604a1a957fe467c9c2f5b06c5d032337dab" -dependencies = [ - "async-socks5", - "http", - "hyper", - "hyper-util", - "thiserror 1.0.69", - "tokio", - "tower-service", -] - -[[package]] -name = "hyper-timeout" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" -dependencies = [ - "hyper", - "hyper-util", - "pin-project-lite", - "tokio", - "tower-service", -] - -[[package]] -name = "hyper-tls" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" -dependencies = [ - "bytes", - "http-body-util", - "hyper", - "hyper-util", - "native-tls", - "tokio", - "tokio-native-tls", - "tower-service", -] - -[[package]] -name = "hyper-util" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "727805d60e7938b76b826a6ef209eb70eaa1812794f9424d4a4e2d740662df5f" -dependencies = [ - "base64 0.22.1", - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "http", - "http-body", - "hyper", - "ipnet", - "libc", - "percent-encoding", - "pin-project-lite", - "socket2 0.6.1", - "system-configuration", - "tokio", - "tower-service", - "tracing", - "windows-registry", -] - -[[package]] -name = "iana-time-zone" -version = "0.1.64" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "log", - "wasm-bindgen", - "windows-core", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -dependencies = [ - "cc", -] - -[[package]] -name = "icu_collections" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" -dependencies = [ - "displaydoc", - "potential_utf", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_locale_core" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" -dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_normalizer" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" -dependencies = [ - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "zerovec", -] - -[[package]] -name = "icu_normalizer_data" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" - -[[package]] -name = "icu_properties" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e93fcd3157766c0c8da2f8cff6ce651a31f0810eaa1c51ec363ef790bbb5fb99" -dependencies = [ - "icu_collections", - "icu_locale_core", - "icu_properties_data", - "icu_provider", - "zerotrie", - "zerovec", -] - -[[package]] -name = "icu_properties_data" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02845b3647bb045f1100ecd6480ff52f34c35f82d9880e029d329c21d1054899" - -[[package]] -name = "icu_provider" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" -dependencies = [ - "displaydoc", - "icu_locale_core", - "writeable", - "yoke", - "zerofrom", - "zerotrie", - "zerovec", -] - -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - -[[package]] -name = "idna" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" -dependencies = [ - "idna_adapter", - "smallvec", - "utf8_iter", -] - -[[package]] -name = "idna_adapter" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" -dependencies = [ - "icu_normalizer", - "icu_properties", -] - -[[package]] -name = "indexmap" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" -dependencies = [ - "autocfg", - "hashbrown 0.12.3", -] - -[[package]] -name = "indexmap" -version = "2.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3ce74acf2" -dependencies = [ - "equivalent", - "hashbrown 0.16.1", -] - -[[package]] -name = "indoc" -version = "2.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706" -dependencies = [ - "rustversion", -] - -[[package]] -name = "inlinable_string" -version = "0.1.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8fae54786f62fb2918dcfae3d568594e50eb9b5c25bf04371af6fe7516452fb" - -[[package]] -name = "instant" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "inventory" -version = "0.3.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc61209c082fbeb19919bee74b176221b27223e27b65d781eb91af24eb1fb46e" -dependencies = [ - "rustversion", -] - -[[package]] -name = "ipnet" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" - -[[package]] -name = "iri-string" -version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f867b9d1d896b67beb18518eda36fdb77a32ea590de864f1325b294a6d14397" -dependencies = [ - "memchr", - "serde", -] - -[[package]] -name = "itertools" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" - -[[package]] -name = "jni" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" -dependencies = [ - "cesu8", - "cfg-if", - "combine", - "jni-sys", - "log", - "thiserror 1.0.69", - "walkdir", - "windows-sys 0.45.0", -] - -[[package]] -name = "jni-sys" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" - -[[package]] -name = "jobserver" -version = "0.1.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" -dependencies = [ - "getrandom 0.3.4", - "libc", -] - -[[package]] -name = "js-sys" -version = "0.3.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "464a3709c7f55f1f721e5389aa6ea4e3bc6aba669353300af094b29ffbdde1d8" -dependencies = [ - "once_cell", - "wasm-bindgen", -] - -[[package]] -name = "jsonwebtoken" -version = "9.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a87cc7a48537badeae96744432de36f4be2b4a34a05a5ef32e9dd8a1c169dde" -dependencies = [ - "base64 0.22.1", - "js-sys", - "pem", - "ring", - "serde", - "serde_json", - "simple_asn1", -] - -[[package]] -name = "jsonwebtoken" -version = "10.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c76e1c7d7df3e34443b3621b459b066a7b79644f059fc8b2db7070c825fd417e" -dependencies = [ - "aws-lc-rs", - "base64 0.22.1", - "getrandom 0.2.16", - "js-sys", - "pem", - "serde", - "serde_json", - "signature", - "simple_asn1", -] - -[[package]] -name = "kv-log-macro" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f" -dependencies = [ - "log", -] - -[[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" -dependencies = [ - "spin", -] - -[[package]] -name = "libc" -version = "0.2.178" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37c93d8daa9d8a012fd8ab92f088405fb202ea0b6ab73ee2482ae66af4f42091" - -[[package]] -name = "libm" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" - -[[package]] -name = "linux-raw-sys" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" - -[[package]] -name = "litemap" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" - -[[package]] -name = "litrs" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" - -[[package]] -name = "lock_api" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" -dependencies = [ - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" -dependencies = [ - "value-bag", -] - -[[package]] -name = "lru-slab" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" - -[[package]] -name = "malloc_buf" -version = "0.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" -dependencies = [ - "libc", -] - -[[package]] -name = "matchers" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" -dependencies = [ - "regex-automata", -] - -[[package]] -name = "matchit" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" - -[[package]] -name = "matchit" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" - -[[package]] -name = "memchr" -version = "2.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" - -[[package]] -name = "memoffset" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" -dependencies = [ - "autocfg", -] - -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "mime_guess" -version = "2.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" -dependencies = [ - "mime", - "unicase", -] - -[[package]] -name = "mio" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" -dependencies = [ - "libc", - "wasi", - "windows-sys 0.61.2", -] - -[[package]] -name = "multimap" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084" - -[[package]] -name = "native-tls" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" -dependencies = [ - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework 2.11.1", - "security-framework-sys", - "tempfile", -] - -[[package]] -name = "ndk-context" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" - -[[package]] -name = "nu-ansi-term" -version = "0.50.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" -dependencies = [ - "windows-sys 0.61.2", -] - -[[package]] -name = "num-bigint" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" -dependencies = [ - "num-integer", - "num-traits", -] - -[[package]] -name = "num-bigint-dig" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e661dda6640fad38e827a6d4a310ff4763082116fe217f279885c97f511bb0b7" -dependencies = [ - "lazy_static", - "libm", - "num-integer", - "num-iter", - "num-traits", - "rand 0.8.5", - "smallvec", - "zeroize", -] - -[[package]] -name = "num-complex" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-conv" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" - -[[package]] -name = "num-integer" -version = "0.1.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-iter" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", - "libm", -] - -[[package]] -name = "oauth2" -version = "5.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51e219e79014df21a225b1860a479e2dcd7cbd9130f4defd4bd0e191ea31d67d" -dependencies = [ - "base64 0.22.1", - "chrono", - "getrandom 0.2.16", - "http", - "rand 0.8.5", - "reqwest", - "serde", - "serde_json", - "serde_path_to_error", - "sha2", - "thiserror 1.0.69", - "url", -] - -[[package]] -name = "oauth2-test-server" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bb78cf155f91eba1d99533e49aafc31f5e7e42b9964d2c0c8470d6641accb54" -dependencies = [ - "axum 0.8.7", - "base64 0.21.7", - "chrono", - "colored", - "futures", - "http", - "jsonwebtoken 10.2.0", - "once_cell", - "rand 0.8.5", - "reqwest", - "rsa", - "serde", - "serde_json", - "sha2", - "tokio", - "tower-http 0.5.2", - "tracing", - "tracing-subscriber", - "url", - "uuid", -] - -[[package]] -name = "objc" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" -dependencies = [ - "malloc_buf", -] - -[[package]] -name = "once_cell" -version = "1.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" - -[[package]] -name = "openssl" -version = "0.10.75" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08838db121398ad17ab8531ce9de97b244589089e290a384c900cb9ff7434328" -dependencies = [ - "bitflags", - "cfg-if", - "foreign-types", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", -] - -[[package]] -name = "openssl-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.111", -] - -[[package]] -name = "openssl-probe" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" - -[[package]] -name = "openssl-sys" -version = "0.9.111" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82cab2d520aa75e3c58898289429321eb788c3106963d0dc886ec7a5f4adc321" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "opentelemetry" -version = "0.27.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab70038c28ed37b97d8ed414b6429d343a8bbf44c9f79ec854f3a643029ba6d7" -dependencies = [ - "futures-core", - "futures-sink", - "js-sys", - "pin-project-lite", - "thiserror 1.0.69", - "tracing", -] - -[[package]] -name = "opentelemetry-http" -version = "0.27.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10a8a7f5f6ba7c1b286c2fbca0454eaba116f63bbe69ed250b642d36fbb04d80" -dependencies = [ - "async-trait", - "bytes", - "http", - "opentelemetry", -] - -[[package]] -name = "opentelemetry_sdk" -version = "0.27.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "231e9d6ceef9b0b2546ddf52335785ce41252bc7474ee8ba05bfad277be13ab8" -dependencies = [ - "async-trait", - "futures-channel", - "futures-executor", - "futures-util", - "glob", - "opentelemetry", - "percent-encoding", - "rand 0.8.5", - "serde_json", - "thiserror 1.0.69", - "tracing", -] - -[[package]] -name = "parking" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" - -[[package]] -name = "parking_lot" -version = "0.12.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-link", -] - -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - -[[package]] -name = "path-tree" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2a97453bc21a968f722df730bfe11bd08745cb50d1300b0df2bda131dece136" -dependencies = [ - "smallvec", -] - -[[package]] -name = "pbjson" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7e6349fa080353f4a597daffd05cb81572a9c031a6d4fff7e504947496fcc68" -dependencies = [ - "base64 0.21.7", - "serde", -] - -[[package]] -name = "pbjson-build" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eea3058763d6e656105d1403cb04e0a41b7bbac6362d413e7c33be0c32279c9" -dependencies = [ - "heck 0.5.0", - "itertools 0.13.0", - "prost", - "prost-types", -] - -[[package]] -name = "pbjson-types" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e54e5e7bfb1652f95bc361d76f3c780d8e526b134b85417e774166ee941f0887" -dependencies = [ - "bytes", - "chrono", - "pbjson", - "pbjson-build", - "prost", - "prost-build", - "serde", -] - -[[package]] -name = "pear" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdeeaa00ce488657faba8ebf44ab9361f9365a97bd39ffb8a60663f57ff4b467" -dependencies = [ - "inlinable_string", - "pear_codegen", - "yansi", -] - -[[package]] -name = "pear_codegen" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bab5b985dc082b345f812b7df84e1bef27e7207b39e448439ba8bd69c93f147" -dependencies = [ - "proc-macro2", - "proc-macro2-diagnostics", - "quote", - "syn 2.0.111", -] - -[[package]] -name = "pem" -version = "3.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d30c53c26bc5b31a98cd02d20f25a7c8567146caf63ed593a9d87b2775291be" -dependencies = [ - "base64 0.22.1", - "serde_core", -] - -[[package]] -name = "pem-rfc7468" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" -dependencies = [ - "base64ct", -] - -[[package]] -name = "percent-encoding" -version = "2.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" - -[[package]] -name = "petgraph" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3672b37090dbd86368a4145bc067582552b29c27377cad4e0a306c97f9bd7772" -dependencies = [ - "fixedbitset", - "indexmap 2.12.1", -] - -[[package]] -name = "pin-project" -version = "1.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.111", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "piper" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" -dependencies = [ - "atomic-waker", - "fastrand", - "futures-io", -] - -[[package]] -name = "pkcs1" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" -dependencies = [ - "der", - "pkcs8", - "spki", -] - -[[package]] -name = "pkcs8" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" -dependencies = [ - "der", - "spki", -] - -[[package]] -name = "pkg-config" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" - -[[package]] -name = "polling" -version = "3.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" -dependencies = [ - "cfg-if", - "concurrent-queue", - "hermit-abi", - "pin-project-lite", - "rustix", - "windows-sys 0.61.2", -] - -[[package]] -name = "portable-atomic" -version = "1.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" - -[[package]] -name = "potential_utf" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" -dependencies = [ - "zerovec", -] - -[[package]] -name = "powerfmt" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" - -[[package]] -name = "ppv-lite86" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" -dependencies = [ - "zerocopy", -] - -[[package]] -name = "prettyplease" -version = "0.2.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" -dependencies = [ - "proc-macro2", - "syn 2.0.111", -] - -[[package]] -name = "proc-macro-crate" -version = "3.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" -dependencies = [ - "toml_edit 0.23.7", -] - -[[package]] -name = "proc-macro2" -version = "1.0.103" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "proc-macro2-diagnostics" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.111", - "version_check", - "yansi", -] - -[[package]] -name = "prost" -version = "0.13.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2796faa41db3ec313a31f7624d9286acf277b52de526150b7e69f3debf891ee5" -dependencies = [ - "bytes", - "prost-derive", -] - -[[package]] -name = "prost-build" -version = "0.13.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be769465445e8c1474e9c5dac2018218498557af32d9ed057325ec9a41ae81bf" -dependencies = [ - "heck 0.5.0", - "itertools 0.14.0", - "log", - "multimap", - "once_cell", - "petgraph", - "prettyplease", - "prost", - "prost-types", - "regex", - "syn 2.0.111", - "tempfile", -] - -[[package]] -name = "prost-derive" -version = "0.13.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d" -dependencies = [ - "anyhow", - "itertools 0.14.0", - "proc-macro2", - "quote", - "syn 2.0.111", -] - -[[package]] -name = "prost-types" -version = "0.13.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52c2c1bf36ddb1a1c396b3601a3cec27c2462e45f07c386894ec3ccf5332bd16" -dependencies = [ - "prost", -] - -[[package]] -name = "psl-types" -version = "2.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33cb294fe86a74cbcf50d4445b37da762029549ebeea341421c7c70370f86cac" - -[[package]] -name = "publicsuffix" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f42ea446cab60335f76979ec15e12619a2165b5ae2c12166bef27d283a9fadf" -dependencies = [ - "idna", - "psl-types", -] - -[[package]] -name = "pyo3" -version = "0.20.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53bdbb96d49157e65d45cc287af5f32ffadd5f4761438b527b055fb0d4bb8233" -dependencies = [ - "cfg-if", - "indoc", - "inventory", - "libc", - "memoffset", - "num-complex", - "parking_lot", - "portable-atomic", - "pyo3-build-config 0.20.3", - "pyo3-ffi", - "pyo3-macros", - "unindent", -] - -[[package]] -name = "pyo3-asyncio" -version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea6b68e93db3622f3bb3bf363246cf948ed5375afe7abff98ccbdd50b184995" -dependencies = [ - "futures", - "once_cell", - "pin-project-lite", - "pyo3", - "tokio", -] - -[[package]] -name = "pyo3-build-config" -version = "0.20.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "deaa5745de3f5231ce10517a1f5dd97d53e5a2fd77aa6b5842292085831d48d7" -dependencies = [ - "once_cell", - "target-lexicon", -] - -[[package]] -name = "pyo3-build-config" -version = "0.22.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b14b5775b5ff446dd1056212d778012cbe8a0fbffd368029fd9e25b514479c38" -dependencies = [ - "once_cell", - "target-lexicon", -] - -[[package]] -name = "pyo3-ffi" -version = "0.20.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b42531d03e08d4ef1f6e85a2ed422eb678b8cd62b762e53891c05faf0d4afa" -dependencies = [ - "libc", - "pyo3-build-config 0.20.3", -] - -[[package]] -name = "pyo3-macros" -version = "0.20.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7305c720fa01b8055ec95e484a6eca7a83c841267f0dd5280f0c8b8551d2c158" -dependencies = [ - "proc-macro2", - "pyo3-macros-backend", - "quote", - "syn 2.0.111", -] - -[[package]] -name = "pyo3-macros-backend" -version = "0.20.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c7e9b68bb9c3149c5b0cade5d07f953d6d125eb4337723c4ccdb665f1f96185" -dependencies = [ - "heck 0.4.1", - "proc-macro2", - "pyo3-build-config 0.20.3", - "quote", - "syn 2.0.111", -] - -[[package]] -name = "qcs-api-client-common" -version = "0.12.12" -dependencies = [ - "async-tempfile", - "async-trait", - "backoff", - "derive_builder", - "figment", - "futures", - "home", - "http", - "http-body-util", - "httpmock", - "hyper", - "hyper-util", - "jsonwebtoken 9.3.1", - "oauth2", - "oauth2-test-server", - "paste", - "pyo3", - "pyo3-asyncio", - "pyo3-build-config 0.22.6", - "reqwest", - "rigetti-pyo3", - "rstest", - "serde", - "serde_json", - "serial_test", - "shellexpand", - "thiserror 2.0.17", - "time", - "tokio", - "tokio-util", - "toml 0.9.8", - "toml_edit 0.23.7", - "tracing", - "url", - "urlpattern", - "webbrowser", -] - -[[package]] -name = "qcs-api-client-grpc" -version = "0.12.12" -dependencies = [ - "async-std", - "backoff", - "futures-util", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-proxy2", - "hyper-socks2", - "hyper-util", - "jsonwebtoken 9.3.1", - "once_cell", - "opentelemetry", - "opentelemetry-http", - "opentelemetry_sdk", - "pbjson", - "pbjson-build", - "pbjson-types", - "prost", - "prost-build", - "qcs-api-client-common", - "rstest", - "serde", - "serde_json", - "tempfile", - "thiserror 2.0.17", - "tokio", - "tokio-stream", - "tonic", - "tonic-build", - "tonic-health", - "tonic-web", - "tower 0.4.13", - "tower-http 0.5.2", - "tracing", - "tracing-opentelemetry", - "tracing-subscriber", - "url", - "urlpattern", - "uuid", -] - -[[package]] -name = "qcs-api-client-openapi" -version = "0.13.13" -dependencies = [ - "anyhow", - "http", - "qcs-api-client-common", - "reqwest", - "reqwest-middleware 0.3.3", - "reqwest-tracing", - "rstest", - "serde", - "serde_json", - "tokio", - "tracing", - "tracing-opentelemetry", - "url", - "urlpattern", -] - -[[package]] -name = "quinn" -version = "0.11.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" -dependencies = [ - "bytes", - "cfg_aliases", - "pin-project-lite", - "quinn-proto", - "quinn-udp", - "rustc-hash", - "rustls 0.23.35", - "socket2 0.6.1", - "thiserror 2.0.17", - "tokio", - "tracing", - "web-time", -] - -[[package]] -name = "quinn-proto" -version = "0.11.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" -dependencies = [ - "bytes", - "getrandom 0.3.4", - "lru-slab", - "rand 0.9.2", - "ring", - "rustc-hash", - "rustls 0.23.35", - "rustls-pki-types", - "slab", - "thiserror 2.0.17", - "tinyvec", - "tracing", - "web-time", -] - -[[package]] -name = "quinn-udp" -version = "0.5.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" -dependencies = [ - "cfg_aliases", - "libc", - "once_cell", - "socket2 0.6.1", - "tracing", - "windows-sys 0.60.2", -] - -[[package]] -name = "quote" -version = "1.0.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "r-efi" -version = "5.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.4", -] - -[[package]] -name = "rand" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" -dependencies = [ - "rand_chacha 0.9.0", - "rand_core 0.9.3", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_chacha" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" -dependencies = [ - "ppv-lite86", - "rand_core 0.9.3", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom 0.2.16", -] - -[[package]] -name = "rand_core" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" -dependencies = [ - "getrandom 0.3.4", -] - -[[package]] -name = "raw-window-handle" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" - -[[package]] -name = "redox_syscall" -version = "0.5.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" -dependencies = [ - "bitflags", -] - -[[package]] -name = "regex" -version = "1.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.8.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" - -[[package]] -name = "relative-path" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba39f3699c378cd8970968dcbff9c43159ea4cfbd88d43c00b22f2ef10a435d2" - -[[package]] -name = "reqwest" -version = "0.12.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d0946410b9f7b082a427e4ef5c8ff541a88b357bc6c637c40db3a68ac70a36f" -dependencies = [ - "base64 0.22.1", - "bytes", - "cookie", - "cookie_store", - "encoding_rs", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-rustls 0.27.7", - "hyper-tls", - "hyper-util", - "js-sys", - "log", - "mime", - "mime_guess", - "native-tls", - "percent-encoding", - "pin-project-lite", - "quinn", - "rustls 0.23.35", - "rustls-native-certs 0.8.2", - "rustls-pki-types", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper", - "tokio", - "tokio-native-tls", - "tokio-rustls 0.26.4", - "tokio-util", - "tower 0.5.2", - "tower-http 0.6.7", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-streams", - "web-sys", - "webpki-roots", -] - -[[package]] -name = "reqwest-middleware" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "562ceb5a604d3f7c885a792d42c199fd8af239d0a51b2fa6a78aafa092452b04" -dependencies = [ - "anyhow", - "async-trait", - "http", - "reqwest", - "serde", - "thiserror 1.0.69", - "tower-service", -] - -[[package]] -name = "reqwest-middleware" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57f17d28a6e6acfe1733fe24bcd30774d13bffa4b8a22535b4c8c98423088d4e" -dependencies = [ - "anyhow", - "async-trait", - "http", - "reqwest", - "serde", - "thiserror 1.0.69", - "tower-service", -] - -[[package]] -name = "reqwest-tracing" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d70ea85f131b2ee9874f0b160ac5976f8af75f3c9badfe0d955880257d10bd83" -dependencies = [ - "anyhow", - "async-trait", - "getrandom 0.2.16", - "http", - "matchit 0.8.4", - "opentelemetry", - "reqwest", - "reqwest-middleware 0.4.2", - "tracing", - "tracing-opentelemetry", -] - -[[package]] -name = "rigetti-pyo3" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c59068763670399bb3e895a17cc631d9214c3172b64fc74d3ab63dac7371c340" -dependencies = [ - "num-complex", - "num-traits", - "paste", - "pyo3", - "time", -] - -[[package]] -name = "ring" -version = "0.17.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" -dependencies = [ - "cc", - "cfg-if", - "getrandom 0.2.16", - "libc", - "untrusted 0.9.0", - "windows-sys 0.52.0", -] - -[[package]] -name = "rsa" -version = "0.9.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40a0376c50d0358279d9d643e4bf7b7be212f1f4ff1da9070a7b54d22ef75c88" -dependencies = [ - "const-oid", - "digest", - "num-bigint-dig", - "num-integer", - "num-traits", - "pkcs1", - "pkcs8", - "rand_core 0.6.4", - "signature", - "spki", - "subtle", - "zeroize", -] - -[[package]] -name = "rstest" -version = "0.26.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5a3193c063baaa2a95a33f03035c8a72b83d97a54916055ba22d35ed3839d49" -dependencies = [ - "futures-timer", - "futures-util", - "rstest_macros", -] - -[[package]] -name = "rstest_macros" -version = "0.26.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c845311f0ff7951c5506121a9ad75aec44d083c31583b2ea5a30bcb0b0abba0" -dependencies = [ - "cfg-if", - "glob", - "proc-macro-crate", - "proc-macro2", - "quote", - "regex", - "relative-path", - "rustc_version", - "syn 2.0.111", - "unicode-ident", -] - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" -dependencies = [ - "semver", -] - -[[package]] -name = "rustix" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" -dependencies = [ - "bitflags", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.61.2", -] - -[[package]] -name = "rustls" -version = "0.22.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf4ef73721ac7bcd79b2b315da7779d8fc09718c6b3d2d1b2d94850eb8c18432" -dependencies = [ - "log", - "ring", - "rustls-pki-types", - "rustls-webpki 0.102.8", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls" -version = "0.23.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "533f54bc6a7d4f647e46ad909549eda97bf5afc1585190ef692b4286b198bd8f" -dependencies = [ - "log", - "once_cell", - "ring", - "rustls-pki-types", - "rustls-webpki 0.103.8", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls-native-certs" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5bfb394eeed242e909609f56089eecfe5fda225042e8b171791b9c95f5931e5" -dependencies = [ - "openssl-probe", - "rustls-pemfile", - "rustls-pki-types", - "schannel", - "security-framework 2.11.1", -] - -[[package]] -name = "rustls-native-certs" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9980d917ebb0c0536119ba501e90834767bffc3d60641457fd84a1f3fd337923" -dependencies = [ - "openssl-probe", - "rustls-pki-types", - "schannel", - "security-framework 3.5.1", -] - -[[package]] -name = "rustls-pemfile" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "rustls-pki-types" -version = "1.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "708c0f9d5f54ba0272468c1d306a52c495b31fa155e91bc25371e6df7996908c" -dependencies = [ - "web-time", - "zeroize", -] - -[[package]] -name = "rustls-webpki" -version = "0.102.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" -dependencies = [ - "ring", - "rustls-pki-types", - "untrusted 0.9.0", -] - -[[package]] -name = "rustls-webpki" -version = "0.103.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ffdfa2f5286e2247234e03f680868ac2815974dc39e00ea15adc445d0aafe52" -dependencies = [ - "ring", - "rustls-pki-types", - "untrusted 0.9.0", -] - -[[package]] -name = "rustversion" -version = "1.0.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" - -[[package]] -name = "ryu" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" - -[[package]] -name = "same-file" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "scc" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46e6f046b7fef48e2660c57ed794263155d713de679057f2d0c169bfc6e756cc" -dependencies = [ - "sdd", -] - -[[package]] -name = "schannel" -version = "0.1.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" -dependencies = [ - "windows-sys 0.61.2", -] - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "sdd" -version = "3.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "490dcfcbfef26be6800d11870ff2df8774fa6e86d047e3e8c8a76b25655e41ca" - -[[package]] -name = "security-framework" -version = "2.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" -dependencies = [ - "bitflags", - "core-foundation 0.9.4", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework" -version = "3.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef" -dependencies = [ - "bitflags", - "core-foundation 0.10.1", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "semver" -version = "1.0.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" - -[[package]] -name = "serde" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" -dependencies = [ - "serde_core", - "serde_derive", -] - -[[package]] -name = "serde_core" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.111", -] - -[[package]] -name = "serde_json" -version = "1.0.145" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" -dependencies = [ - "itoa", - "memchr", - "ryu", - "serde", - "serde_core", -] - -[[package]] -name = "serde_path_to_error" -version = "0.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" -dependencies = [ - "itoa", - "serde", - "serde_core", -] - -[[package]] -name = "serde_regex" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8136f1a4ea815d7eac4101cfd0b16dc0cb5e1fe1b8609dfd728058656b7badf" -dependencies = [ - "regex", - "serde", -] - -[[package]] -name = "serde_spanned" -version = "0.6.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_spanned" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e24345aa0fe688594e73770a5f6d1b216508b4f93484c0026d521acd30134392" -dependencies = [ - "serde_core", -] - -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serial_test" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b258109f244e1d6891bf1053a55d63a5cd4f8f4c30cf9a1280989f80e7a1fa9" -dependencies = [ - "futures", - "log", - "once_cell", - "parking_lot", - "scc", - "serial_test_derive", -] - -[[package]] -name = "serial_test_derive" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d69265a08751de7844521fd15003ae0a888e035773ba05695c5c759a6f89eef" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.111", -] - -[[package]] -name = "sha1" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "sha2" -version = "0.10.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest", -] - -[[package]] -name = "sharded-slab" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" -dependencies = [ - "lazy_static", -] - -[[package]] -name = "shellexpand" -version = "3.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b1fdf65dd6331831494dd616b30351c38e96e45921a27745cf98490458b90bb" - -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - -[[package]] -name = "signal-hook-registry" -version = "1.4.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7664a098b8e616bdfcc2dc0e9ac44eb231eedf41db4e9fe95d8d32ec728dedad" -dependencies = [ - "libc", -] - -[[package]] -name = "signature" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" -dependencies = [ - "digest", - "rand_core 0.6.4", -] - -[[package]] -name = "similar" -version = "2.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbbb5d9659141646ae647b42fe094daf6c6192d1620870b449d9557f748b2daa" - -[[package]] -name = "simple_asn1" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "297f631f50729c8c99b84667867963997ec0b50f32b2a7dbcab828ef0541e8bb" -dependencies = [ - "num-bigint", - "num-traits", - "thiserror 2.0.17", - "time", -] - -[[package]] -name = "slab" -version = "0.4.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" - -[[package]] -name = "smallvec" -version = "1.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" - -[[package]] -name = "socket2" -version = "0.5.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e22376abed350d73dd1cd119b57ffccad95b4e585a7cda43e286245ce23c0678" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "socket2" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" -dependencies = [ - "libc", - "windows-sys 0.60.2", -] - -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" - -[[package]] -name = "spki" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" -dependencies = [ - "base64ct", - "der", -] - -[[package]] -name = "stable_deref_trait" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" - -[[package]] -name = "stringmetrics" -version = "2.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b3c8667cd96245cbb600b8dec5680a7319edd719c5aa2b5d23c6bff94f39765" - -[[package]] -name = "strsim" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" - -[[package]] -name = "subtle" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -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.111" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "sync_wrapper" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" -dependencies = [ - "futures-core", -] - -[[package]] -name = "synstructure" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.111", -] - -[[package]] -name = "system-configuration" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" -dependencies = [ - "bitflags", - "core-foundation 0.9.4", - "system-configuration-sys", -] - -[[package]] -name = "system-configuration-sys" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "tabwriter" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fce91f2f0ec87dff7e6bcbbeb267439aa1188703003c6055193c821487400432" -dependencies = [ - "unicode-width", -] - -[[package]] -name = "target-lexicon" -version = "0.12.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" - -[[package]] -name = "tempfile" -version = "3.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" -dependencies = [ - "fastrand", - "getrandom 0.3.4", - "once_cell", - "rustix", - "windows-sys 0.61.2", -] - -[[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.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" -dependencies = [ - "thiserror-impl 2.0.17", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.111", -] - -[[package]] -name = "thiserror-impl" -version = "2.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.111", -] - -[[package]] -name = "thread_local" -version = "1.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "time" -version = "0.3.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" -dependencies = [ - "deranged", - "itoa", - "num-conv", - "powerfmt", - "serde", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" - -[[package]] -name = "time-macros" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" -dependencies = [ - "num-conv", - "time-core", -] - -[[package]] -name = "tinystr" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" -dependencies = [ - "displaydoc", - "zerovec", -] - -[[package]] -name = "tinyvec" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - -[[package]] -name = "tokio" -version = "1.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" -dependencies = [ - "bytes", - "libc", - "mio", - "parking_lot", - "pin-project-lite", - "signal-hook-registry", - "socket2 0.6.1", - "tokio-macros", - "windows-sys 0.61.2", -] - -[[package]] -name = "tokio-macros" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.111", -] - -[[package]] -name = "tokio-native-tls" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" -dependencies = [ - "native-tls", - "tokio", -] - -[[package]] -name = "tokio-rustls" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f" -dependencies = [ - "rustls 0.22.4", - "rustls-pki-types", - "tokio", -] - -[[package]] -name = "tokio-rustls" -version = "0.26.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" -dependencies = [ - "rustls 0.23.35", - "tokio", -] - -[[package]] -name = "tokio-stream" -version = "0.1.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "tokio-util" -version = "0.7.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2efa149fe76073d6e8fd97ef4f4eca7b67f599660115591483572e406e165594" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "toml" -version = "0.8.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" -dependencies = [ - "serde", - "serde_spanned 0.6.9", - "toml_datetime 0.6.11", - "toml_edit 0.22.27", -] - -[[package]] -name = "toml" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0dc8b1fb61449e27716ec0e1bdf0f6b8f3e8f6b05391e8497b8b6d7804ea6d8" -dependencies = [ - "indexmap 2.12.1", - "serde_core", - "serde_spanned 1.0.3", - "toml_datetime 0.7.3", - "toml_parser", - "toml_writer", - "winnow", -] - -[[package]] -name = "toml_datetime" -version = "0.6.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" -dependencies = [ - "serde", -] - -[[package]] -name = "toml_datetime" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" -dependencies = [ - "serde_core", -] - -[[package]] -name = "toml_edit" -version = "0.22.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" -dependencies = [ - "indexmap 2.12.1", - "serde", - "serde_spanned 0.6.9", - "toml_datetime 0.6.11", - "toml_write", - "winnow", -] - -[[package]] -name = "toml_edit" -version = "0.23.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6485ef6d0d9b5d0ec17244ff7eb05310113c3f316f2d14200d4de56b3cb98f8d" -dependencies = [ - "indexmap 2.12.1", - "toml_datetime 0.7.3", - "toml_parser", - "toml_writer", - "winnow", -] - -[[package]] -name = "toml_parser" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" -dependencies = [ - "winnow", -] - -[[package]] -name = "toml_write" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" - -[[package]] -name = "toml_writer" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df8b2b54733674ad286d16267dcfc7a71ed5c776e4ac7aa3c3e2561f7c637bf2" - -[[package]] -name = "tonic" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877c5b330756d856ffcc4553ab34a5684481ade925ecc54bcd1bf02b1d0d4d52" -dependencies = [ - "async-stream", - "async-trait", - "axum 0.7.9", - "base64 0.22.1", - "bytes", - "h2", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-timeout", - "hyper-util", - "percent-encoding", - "pin-project", - "prost", - "rustls-native-certs 0.8.2", - "rustls-pemfile", - "socket2 0.5.10", - "tokio", - "tokio-rustls 0.26.4", - "tokio-stream", - "tower 0.4.13", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tonic-build" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9557ce109ea773b399c9b9e5dca39294110b74f1f342cb347a80d1fce8c26a11" -dependencies = [ - "prettyplease", - "proc-macro2", - "prost-build", - "prost-types", - "quote", - "syn 2.0.111", -] - -[[package]] -name = "tonic-health" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1eaf34ddb812120f5c601162d5429933c9b527d901ab0e7f930d3147e33a09b2" -dependencies = [ - "async-stream", - "prost", - "tokio", - "tokio-stream", - "tonic", -] - -[[package]] -name = "tonic-web" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5299dd20801ad736dccb4a5ea0da7376e59cd98f213bf1c3d478cf53f4834b58" -dependencies = [ - "base64 0.22.1", - "bytes", - "http", - "http-body", - "http-body-util", - "pin-project", - "tokio-stream", - "tonic", - "tower-http 0.5.2", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tower" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" -dependencies = [ - "futures-core", - "futures-util", - "indexmap 1.9.3", - "pin-project", - "pin-project-lite", - "rand 0.8.5", - "slab", - "tokio", - "tokio-util", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tower" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" -dependencies = [ - "futures-core", - "futures-util", - "pin-project-lite", - "sync_wrapper", - "tokio", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tower-http" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5" -dependencies = [ - "bitflags", - "bytes", - "http", - "http-body", - "http-body-util", - "pin-project-lite", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tower-http" -version = "0.6.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf146f99d442e8e68e585f5d798ccd3cad9a7835b917e09728880a862706456" -dependencies = [ - "bitflags", - "bytes", - "futures-util", - "http", - "http-body", - "iri-string", - "pin-project-lite", - "tower 0.5.2", - "tower-layer", - "tower-service", -] - -[[package]] -name = "tower-layer" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" - -[[package]] -name = "tower-service" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" - -[[package]] -name = "tracing" -version = "0.1.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d15d90a0b5c19378952d479dc858407149d7bb45a14de0142f6c534b16fc647" -dependencies = [ - "log", - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.111", -] - -[[package]] -name = "tracing-core" -version = "0.1.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a04e24fab5c89c6a36eb8558c9656f30d81de51dfa4d3b45f26b21d61fa0a6c" -dependencies = [ - "once_cell", - "valuable", -] - -[[package]] -name = "tracing-log" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" -dependencies = [ - "log", - "once_cell", - "tracing-core", -] - -[[package]] -name = "tracing-opentelemetry" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97a971f6058498b5c0f1affa23e7ea202057a7301dbff68e968b2d578bcbd053" -dependencies = [ - "js-sys", - "once_cell", - "opentelemetry", - "opentelemetry_sdk", - "smallvec", - "tracing", - "tracing-core", - "tracing-log", - "tracing-subscriber", - "web-time", -] - -[[package]] -name = "tracing-subscriber" -version = "0.3.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f30143827ddab0d256fd843b7a66d164e9f271cfa0dde49142c5ca0ca291f1e" -dependencies = [ - "matchers", - "nu-ansi-term", - "once_cell", - "regex-automata", - "sharded-slab", - "smallvec", - "thread_local", - "tracing", - "tracing-core", - "tracing-log", -] - -[[package]] -name = "try-lock" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - -[[package]] -name = "typenum" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" - -[[package]] -name = "uncased" -version = "0.9.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1b88fcfe09e89d3866a5c11019378088af2d24c3fbd4f0543f96b479ec90697" -dependencies = [ - "version_check", -] - -[[package]] -name = "unicase" -version = "2.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" - -[[package]] -name = "unicode-ident" -version = "1.0.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" - -[[package]] -name = "unicode-width" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" - -[[package]] -name = "unindent" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7264e107f553ccae879d21fbea1d6724ac785e8c3bfc762137959b5802826ef3" - -[[package]] -name = "untrusted" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" - -[[package]] -name = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - -[[package]] -name = "url" -version = "2.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", - "serde", -] - -[[package]] -name = "urlpattern" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "957a88ad1abd5d13336275adb17d4f9b6a2404f3baed2e075e0b026dc0b2b58d" -dependencies = [ - "icu_properties", - "regex", - "serde", - "url", -] - -[[package]] -name = "utf8_iter" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" - -[[package]] -name = "uuid" -version = "1.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2e054861b4bd027cd373e18e8d8d8e6548085000e41290d95ce0c373a654b4a" -dependencies = [ - "getrandom 0.3.4", - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "valuable" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" - -[[package]] -name = "value-bag" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ba6f5989077681266825251a52748b8c1d8a4ad098cc37e440103d0ea717fc0" - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - -[[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - -[[package]] -name = "walkdir" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" -dependencies = [ - "same-file", - "winapi-util", -] - -[[package]] -name = "want" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] - -[[package]] -name = "wasi" -version = "0.11.1+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" - -[[package]] -name = "wasip2" -version = "1.0.1+wasi-0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" -dependencies = [ - "wit-bindgen", -] - -[[package]] -name = "wasm-bindgen" -version = "0.2.106" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d759f433fa64a2d763d1340820e46e111a7a5ab75f993d1852d70b03dbb80fd" -dependencies = [ - "cfg-if", - "once_cell", - "rustversion", - "wasm-bindgen-macro", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.56" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836d9622d604feee9e5de25ac10e3ea5f2d65b41eac0d9ce72eb5deae707ce7c" -dependencies = [ - "cfg-if", - "js-sys", - "once_cell", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.106" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48cb0d2638f8baedbc542ed444afc0644a29166f1595371af4fecf8ce1e7eeb3" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.106" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cefb59d5cd5f92d9dcf80e4683949f15ca4b511f4ac0a6e14d4e1ac60c6ecd40" -dependencies = [ - "bumpalo", - "proc-macro2", - "quote", - "syn 2.0.111", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.106" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbc538057e648b67f72a982e708d485b2efa771e1ac05fec311f9f63e5800db4" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "wasm-streams" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" -dependencies = [ - "futures-util", - "js-sys", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "web-sys" -version = "0.3.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b32828d774c412041098d182a8b38b16ea816958e07cf40eec2bc080ae137ac" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "web-time" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "webbrowser" -version = "0.8.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db67ae75a9405634f5882791678772c94ff5f16a66535aae186e26aa0841fc8b" -dependencies = [ - "core-foundation 0.9.4", - "home", - "jni", - "log", - "ndk-context", - "objc", - "raw-window-handle", - "url", - "web-sys", -] - -[[package]] -name = "webpki" -version = "0.22.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed63aea5ce73d0ff405984102c42de94fc55a6b75765d621c65262469b3c9b53" -dependencies = [ - "ring", - "untrusted 0.9.0", -] - -[[package]] -name = "webpki-roots" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2878ef029c47c6e8cf779119f20fcf52bde7ad42a731b2a304bc221df17571e" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "winapi-util" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" -dependencies = [ - "windows-sys 0.61.2", -] - -[[package]] -name = "windows-core" -version = "0.62.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" -dependencies = [ - "windows-implement", - "windows-interface", - "windows-link", - "windows-result", - "windows-strings", -] - -[[package]] -name = "windows-implement" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.111", -] - -[[package]] -name = "windows-interface" -version = "0.59.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.111", -] - -[[package]] -name = "windows-link" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" - -[[package]] -name = "windows-registry" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720" -dependencies = [ - "windows-link", - "windows-result", - "windows-strings", -] - -[[package]] -name = "windows-result" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-strings" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets 0.42.2", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-sys" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" -dependencies = [ - "windows-targets 0.53.5", -] - -[[package]] -name = "windows-sys" -version = "0.61.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-targets" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", -] - -[[package]] -name = "windows-targets" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" -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", -] - -[[package]] -name = "windows-targets" -version = "0.53.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" -dependencies = [ - "windows-link", - "windows_aarch64_gnullvm 0.53.1", - "windows_aarch64_msvc 0.53.1", - "windows_i686_gnu 0.53.1", - "windows_i686_gnullvm 0.53.1", - "windows_i686_msvc 0.53.1", - "windows_x86_64_gnu 0.53.1", - "windows_x86_64_gnullvm 0.53.1", - "windows_x86_64_msvc 0.53.1", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" - -[[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.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" - -[[package]] -name = "windows_i686_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" - -[[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.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" - -[[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.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" - -[[package]] -name = "windows_i686_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" - -[[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.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" - -[[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.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" - -[[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.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" - -[[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.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" - -[[package]] -name = "winnow" -version = "0.7.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" -dependencies = [ - "memchr", -] - -[[package]] -name = "wit-bindgen" -version = "0.46.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" - -[[package]] -name = "writeable" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" - -[[package]] -name = "yansi" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" - -[[package]] -name = "yoke" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" -dependencies = [ - "stable_deref_trait", - "yoke-derive", - "zerofrom", -] - -[[package]] -name = "yoke-derive" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.111", - "synstructure", -] - -[[package]] -name = "zerocopy" -version = "0.8.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd74ec98b9250adb3ca554bdde269adf631549f51d8a8f8f0a10b50f1cb298c3" -dependencies = [ - "zerocopy-derive", -] - -[[package]] -name = "zerocopy-derive" -version = "0.8.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8a8d209fdf45cf5138cbb5a506f6b52522a25afccc534d1475dad8e31105c6a" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.111", -] - -[[package]] -name = "zerofrom" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" -dependencies = [ - "zerofrom-derive", -] - -[[package]] -name = "zerofrom-derive" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.111", - "synstructure", -] - -[[package]] -name = "zeroize" -version = "1.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" - -[[package]] -name = "zerotrie" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", -] - -[[package]] -name = "zerovec" -version = "0.11.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" -dependencies = [ - "yoke", - "zerofrom", - "zerovec-derive", -] - -[[package]] -name = "zerovec-derive" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.111", -] diff --git a/Cargo.toml b/Cargo.toml index 5f7030f..166726c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,43 +3,67 @@ resolver = '2' [workspace.dependencies] + anyhow = '1.0.68' + async-trait = '0.1' + derive_builder = '0.20.0' + eyre = '0.6.8' + futures = '0.3.26' futures-util = '0.3.30' + home = '0.5.5' http = '1.1' http-body = '1' http-body-util = '0.1.2' httparse = '1.10' + httpmock = '0.8.0-alpha.1' hyper = '1.4.1' jsonwebtoken = '9.3.0' + oauth2-test-server = '=0.1.2' once_cell = '1.17.0' - opentelemetry = '0.27.1' - opentelemetry-http = '0.27.0' - opentelemetry_sdk = '0.27.1' - pbjson = '0.7.0' - pbjson-build = '0.7.0' - pbjson-types = '0.7.0' - prost = '0.13.1' - prost-build = '0.13.3' + opentelemetry = '0.31.0' + opentelemetry-http = '0.31.0' + opentelemetry_sdk = '0.31.0' + paste = '1.0.15' + pbjson = '0.9.0' + pbjson-build = '0.9.0' + pbjson-types = '0.9.0' + prost = '0.14.1' + prost-build = '0.14.1' + pyo3-build-config = '0.22.1' + rigetti-pyo3 = '0.3.6' rstest = '0.26.0' serde = '1.0.228' serde_json = '1.0.91' + serial_test = '3.1.1' tempfile = '3.3.0' thiserror = '2.0' - tonic-build = '0.12.3' - tonic-health = '0.12.3' - tonic-web = '0.12.3' + toml_edit = '0.23.7' + tonic-build = '0.14.2' + tonic-health = '0.14.2' + tonic-prost = '0.14.2' + tonic-prost-build = '0.14.2' + tonic-web = '0.14.2' tracing = '0.1.41' - tracing-opentelemetry = '0.28.0' + tracing-opentelemetry = '0.32.0' tracing-subscriber = '0.3.18' urlpattern = '0.4.0' + webbrowser = '0.8.15' [workspace.dependencies.async-std] features = ['attributes'] version = '1.12.0' + [workspace.dependencies.async-tempfile] + features = ['uuid'] + version = '0.7.0' + [workspace.dependencies.backoff] features = ['tokio'] version = '0.4.0' + [workspace.dependencies.figment] + features = ['env', 'toml'] + version = '0.10.18' + [workspace.dependencies.hyper-proxy2] default-features = false features = ['rustls'] @@ -53,6 +77,35 @@ features = ['client-legacy'] version = '0.1.6' + [workspace.dependencies.oauth2] + default-features = false + features = ['reqwest', 'native-tls'] + version = '5.0' + + [workspace.dependencies.pyo3] + features = ['multiple-pymethods'] + version = '0.20.3' + + [workspace.dependencies.pyo3-asyncio] + features = ['tokio-runtime'] + version = '0.20.0' + + [workspace.dependencies.qcs-api-client-common] + path = 'qcs-api-client-common' + version = '0.12.12' + + [workspace.dependencies.qcs-api-client-grpc] + path = 'qcs-api-client-grpc' + + [workspace.dependencies.qcs-api-client-grpc-internal] + path = 'qcs-api-client-grpc-internal' + + [workspace.dependencies.qcs-api-client-openapi] + path = 'qcs-api-client-openapi/public' + + [workspace.dependencies.qcs-api-client-openapi-internal] + path = 'qcs-api-client-openapi/internal' + [workspace.dependencies.reqwest] default-features = false features = ['json', 'rustls-tls-native-roots'] @@ -63,9 +116,18 @@ version = '0.3.2' [workspace.dependencies.reqwest-tracing] - features = ['opentelemetry_0_27', 'tracing-opentelemetry_0_28_pkg'] + features = ['opentelemetry_0_29'] version = '0.5.5' + [workspace.dependencies.shellexpand] + default-features = false + features = ['base-0'] + version = '3.1.0' + + [workspace.dependencies.time] + features = ['macros', 'parsing', 'serde'] + version = '0.3.34' + [workspace.dependencies.tokio] features = ['time'] version = '1.38.0' @@ -78,12 +140,16 @@ features = ['net'] version = '0.7' + [workspace.dependencies.toml] + features = ['preserve_order'] + version = '0.9.8' + [workspace.dependencies.tonic] - features = ['tls-roots', 'tls-native-roots'] - version = '0.12.3' + features = ['tls-native-roots'] + version = '0.14.2' [workspace.dependencies.tower] - features = ['retry'] + features = ['retry', 'util'] version = '0.4' [workspace.dependencies.tower-http] diff --git a/qcs-api-client-common/CHANGELOG-py.md b/qcs-api-client-common/CHANGELOG-py.md index e095f9d..90454e5 100644 --- a/qcs-api-client-common/CHANGELOG-py.md +++ b/qcs-api-client-common/CHANGELOG-py.md @@ -1,3 +1,10 @@ +## 0.13.0-kstrand.0 (2025-12-18) + +### Breaking Changes + +- export Secrets and Settings structs, add secret value wrappers to help prevent accidental leakage. +- upgrade tonic (prerelease) + ## 0.12.12 (2025-12-05) ### Fixes diff --git a/qcs-api-client-common/CHANGELOG.md b/qcs-api-client-common/CHANGELOG.md index f6cbf99..a4a624d 100644 --- a/qcs-api-client-common/CHANGELOG.md +++ b/qcs-api-client-common/CHANGELOG.md @@ -1,3 +1,10 @@ +## 0.13.0-kstrand.0 (2025-12-18) + +### Breaking Changes + +- export Secrets and Settings structs, add secret value wrappers to help prevent accidental leakage. +- upgrade tonic (prerelease) + ## 0.12.12 (2025-12-05) ### Fixes diff --git a/qcs-api-client-common/Cargo.toml b/qcs-api-client-common/Cargo.toml index e12d6ef..ac893d6 100644 --- a/qcs-api-client-common/Cargo.toml +++ b/qcs-api-client-common/Cargo.toml @@ -1,26 +1,29 @@ [build-dependencies] [build-dependencies.pyo3-build-config] optional = true - version = '0.22.1' + workspace = true [dependencies] - async-trait = '0.1' - derive_builder = '0.20.0' - futures = '0.3.26' - home = '0.5.5' - toml_edit = '0.23.7' - webbrowser = '0.8.15' - [dependencies.async-tempfile] - features = ['uuid'] - version = '0.7.0' + workspace = true + + [dependencies.async-trait] + workspace = true [dependencies.backoff] workspace = true + [dependencies.derive_builder] + workspace = true + [dependencies.figment] - features = ['env', 'toml'] - version = '0.10.18' + workspace = true + + [dependencies.futures] + workspace = true + + [dependencies.home] + workspace = true [dependencies.http] workspace = true @@ -39,23 +42,19 @@ workspace = true [dependencies.oauth2] - default-features = false - features = ['reqwest', 'native-tls'] - version = '5.0' + workspace = true [dependencies.paste] optional = true - version = '1.0.15' + workspace = true [dependencies.pyo3] - features = ['multiple-pymethods'] optional = true - version = '0.20.3' + workspace = true [dependencies.pyo3-asyncio] - features = ['tokio-runtime'] optional = true - version = '0.20.0' + workspace = true [dependencies.reqwest] default-features = false @@ -64,7 +63,7 @@ [dependencies.rigetti-pyo3] optional = true - version = '0.3.6' + workspace = true [dependencies.serde] features = ['derive'] @@ -74,16 +73,13 @@ workspace = true [dependencies.shellexpand] - default-features = false - features = ['base-0'] - version = '3.1.0' + workspace = true [dependencies.thiserror] workspace = true [dependencies.time] - features = ['macros', 'parsing', 'serde'] - version = '0.3.34' + workspace = true [dependencies.tokio] features = ['rt-multi-thread', 'sync', 'fs', 'signal'] @@ -93,8 +89,10 @@ workspace = true [dependencies.toml] - features = ['preserve_order'] - version = '0.9.8' + workspace = true + + [dependencies.toml_edit] + workspace = true [dependencies.tracing] optional = true @@ -107,18 +105,26 @@ optional = true workspace = true -[dev-dependencies] - httpmock = '0.8.0-alpha.1' - oauth2-test-server = '=0.1.2' - serial_test = '3.1.1' + [dependencies.webbrowser] + workspace = true +[dev-dependencies] [dev-dependencies.figment] - features = ['env', 'toml', 'test'] - version = '0.10.18' + features = ['test'] + workspace = true + + [dev-dependencies.httpmock] + workspace = true + + [dev-dependencies.oauth2-test-server] + workspace = true [dev-dependencies.rstest] workspace = true + [dev-dependencies.serial_test] + workspace = true + [dev-dependencies.tokio] features = ['fs', 'macros'] workspace = true @@ -194,7 +200,7 @@ publish = true readme = 'README.md' repository = 'https://github.com/rigetti/qcs-api-client-rust' - version = '0.12.12' + version = '0.13.0-kstrand.0' [package.metadata] [package.metadata.docs] diff --git a/qcs-api-client-common/pyproject.toml b/qcs-api-client-common/pyproject.toml index e2db517..06a95a4 100644 --- a/qcs-api-client-common/pyproject.toml +++ b/qcs-api-client-common/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "qcs-api-client-common" -version = "0.12.12" +version = "0.13.0-kstrand.0kstrand.0" description = "Contains core QCS client functionality and middleware implementations." readme = "README-py.md" license = { text = "Apache-2.0" } diff --git a/qcs-api-client-common/qcs_api_client_common/configuration/__init__.pyi b/qcs-api-client-common/qcs_api_client_common/configuration/__init__.pyi index 0c82ae7..5c7c158 100644 --- a/qcs-api-client-common/qcs_api_client_common/configuration/__init__.pyi +++ b/qcs-api-client-common/qcs_api_client_common/configuration/__init__.pyi @@ -6,6 +6,7 @@ __all__ = [ "ClientConfiguration", "ClientConfigurationBuilder", "ClientCredentials", + "ClientSecret", "DEFAULT_API_URL", "DEFAULT_GRPC_API_URL", "DEFAULT_PROFILE_NAME", @@ -21,6 +22,8 @@ __all__ = [ "QVM_URL_VAR", "RefreshToken", "PkceFlow", + "SecretAccessToken", + "SecretRefreshToken", "SECRETS_PATH_VAR", "SETTINGS_PATH_VAR", ] @@ -92,10 +95,10 @@ class ClientConfiguration: async def get_oauth_session_async(self) -> OAuthSession: """Get the credentials used to authenticate with the QCS API.""" - def get_bearer_access_token(self) -> str: + def get_bearer_access_token(self) -> SecretAccessToken: """Gets the `Bearer` access token, refreshing it if is expired.""" - async def get_bearer_access_token_async(self) -> str: + async def get_bearer_access_token_async(self) -> SecretAccessToken: """Gets the `Bearer` access token, refreshing it if is expired.""" @final @@ -164,10 +167,10 @@ class AuthServer: class RefreshToken: def __new__(cls, refresh_token: str) -> RefreshToken: ... @property - def refresh_token(self) -> str: + def refresh_token(self) -> SecretRefreshToken: """The refresh token.""" @refresh_token.setter - def refresh_token(self, refresh_token: str): + def refresh_token(self, refresh_token: SecretRefreshToken): """Set the refresh token.""" @final @@ -202,10 +205,10 @@ class PkceFlow: """Represents a PKCE flow. This will automatically initiate a browser redirect flow when constructed. Avoid using this in hosted (non-local) Jupyter notebook environments.""" def __new__(cls, auth_server: AuthServer) -> PkceFlow: ... @property - def access_token(self) -> str: + def access_token(self) -> SecretAccessToken: """The access token.""" @property - def refresh_token(self) -> str | None: + def refresh_token(self) -> SecretRefreshToken | None: """The refresh token.""" @final @@ -214,11 +217,11 @@ class OAuthSession: cls, payload: RefreshToken | ClientCredentials | ExternallyManaged | PkceFlow, auth_server: AuthServer, - access_token: str | None = None, + access_token: SecretAccessToken | None = None, ) -> OAuthSession: ... @property - def access_token(self) -> str: + def access_token(self) -> SecretAccessToken: """Get the current access token. This is an unvalidated copy of the access token. Meaning it can become stale, or may already be stale. See the `validate` `request_access_token` and methods. @@ -232,14 +235,53 @@ class OAuthSession: def payload(self) -> RefreshToken | ClientCredentials | ExternallyManaged | PkceFlow: """Get the payload used to request an access token.""" - def request_access_token(self) -> str: + def request_access_token(self) -> SecretAccessToken: """Request a new access token.""" - async def request_access_token_async(self) -> str: + async def request_access_token_async(self) -> SecretAccessToken: """Request a new access token.""" - def validate(self) -> str: + def validate(self) -> SecretAccessToken: """Validate the current access token, returning it if it is valid. If the token is invalid, a `ValueError` will be raised with a description of why the token failed validation. """ + + +@final +class SecretAccessToken: + """A secret access token, which redacts the sensitive value when printed. The actual value can be retrieved using the `secret` property.""" + + def __new__(cls, value: str) -> SecretAccessToken: ... + + @property + def is_empty(self) -> bool: + """Check if the access token is empty.""" + @property + def secret(self) -> str: + """CAUTION: Take care not to reveal this value to untrusted parties, as it can be used to authenticate on your behalf!""" + +@final +class SecretRefreshToken: + """A secret refresh token, which redacts the sensitive value when printed. The actual value can be retrieved using the `secret` property.""" + + def __new__(cls, value: str) -> SecretRefreshToken: ... + @property + def is_empty(self) -> bool: + """Check if the access token is empty.""" + @property + def secret(self) -> str: + """CAUTION: Take care not to reveal this value to untrusted parties, as it can be used to authenticate on your behalf!""" + + +@final +class ClientSecret: + """A client secret, which redacts the sensitive value when printed. The actual value can be retrieved using the `secret` property.""" + + def __new__(cls, value: str) -> ClientSecret: ... + @property + def is_empty(self) -> bool: + """Check if the client secret is empty.""" + @property + def secret(self) -> str: + """CAUTION: Take care not to reveal this value to untrusted parties, as it can be used to authenticate on your behalf!""" \ No newline at end of file diff --git a/qcs-api-client-common/qcs_api_client_common/grpc.py b/qcs-api-client-common/qcs_api_client_common/grpc.py index 3c3e101..c1ab0fe 100644 --- a/qcs-api-client-common/qcs_api_client_common/grpc.py +++ b/qcs-api-client-common/qcs_api_client_common/grpc.py @@ -7,7 +7,7 @@ from grpc import ClientCallDetails # type: ignore from grpc.aio import Call, UnaryUnaryClientInterceptor # type: ignore -from qcs_api_client_common.configuration import ClientConfiguration +from qcs_api_client_common.configuration import ClientConfiguration, SecretAccessToken class RefreshInterceptor(UnaryUnaryClientInterceptor, metaclass=ABCMeta): @@ -25,7 +25,7 @@ def __init__(self, client_configuration: Optional[ClientConfiguration] = None): client_configuration = ClientConfiguration.load_default() self.configuration = client_configuration - async def _get_access_token(self) -> str: + async def _get_access_token(self) -> SecretAccessToken: return await self.configuration.get_bearer_access_token_async() async def intercept_unary_unary( diff --git a/qcs-api-client-common/src/configuration/mod.rs b/qcs-api-client-common/src/configuration/mod.rs index bfa071d..7a80e49 100644 --- a/qcs-api-client-common/src/configuration/mod.rs +++ b/qcs-api-client-common/src/configuration/mod.rs @@ -26,7 +26,7 @@ //! The [`ClientConfiguration`] exposes an API for loading and accessing your //! configuration. -use crate::configuration::tokens::insecure_validate_token_exp; +use crate::configuration::{secrets::SecretAccessToken, tokens::insecure_validate_token_exp}; #[cfg(feature = "tracing-config")] use crate::tracing_configuration::TracingConfiguration; use derive_builder::Builder; @@ -46,19 +46,19 @@ mod oidc; mod pkce; #[cfg(feature = "python")] mod py; -mod secrets; -mod settings; -mod tokens; +mod secret_string; +pub mod secrets; +pub mod settings; +pub mod tokens; pub use error::{LoadError, TokenError}; +pub use tokens::{ClientCredentials, TokenRefresher}; + #[cfg(feature = "python")] pub(crate) use py::*; -pub use secrets::{DEFAULT_SECRETS_PATH, SECRETS_PATH_VAR, SECRETS_READ_ONLY_VAR}; -pub use settings::{AuthServer, DEFAULT_SETTINGS_PATH, SETTINGS_PATH_VAR}; -pub use tokens::{ - ClientCredentials, ExternallyManaged, OAuthGrant, OAuthSession, PkceFlow, RefreshFunction, - RefreshToken, TokenDispatcher, TokenRefresher, -}; + +use settings::AuthServer; +use tokens::{OAuthGrant, OAuthSession, PkceFlow, RefreshToken, TokenDispatcher}; /// Default profile name. pub const DEFAULT_PROFILE_NAME: &str = "default"; @@ -331,9 +331,10 @@ impl ClientConfiguration { // The current access token is valid, use it if let Some(access_token) = access_token { if insecure_validate_token_exp(&access_token).is_ok() { - let refresh_token = RefreshToken::new(refresh_token.unwrap_or_default()); + let refresh_token = refresh_token.unwrap_or_default(); + let oauth_session = OAuthSession::new( - OAuthGrant::RefreshToken(refresh_token), + OAuthGrant::RefreshToken(RefreshToken::new(refresh_token)), auth_server, Some(access_token), ); @@ -457,7 +458,7 @@ impl ClientConfiguration { /// # Errors /// /// See [`TokenError`]. - pub async fn get_bearer_access_token(&self) -> Result { + pub async fn get_bearer_access_token(&self) -> Result { let dispatcher = self .oauth_session .as_ref() @@ -471,7 +472,7 @@ impl ClientConfiguration { dispatcher .refresh(self.source(), self.profile()) .await - .map(|e| e.access_token().map(ToString::to_string))? + .map(|e| e.access_token().cloned())? } } } @@ -552,15 +553,18 @@ mod test { use tokio_util::sync::CancellationToken; use crate::configuration::{ - expand_path_from_env_or_default, pkce::tests::PkceTestServerHarness, secrets::Secrets, - settings::Settings, AuthServer, ClientConfiguration, OAuthSession, RefreshToken, - API_URL_VAR, DEFAULT_QUILC_URL, GRPC_API_URL_VAR, QUILC_URL_VAR, QVM_URL_VAR, - SECRETS_PATH_VAR, SECRETS_READ_ONLY_VAR, SETTINGS_PATH_VAR, + expand_path_from_env_or_default, + pkce::tests::PkceTestServerHarness, + secrets::{ + SecretAccessToken, SecretRefreshToken, Secrets, SECRETS_PATH_VAR, SECRETS_READ_ONLY_VAR, + }, + settings::{Settings, SETTINGS_PATH_VAR}, + tokens::TokenRefresher, + AuthServer, ClientConfiguration, OAuthSession, RefreshToken, API_URL_VAR, + DEFAULT_QUILC_URL, GRPC_API_URL_VAR, QUILC_URL_VAR, QVM_URL_VAR, }; - use super::{ - settings::QCS_DEFAULT_AUTH_ISSUER_PRODUCTION, tokens::ClientCredentials, TokenRefresher, - }; + use super::{settings::QCS_DEFAULT_AUTH_ISSUER_PRODUCTION, tokens::ClientCredentials}; #[test] fn expands_env_var() { @@ -789,8 +793,8 @@ token_type = "Bearer" Ok(()) }); assert_eq!( - config.get_access_token().await.unwrap(), - Some(access_token.to_string()) + config.get_access_token().await.unwrap().unwrap(), + SecretAccessToken::from(access_token) ); } @@ -829,13 +833,17 @@ token_type = "Bearer" fn to_encoded(&self) -> String { encode(&Header::default(), &self, &EncodingKey::from_secret(&[])).unwrap() } + + fn to_access_token(&self) -> SecretAccessToken { + SecretAccessToken::from(self.to_encoded()) + } } #[test] fn test_valid_token() { - let valid_token = Claims::new_valid().to_encoded(); + let valid_token = Claims::new_valid().to_access_token(); let tokens = OAuthSession::from_refresh_token( - RefreshToken::new(valid_token.clone()), + RefreshToken::new(SecretRefreshToken::from("unused")), AuthServer::default(), Some(valid_token.clone()), ); @@ -849,11 +857,11 @@ token_type = "Bearer" #[test] fn test_expired_token() { - let invalid_token = Claims::new_expired().to_encoded(); + let invalid_token = Claims::new_expired().to_access_token(); let tokens = OAuthSession::from_refresh_token( - RefreshToken::new(invalid_token), + RefreshToken::new(SecretRefreshToken::from("unused")), AuthServer::default(), - None, + Some(invalid_token), ); assert!(tokens.validate().is_err()); } @@ -861,7 +869,7 @@ token_type = "Bearer" #[test] fn test_client_credentials_without_access_token() { let tokens = OAuthSession::from_client_credentials( - ClientCredentials::new("client_id".to_string(), "client_secret".to_string()), + ClientCredentials::new("client_id", "client_secret"), AuthServer::default(), None, ); @@ -932,7 +940,7 @@ token_type = "Bearer" assert_eq!( config.get_bearer_access_token().await.unwrap(), - access_token.to_string() + SecretAccessToken::from(access_token) ); } diff --git a/qcs-api-client-common/src/configuration/pkce.rs b/qcs-api-client-common/src/configuration/pkce.rs index c610e39..31e6cd2 100644 --- a/qcs-api-client-common/src/configuration/pkce.rs +++ b/qcs-api-client-common/src/configuration/pkce.rs @@ -318,6 +318,7 @@ pub(in crate::configuration) mod tests { use crate::configuration::{ oidc::{fetch_discovery, DISCOVERY_REQUIRED_SCOPE}, + secrets::SecretAccessToken, tokens::insecure_validate_token_exp, }; @@ -391,8 +392,9 @@ pub(in crate::configuration) mod tests { .await .expect("pkce_login should succeed"); - let access_token = token_result.access_token().secret().clone(); - let _ = insecure_validate_token_exp(&access_token).expect("token should be valid"); + let access_token = SecretAccessToken::from(token_result.access_token().secret().clone()); + + insecure_validate_token_exp(&access_token).expect("token should be valid"); drop(server); } diff --git a/qcs-api-client-common/src/configuration/py.rs b/qcs-api-client-common/src/configuration/py.rs index 0fd381a..a2d8997 100644 --- a/qcs-api-client-common/src/configuration/py.rs +++ b/qcs-api-client-common/src/configuration/py.rs @@ -1,4 +1,5 @@ #![allow(unused_qualifications)] +#![allow(non_local_definitions, reason = "necessary for pyo3::pymethods")] use pyo3::{ exceptions::{PyFileNotFoundError, PyOSError, PyRuntimeError, PyValueError}, @@ -11,17 +12,21 @@ use tokio_util::sync::CancellationToken; use crate::{ configuration::{ - PkceFlow, API_URL_VAR, DEFAULT_API_URL, DEFAULT_GRPC_API_URL, DEFAULT_PROFILE_NAME, - DEFAULT_QUILC_URL, DEFAULT_QVM_URL, DEFAULT_SECRETS_PATH, DEFAULT_SETTINGS_PATH, - GRPC_API_URL_VAR, PROFILE_NAME_VAR, QUILC_URL_VAR, QVM_URL_VAR, SECRETS_PATH_VAR, - SETTINGS_PATH_VAR, + secrets::{DEFAULT_SECRETS_PATH, SECRETS_PATH_VAR}, + settings::{DEFAULT_SETTINGS_PATH, SETTINGS_PATH_VAR}, + API_URL_VAR, DEFAULT_API_URL, DEFAULT_GRPC_API_URL, DEFAULT_PROFILE_NAME, + DEFAULT_QUILC_URL, DEFAULT_QVM_URL, GRPC_API_URL_VAR, PROFILE_NAME_VAR, QUILC_URL_VAR, + QVM_URL_VAR, }, impl_eq, impl_repr, }; use super::{ - error::TokenError, settings::AuthServer, tokens::ClientCredentials, ClientConfiguration, - ClientConfigurationBuilder, ExternallyManaged, LoadError, OAuthGrant, OAuthSession, + error::TokenError, + secrets::{SecretAccessToken, SecretRefreshToken}, + settings::AuthServer, + tokens::{ClientCredentials, ClientSecret, ExternallyManaged, PkceFlow}, + ClientConfiguration, ClientConfigurationBuilder, LoadError, OAuthGrant, OAuthSession, RefreshToken, TokenDispatcher, }; @@ -33,8 +38,11 @@ create_init_submodule! { OAuthSession, RefreshToken, ClientCredentials, + ClientSecret, ExternallyManaged, - PkceFlow + PkceFlow, + SecretAccessToken, + SecretRefreshToken ], consts: [ DEFAULT_API_URL, @@ -59,30 +67,30 @@ impl_repr!(RefreshToken); #[pymethods] impl RefreshToken { #[new] - const fn __new__(refresh_token: String) -> Self { + const fn __new__(refresh_token: SecretRefreshToken) -> Self { Self::new(refresh_token) } #[getter] #[pyo3(name = "refresh_token")] - fn py_refresh_token(&self) -> &str { - &self.refresh_token + fn py_refresh_token(&self) -> SecretRefreshToken { + self.refresh_token.clone() } #[setter] #[pyo3(name = "refresh_token")] - fn py_set_refresh_token(&mut self, refresh_token: String) { + fn py_set_refresh_token(&mut self, refresh_token: SecretRefreshToken) { self.refresh_token = refresh_token; } } impl_eq!(ClientCredentials); -// Does not implement `__repr__`, since the data contains a secret value. +impl_repr!(ClientCredentials); #[pymethods] impl ClientCredentials { #[new] - const fn __new__(client_id: String, client_secret: String) -> Self { - Self::new(client_id, client_secret) + fn __new__(client_id: String, client_secret: String) -> Self { + Self::new(client_id, ClientSecret::from(client_secret)) } #[getter] @@ -93,8 +101,8 @@ impl ClientCredentials { #[getter] #[pyo3(name = "client_secret")] - fn py_client_secret(&self) -> &str { - self.client_secret() + fn py_client_secret(&self) -> ClientSecret { + self.client_secret().clone() } } @@ -135,7 +143,7 @@ impl PkceFlow { let runtime = get_runtime(); runtime.block_on(async move { let cancel_token = cancel_token_with_ctrl_c(); - PkceFlow::new_login_flow(cancel_token, &auth_server).await + Self::new_login_flow(cancel_token, &auth_server).await }) }) .map_err(|err| PyRuntimeError::new_err(err.to_string())) @@ -143,16 +151,16 @@ impl PkceFlow { #[getter] #[pyo3(name = "access_token")] - fn py_access_token(&self) -> &str { - &self.access_token + fn py_access_token(&self) -> SecretAccessToken { + self.access_token.clone() } #[getter] #[pyo3(name = "refresh_token")] - fn py_refresh_token(&self) -> Option<&str> { + fn py_refresh_token(&self) -> Option { self.refresh_token .as_ref() - .map(|rt| rt.refresh_token.as_str()) + .map(|rt| rt.refresh_token.clone()) } } @@ -163,15 +171,15 @@ impl OAuthSession { const fn __new__( payload: OAuthGrant, auth_server: AuthServer, - access_token: Option, + access_token: Option, ) -> Self { Self::new(payload, auth_server, access_token) } #[getter] #[pyo3(name = "access_token")] - fn py_access_token(&self) -> Result<&str, TokenError> { - self.access_token() + fn py_access_token(&self) -> Result { + self.access_token().cloned() } #[getter] @@ -196,12 +204,12 @@ impl OAuthSession { } #[pyo3(name = "validate")] - fn py_validate(&self) -> Result { + fn py_validate(&self) -> Result { self.validate() } #[pyo3(name = "request_access_token")] - fn py_request_access_token(&self, py: Python<'_>) -> PyResult { + fn py_request_access_token(&self, py: Python<'_>) -> PyResult { py_request_access_token(py, self.clone()) } @@ -220,15 +228,15 @@ py_function_sync_async! { py_function_sync_async! { #[pyfunction] - async fn get_bearer_access_token(configuration: ClientConfiguration) -> PyResult { + async fn get_bearer_access_token(configuration: ClientConfiguration) -> PyResult { configuration.get_bearer_access_token().await.map_err(PyErr::from) } } py_function_sync_async! { #[pyfunction] - async fn request_access_token(session: OAuthSession) -> PyResult { - session.clone().request_access_token().await.map(std::string::ToString::to_string).map_err(PyErr::from) + async fn request_access_token(session: OAuthSession) -> PyResult { + session.clone().request_access_token().await.cloned().map_err(PyErr::from) } } @@ -287,7 +295,7 @@ impl ClientConfiguration { } #[pyo3(name = "get_bearer_access_token")] - fn py_get_bearer_access_token(&self, py: Python<'_>) -> PyResult { + fn py_get_bearer_access_token(&self, py: Python<'_>) -> PyResult { py_get_bearer_access_token(py, self.clone()) } @@ -362,7 +370,7 @@ impl_eq!(AuthServer); impl AuthServer { #[new] const fn py_new(client_id: String, issuer: String) -> Self { - Self::new(client_id, issuer) + Self { client_id, issuer } } #[staticmethod] @@ -375,26 +383,26 @@ impl AuthServer { #[getter] #[must_use] pub fn get_client_id(&self) -> &str { - self.client_id() + &self.client_id } /// Set an Okta client id. #[setter(client_id)] - pub fn py_set_client_id(&mut self, id: String) { - self.set_client_id(id); + pub fn py_set_client_id(&mut self, client_id: String) { + self.client_id = client_id; } /// Get the Okta issuer URL. #[getter] #[must_use] pub fn get_issuer(&self) -> &str { - self.issuer() + &self.issuer } /// Set an Okta issuer URL. #[setter(issuer)] pub fn py_set_issuer(&mut self, issuer: String) { - self.set_issuer(issuer); + self.issuer = issuer; } } diff --git a/qcs-api-client-common/src/configuration/secret_string.rs b/qcs-api-client-common/src/configuration/secret_string.rs new file mode 100644 index 0000000..74c094b --- /dev/null +++ b/qcs-api-client-common/src/configuration/secret_string.rs @@ -0,0 +1,146 @@ +//! Helper macro and dedicated module for secret string types. +//! Avoid exporting this macro, since defining the secret here allows +//! us to make the inner value private and only expose the values via dedicated methods we want. +//! Define the secret strings here and re-export them in the appropriate modules. +#![allow( + non_local_definitions, + unreachable_pub, + dead_code, + reason = "necessary for pyo3::pymethods" +)] + +use serde::{Deserialize, Serialize}; +use std::{borrow::Cow, fmt}; + +#[cfg(feature = "python")] +use crate::{impl_eq, impl_repr}; + +/// Builds a type that wraps [`Cow<'static, str>`] which helps prevent values +/// from being accidentally viewed in e.g. in debug or log output. +macro_rules! make_secret_string { + ( + $(#[$attr:meta])* + $name:ident + ) => { + $(#[$attr])* + #[cfg_attr(feature = "python", ::pyo3::pyclass)] + #[derive(Default, Clone, PartialEq, Eq, Deserialize, Serialize)] + #[serde(transparent)] + pub struct $name(Cow<'static, str>); + + impl fmt::Debug for $name { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + const NAME: &str = stringify!($name); + let len = self.0.len(); + write!(f, "{NAME}()") + } + } + + impl>> From for $name { + fn from(value: T) -> Self { + Self(value.into()) + } + } + + impl $name { + #[must_use] + /// Check if the secret is an empty value + pub fn is_empty(&self) -> bool { + self.0.is_empty() + } + + #[must_use] + /// Get the inner secret contents, which removes the protection against accidentally exposing the value. + pub fn secret(&self) -> &str { + self.0.as_ref() + } + + } + + #[cfg(feature = "python")] + impl_repr!($name); + + #[cfg(feature = "python")] + impl_eq!($name); + + #[cfg(feature = "python")] + #[::pyo3::pymethods] + impl $name { + #[new] + fn py_new(value: String) -> Self { + Self::from(value) + } + + #[must_use] + #[getter] + #[pyo3(name = "is_empty")] + /// Check if the secret is an empty value + pub fn py_is_empty(&self) -> bool { + self.is_empty() + } + + #[must_use] + #[getter] + #[pyo3(name = "secret")] + /// Get the inner secret contents, which removes the protection against accidentally exposing the value. + pub fn py_secret(&self) -> &str { + self.secret() + } + } + } +} + +make_secret_string!( + /// An [OAuth 2.0 refresh token][https://oauth.net/2/refresh-tokens/] that is used to obtain a new [`SecretAccessToken`]. + SecretRefreshToken +); + +make_secret_string!( + /// An [OAuth 2.0 access token][https://oauth.net/2/access-tokens/] that is used to authenticate requests to the QCS API as a `Bearer` token. + SecretAccessToken +); + +make_secret_string!( + /// The [OAuth2 Client Credentials](https://oauth.net/2/grant-types/client-credentials/) secret. + ClientSecret +); + +#[cfg(test)] +mod test { + use super::*; + + make_secret_string!(TestSecret); + + #[test] + fn test_secret_string_serialization() { + const SECRET_VALUE: &str = "my_secret_value"; + const SECRET_VALUE_JSON: &str = "\"my_secret_value\""; + + // Test that the secret string is a plain JSON string + assert_eq!( + serde_json::to_value(TestSecret::from(SECRET_VALUE)).unwrap(), + serde_json::Value::String(SECRET_VALUE.to_string()), + ); + + let test_secret: TestSecret = serde_json::from_str(SECRET_VALUE_JSON).unwrap(); + assert_eq!(test_secret.secret(), SECRET_VALUE); + + assert_eq!( + serde_json::to_string(&test_secret).unwrap(), + SECRET_VALUE_JSON + ); + } + + #[test] + fn test_secret_string_debug_does_not_leak() { + const SECRET_VALUE: &str = "my_secret_value"; + let test_secret = TestSecret::from(SECRET_VALUE); + + let debug_content = format!("{test_secret:?}"); + + assert_eq!( + debug_content, + format!("TestSecret()", SECRET_VALUE.len()) + ); + } +} diff --git a/qcs-api-client-common/src/configuration/secrets.rs b/qcs-api-client-common/src/configuration/secrets.rs index 86631d9..74c0825 100644 --- a/qcs-api-client-common/src/configuration/secrets.rs +++ b/qcs-api-client-common/src/configuration/secrets.rs @@ -1,3 +1,5 @@ +//! Models and utilities for managing QCS secret credentials. + use std::collections::HashMap; use std::path::{Path, PathBuf}; @@ -15,6 +17,8 @@ use crate::configuration::LoadError; use super::error::{IoErrorWithPath, IoOperation, WriteError}; use super::{expand_path_from_env_or_default, DEFAULT_PROFILE_NAME}; +pub use super::secret_string::{SecretAccessToken, SecretRefreshToken}; + /// Setting the `QCS_SECRETS_FILE_PATH` environment variable will change which file is used for loading secrets pub const SECRETS_PATH_VAR: &str = "QCS_SECRETS_FILE_PATH"; /// `QCS_SECRETS_READ_ONLY` indicates whether to treat the `secrets.toml` file as read-only. Disabled by default. @@ -24,12 +28,16 @@ pub const SECRETS_READ_ONLY_VAR: &str = "QCS_SECRETS_READ_ONLY"; /// The default path that [`Secrets`] will be loaded from pub const DEFAULT_SECRETS_PATH: &str = "~/.qcs/secrets.toml"; -#[derive(Deserialize, Debug, PartialEq, Serialize)] -pub(crate) struct Secrets { +/// The structure of QCS secrets, typically serialized as a TOML file at [`DEFAULT_SECRETS_PATH`]. +#[derive(Deserialize, Debug, PartialEq, Eq, Serialize)] +pub struct Secrets { + /// All named [`Credential`]s defined in the secrets file. #[serde(default = "default_credentials")] - pub(crate) credentials: HashMap, + pub credentials: HashMap, + /// The path to the secrets file this [`Secrets`] was loaded from, + /// if it was loaded from a file. This is not stored in the secrets file itself. #[serde(skip)] - pub(crate) file_path: Option, + pub file_path: Option, } fn default_credentials() -> HashMap { @@ -46,14 +54,25 @@ impl Default for Secrets { } impl Secrets { - pub(crate) fn load() -> Result { + /// Load [`Secrets`] from the path specified by the [`SECRETS_PATH_VAR`] environment variable if set, + /// or else the default path at [`DEFAULT_SECRETS_PATH`]. + /// + /// # Errors + /// + /// [`LoadError`] if the secrets file cannot be loaded. + pub fn load() -> Result { let path = expand_path_from_env_or_default(SECRETS_PATH_VAR, DEFAULT_SECRETS_PATH)?; #[cfg(feature = "tracing")] tracing::debug!("loading QCS secrets from {path:?}"); Self::load_from_path(&path) } - pub(crate) fn load_from_path(path: &PathBuf) -> Result { + /// Load [`Secrets`] from the path specified by `path`. + /// + /// # Errors + /// + /// [`LoadError`] if the secrets file cannot be loaded. + pub fn load_from_path(path: &PathBuf) -> Result { let mut secrets: Self = Figment::from(Toml::file(path)).extract()?; secrets.file_path = Some(path.into()); Ok(secrets) @@ -61,9 +80,13 @@ impl Secrets { /// Returns a bool indicating whether or not the QCS [`Secrets`] file is read-only. /// - /// The file is considered read-only if the `QCS_SECRETS_READ_ONLY` environment variable is set, + /// The file is considered read-only if the [`SECRETS_READ_ONLY_VAR`] environment variable is set, /// or if the file permissions indicate that it is read-only. - pub(crate) async fn is_read_only( + /// + /// # Errors + /// + /// [`WriteError`] if the file permissions cannot be checked. + pub async fn is_read_only( secrets_path: impl AsRef + Send + Sync, ) -> Result { // Check if the QCS_SECRETS_READ_ONLY environment variable is set @@ -98,8 +121,8 @@ impl Secrets { pub(crate) async fn write_tokens( secrets_path: impl AsRef + Send + Sync + std::fmt::Debug, profile_name: &str, - refresh_token: Option<&str>, - access_token: &str, + refresh_token: Option<&SecretRefreshToken>, + access_token: &SecretAccessToken, updated_at: OffsetDateTime, ) -> Result<(), WriteError> { // Read the current contents of the secrets file @@ -124,7 +147,7 @@ impl Secrets { .map(PrimitiveDateTime::assume_utc); let did_update_access_token = if current_updated_at.is_none_or(|dt| dt < updated_at) { - token_payload["access_token"] = access_token.into(); + token_payload["access_token"] = access_token.secret().into(); token_payload["updated_at"] = updated_at.format(&Rfc3339)?.into(); true } else { @@ -133,6 +156,7 @@ impl Secrets { let did_update_refresh_token = refresh_token.is_some_and(|new_refresh_token| { let current_refresh_token = token_payload.get("refresh_token").and_then(|v| v.as_str()); + let new_refresh_token = new_refresh_token.secret(); let is_changed = current_refresh_token != Some(new_refresh_token); if is_changed { @@ -220,20 +244,29 @@ impl Secrets { } } -#[derive(Deserialize, Debug, Default, PartialEq, Serialize)] -pub(crate) struct Credential { - pub(crate) token_payload: Option, +/// A QCS credential, containing sensitive authentication secrets. +#[derive(Deserialize, Debug, Default, PartialEq, Eq, Serialize)] +pub struct Credential { + /// The [`TokenPayload`] for this credential. + pub token_payload: Option, } -#[derive(Deserialize, Debug, Default, PartialEq, Serialize)] -pub(crate) struct TokenPayload { - pub(crate) refresh_token: Option, - pub(crate) access_token: Option, +/// A QCS token payload, containing sensitive authentication secrets. +#[derive(Deserialize, Debug, Default, PartialEq, Eq, Serialize)] +pub struct TokenPayload { + /// The refresh token for this credential. + pub refresh_token: Option, + /// The access token for this credential. + pub access_token: Option, + /// The time at which this token was last updated. #[serde( default, deserialize_with = "time::serde::rfc3339::option::deserialize" )] - pub(crate) updated_at: Option, + pub updated_at: Option, + + // The below fields are retained for (de)serialization for compatibility with other + // libraries that use token payloads, but are not relevant here. scope: Option, expires_in: Option, id_token: Option, @@ -248,6 +281,8 @@ mod describe_load { use time::{macros::datetime, OffsetDateTime}; + use crate::configuration::secrets::SecretAccessToken; + use super::{Credential, Secrets, SECRETS_PATH_VAR}; #[test] @@ -330,9 +365,15 @@ token_type = "Bearer" ]; for (access_token, updated_at) in token_updates { - Secrets::write_tokens("secrets.toml", "test", None, access_token, updated_at) - .await - .expect("Should be able to write access token"); + Secrets::write_tokens( + "secrets.toml", + "test", + None, + &SecretAccessToken::from(access_token), + updated_at, + ) + .await + .expect("Should be able to write access token"); } // Verify the final state @@ -344,7 +385,10 @@ token_type = "Bearer" .token_payload .unwrap(); - assert_eq!(payload.access_token.unwrap(), "new_access_token"); + assert_eq!( + payload.access_token.unwrap(), + SecretAccessToken::from("new_access_token") + ); assert_eq!(payload.updated_at.unwrap(), max_rfc3339()); let new_permissions = std::fs::metadata("secrets.toml") .expect("Should be able to get file metadata") diff --git a/qcs-api-client-common/src/configuration/settings.rs b/qcs-api-client-common/src/configuration/settings.rs index f3bf393..2496d3a 100644 --- a/qcs-api-client-common/src/configuration/settings.rs +++ b/qcs-api-client-common/src/configuration/settings.rs @@ -1,3 +1,4 @@ +//! Models and utilities for managing QCS settings. use std::collections::HashMap; use std::path::PathBuf; @@ -16,25 +17,49 @@ pub const SETTINGS_PATH_VAR: &str = "QCS_SETTINGS_FILE_PATH"; /// The default path that [`Settings`] will be loaded from; pub const DEFAULT_SETTINGS_PATH: &str = "~/.qcs/settings.toml"; -#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)] -pub(crate) struct Settings { +/// The structure of QCS settings, typically serialized as a TOML file at [`DEFAULT_SETTINGS_PATH`]. +#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)] +pub struct Settings { + /// The default profile to use - this should match a key of [`Settings::profiles`]. #[serde(default = "default_profile_name")] - pub(crate) default_profile_name: String, + pub default_profile_name: String, + + /// All named [`Profile`]s defined in the settings file. #[serde(default = "default_profiles")] - pub(crate) profiles: HashMap, + pub profiles: HashMap, + + /// All named [`AuthServer`]s defined in the settings file. #[serde(default = "default_auth_servers")] - pub(crate) auth_servers: HashMap, + pub auth_servers: HashMap, + + /// The path to the settings file this [`Settings`] was loaded from, + /// if it was loaded from a file. This is not stored in the settings file itself. #[serde(skip)] - pub(crate) file_path: Option, + pub file_path: Option, } impl Settings { - pub(crate) fn load() -> Result { + /// Load [`Settings`] from the path specified by the [`SETTINGS_PATH_VAR`] environment variable if set, + /// or else the default path at [`DEFAULT_SETTINGS_PATH`]. + /// + /// # Errors + /// + /// [`LoadError`] if the settings file cannot be loaded. + pub fn load() -> Result { let path = expand_path_from_env_or_default(SETTINGS_PATH_VAR, DEFAULT_SETTINGS_PATH)?; #[cfg(feature = "tracing")] tracing::debug!("loading QCS settings from {path:?}"); - let mut settings: Self = Figment::from(Toml::file(&path)).extract()?; - settings.file_path = Some(path); + Self::load_from_path(&path) + } + + /// Load [`Settings`] from the path specified by `path`. + /// + /// # Errors + /// + /// [`LoadError`] if the settings file cannot be loaded. + pub fn load_from_path(path: &PathBuf) -> Result { + let mut settings: Self = Figment::from(Toml::file(path)).extract()?; + settings.file_path = Some(path.into()); Ok(settings) } } @@ -62,23 +87,25 @@ fn default_auth_servers() -> HashMap { HashMap::from([(DEFAULT_PROFILE_NAME.to_string(), AuthServer::default())]) } -#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)] -pub(crate) struct Profile { +/// A particular profile of [`Settings`], which defines all the configurable options +/// for connecting to a particular QCS instance using a particular set of credentials. +#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)] +pub struct Profile { /// URL of the QCS REST API. #[serde(default = "default_api_url")] - pub(crate) api_url: String, + pub api_url: String, /// URL of the QCS gRPC API. #[serde(default = "default_grpc_api_url")] - pub(crate) grpc_api_url: String, - /// Name of the auth server to use. + pub grpc_api_url: String, + /// Name of the [`AuthServer`] to use. #[serde(default = "default_profile_name")] - pub(crate) auth_server_name: String, - /// Name of the credentials to use. + pub auth_server_name: String, + /// Name of the [`Credential`][`super::secrets::Credential`] to use from the corresponding [`Secrets`][`super::secrets::Secrets`]. #[serde(default = "default_profile_name")] - pub(crate) credentials_name: String, + pub credentials_name: String, /// Application specific settings. #[serde(default)] - pub(crate) applications: Applications, + pub applications: Applications, } impl Default for Profile { @@ -110,7 +137,7 @@ pub(crate) const QCS_DEFAULT_AUTH_ISSUER_PRODUCTION: &str = #[cfg_attr(feature = "python", pyo3::pyclass)] pub struct AuthServer { /// OAuth 2.0 client id. - client_id: String, + pub client_id: String, /// OAuth 2.0 issuer URL. /// /// This is the base URL of the identity provider. @@ -121,7 +148,7 @@ pub struct AuthServer { /// which is the canonical URI that the identity provider uses to sign and validate tokens, /// but the OpenID specification requires that they match exactly, /// and that they match the `iss` claim in Tokens issued by this identity provider. - issuer: String, + pub issuer: String, } impl Default for AuthServer { @@ -139,43 +166,26 @@ impl AuthServer { pub const fn new(client_id: String, issuer: String) -> Self { Self { client_id, issuer } } - - /// Get the configured OAuth 2.0 client id. - #[must_use] - pub fn client_id(&self) -> &str { - &self.client_id - } - - /// Set an OAuth 2.0 client id. - pub fn set_client_id(&mut self, id: String) { - self.client_id = id; - } - - /// Get the OAuth 2.0 issuer URL. - #[must_use] - pub fn issuer(&self) -> &str { - &self.issuer - } - - /// Set an OAuth 2.0 issuer URL. - pub fn set_issuer(&mut self, issuer: String) { - self.issuer = issuer; - } } -#[derive(Deserialize, Clone, Debug, Default, PartialEq, Serialize)] -pub(crate) struct Applications { +/// Settings for secondary applications used by QCS SDKs. +#[derive(Deserialize, Clone, Debug, Default, PartialEq, Eq, Serialize)] +pub struct Applications { + /// Settings for use of the pyquil SDK. #[serde(default)] - pub(crate) pyquil: Pyquil, + pub pyquil: Pyquil, } -#[derive(Deserialize, Clone, Debug, PartialEq, Serialize)] -pub(crate) struct Pyquil { - #[serde(default = "env_or_default_quilc_url")] - pub(crate) quilc_url: String, - +/// Settings for secondary applications used by pyquil. +#[derive(Deserialize, Clone, Debug, PartialEq, Eq, Serialize)] +pub struct Pyquil { + /// URL of the QVM server. #[serde(default = "env_or_default_qvm_url")] - pub(crate) qvm_url: String, + pub qvm_url: String, + + /// URL of the Quilc compiler server. + #[serde(default = "env_or_default_quilc_url")] + pub quilc_url: String, } impl Default for Pyquil { diff --git a/qcs-api-client-common/src/configuration/tokens.rs b/qcs-api-client-common/src/configuration/tokens.rs index f39563c..5d18792 100644 --- a/qcs-api-client-common/src/configuration/tokens.rs +++ b/qcs-api-client-common/src/configuration/tokens.rs @@ -1,3 +1,4 @@ +//! Models and utilities for managing `OAuth2` sessions. use std::{pin::Pin, sync::Arc}; use futures::Future; @@ -14,24 +15,27 @@ use super::{ use crate::configuration::{ error::DiscoveryError, pkce::{pkce_login, PkceLoginError, PkceLoginRequest}, + secrets::{Credential, SecretAccessToken, SecretRefreshToken, TokenPayload}, }; #[cfg(feature = "tracing-config")] use crate::tracing_configuration::TracingConfiguration; #[cfg(feature = "tracing")] use urlpattern::UrlPatternMatchInput; +pub use super::secret_string::ClientSecret; + /// A single type containing an access token and an associated refresh token. #[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)] #[cfg_attr(feature = "python", pyo3::pyclass)] pub struct RefreshToken { /// The token used to refresh the access token. - pub refresh_token: String, + pub refresh_token: SecretRefreshToken, } impl RefreshToken { /// Create a new [`RefreshToken`] with the given refresh token. #[must_use] - pub const fn new(refresh_token: String) -> Self { + pub const fn new(refresh_token: SecretRefreshToken) -> Self { Self { refresh_token } } @@ -43,47 +47,50 @@ impl RefreshToken { pub async fn request_access_token( &mut self, auth_server: &AuthServer, - ) -> Result { + ) -> Result { if self.refresh_token.is_empty() { return Err(TokenError::NoRefreshToken); } let client = default_http_client()?; - let token_url = oidc::fetch_discovery(&client, auth_server.issuer()) + let token_url = oidc::fetch_discovery(&client, &auth_server.issuer) .await? .token_endpoint; - let data = TokenRefreshRequest::new(auth_server.client_id(), &self.refresh_token); + let data = TokenRefreshRequest::new(&auth_server.client_id, self.refresh_token.secret()); let resp = client.post(token_url).form(&data).send().await?; - let response_data: RefreshTokenResponse = resp.error_for_status()?.json().await?; - self.refresh_token = response_data.refresh_token; - Ok(response_data.access_token) + let RefreshTokenResponse { + access_token, + refresh_token, + } = resp.error_for_status()?.json().await?; + + self.refresh_token = refresh_token; + Ok(access_token) } } #[derive(Deserialize, Debug, Serialize)] pub(super) struct ClientCredentialsResponse { - pub(super) access_token: String, + pub(super) access_token: SecretAccessToken, } -#[derive(Clone, PartialEq, Eq, Deserialize)] -#[expect(missing_debug_implementations, reason = "contains secret data")] +#[derive(Debug, Clone, PartialEq, Eq, Deserialize)] #[cfg_attr(feature = "python", pyo3::pyclass)] /// A pair of Client ID and Client Secret, used to request an OAuth Client Credentials Grant pub struct ClientCredentials { /// The client ID pub client_id: String, /// The client secret. - pub client_secret: String, + pub client_secret: ClientSecret, } impl ClientCredentials { #[must_use] /// Construct a new [`ClientCredentials`] - pub const fn new(client_id: String, client_secret: String) -> Self { + pub fn new(client_id: impl Into, client_secret: impl Into) -> Self { Self { - client_id, - client_secret, + client_id: client_id.into(), + client_secret: client_secret.into(), } } @@ -95,7 +102,7 @@ impl ClientCredentials { /// Get the client secret. #[must_use] - pub fn client_secret(&self) -> &str { + pub const fn client_secret(&self) -> &ClientSecret { &self.client_secret } @@ -107,24 +114,23 @@ impl ClientCredentials { pub async fn request_access_token( &self, auth_server: &AuthServer, - ) -> Result { + ) -> Result { let request = ClientCredentialsRequest::new(None); let client = default_http_client()?; - let url = oidc::fetch_discovery(&client, auth_server.issuer()) + let url = oidc::fetch_discovery(&client, &auth_server.issuer) .await? .token_endpoint; let ready_to_send = client .post(url) - .basic_auth(auth_server.client_id(), Some(&self.client_secret)) + .basic_auth(&auth_server.client_id, Some(&self.client_secret.secret())) .form(&request); let response = ready_to_send.send().await?; response.error_for_status_ref()?; - let response_body: ClientCredentialsResponse = response.json().await?; - - Ok(response_body.access_token) + let ClientCredentialsResponse { access_token } = response.json().await?; + Ok(access_token) } } @@ -134,7 +140,7 @@ impl ClientCredentials { /// The Access (Bearer) and refresh (if available) tokens from a PKCE login. pub struct PkceFlow { /// The access token. - pub access_token: String, + pub access_token: SecretAccessToken, /// The refresh token, if available. pub refresh_token: Option, } @@ -142,10 +148,13 @@ pub struct PkceFlow { /// Errors that can occur when attempting to perform a PKCE login flow. #[derive(Debug, thiserror::Error)] pub enum PkceFlowError { + /// Error that occurred while performing the PKCE login flow. #[error(transparent)] PkceLogin(#[from] PkceLoginError), + /// Error that occurred while fetching the discovery document from the `OAuth2` issuer. #[error(transparent)] Discovery(#[from] DiscoveryError), + /// Error that occurred while making http requests. #[error(transparent)] Request(#[from] reqwest::Error), } @@ -160,7 +169,7 @@ impl PkceFlow { cancel_token: CancellationToken, auth_server: &AuthServer, ) -> Result { - let issuer = auth_server.issuer().to_string(); + let issuer = auth_server.issuer.clone(); let client = default_http_client()?; let discovery = oidc::fetch_discovery(&client, &issuer).await?; @@ -168,7 +177,7 @@ impl PkceFlow { let response = pkce_login( cancel_token, PkceLoginRequest { - client_id: auth_server.client_id().to_string(), + client_id: auth_server.client_id.clone(), redirect_port: None, discovery, }, @@ -176,10 +185,10 @@ impl PkceFlow { .await?; Ok(Self { - access_token: response.access_token().secret().to_string(), + access_token: SecretAccessToken::from(response.access_token().secret().clone()), refresh_token: response .refresh_token() - .map(|rt| RefreshToken::new(rt.secret().to_string())), + .map(|rt| RefreshToken::new(SecretRefreshToken::from(rt.secret().clone()))), }) } @@ -191,9 +200,9 @@ impl PkceFlow { pub async fn request_access_token( &mut self, auth_server: &AuthServer, - ) -> Result { - if let Ok(access_token) = insecure_validate_token_exp(&self.access_token) { - return Ok(access_token); + ) -> Result { + if insecure_validate_token_exp(&self.access_token).is_ok() { + return Ok(self.access_token.clone()); } if let Some(refresh_token) = &mut self.refresh_token { @@ -206,6 +215,18 @@ impl PkceFlow { } } +impl From for Credential { + fn from(value: PkceFlow) -> Self { + let mut token_payload = TokenPayload::default(); + token_payload.access_token = Some(value.access_token); + token_payload.refresh_token = value.refresh_token.map(|rt| rt.refresh_token); + + Self { + token_payload: Some(token_payload), + } + } +} + #[derive(Clone)] #[cfg_attr(feature = "python", derive(pyo3::FromPyObject))] /// Specifies the [OAuth2 grant type](https://oauth.net/2/grant-types/) to use, along with the data @@ -250,7 +271,7 @@ impl OAuthGrant { async fn request_access_token( &mut self, auth_server: &AuthServer, - ) -> Result { + ) -> Result { match self { Self::RefreshToken(tokens) => tokens.request_access_token(auth_server).await, Self::ClientCredentials(tokens) => tokens.request_access_token(auth_server).await, @@ -291,7 +312,7 @@ pub struct OAuthSession { /// The grant type to use to request an access token. payload: OAuthGrant, /// The access token that is currently in use. None if no token has been requested yet. - access_token: Option, + access_token: Option, /// The [`AuthServer`] that issues the tokens. auth_server: AuthServer, } @@ -305,7 +326,7 @@ impl OAuthSession { pub const fn new( payload: OAuthGrant, auth_server: AuthServer, - access_token: Option, + access_token: Option, ) -> Self { Self { payload, @@ -322,7 +343,7 @@ impl OAuthSession { pub const fn from_externally_managed( tokens: ExternallyManaged, auth_server: AuthServer, - access_token: Option, + access_token: Option, ) -> Self { Self::new( OAuthGrant::ExternallyManaged(tokens), @@ -339,7 +360,7 @@ impl OAuthSession { pub const fn from_refresh_token( tokens: RefreshToken, auth_server: AuthServer, - access_token: Option, + access_token: Option, ) -> Self { Self::new(OAuthGrant::RefreshToken(tokens), auth_server, access_token) } @@ -352,7 +373,7 @@ impl OAuthSession { pub const fn from_client_credentials( tokens: ClientCredentials, auth_server: AuthServer, - access_token: Option, + access_token: Option, ) -> Self { Self::new( OAuthGrant::ClientCredentials(tokens), @@ -369,7 +390,7 @@ impl OAuthSession { pub const fn from_pkce_flow( flow: PkceFlow, auth_server: AuthServer, - access_token: Option, + access_token: Option, ) -> Self { Self::new(OAuthGrant::PkceFlow(flow), auth_server, access_token) } @@ -382,11 +403,8 @@ impl OAuthSession { /// # Errors /// /// - [`TokenError::NoAccessToken`] if there is no access token - pub fn access_token(&self) -> Result<&str, TokenError> { - self.access_token.as_ref().map_or_else( - || Err(TokenError::NoAccessToken), - |token| Ok(token.as_str()), - ) + pub fn access_token(&self) -> Result<&SecretAccessToken, TokenError> { + self.access_token.as_ref().ok_or(TokenError::NoAccessToken) } /// Get the payload used to request an access token. @@ -401,13 +419,9 @@ impl OAuthSession { /// /// See [`TokenError`] #[allow(clippy::missing_panics_doc)] - pub async fn request_access_token(&mut self) -> Result<&str, TokenError> { + pub async fn request_access_token(&mut self) -> Result<&SecretAccessToken, TokenError> { let access_token = self.payload.request_access_token(&self.auth_server).await?; - self.access_token = Some(access_token); - Ok(self - .access_token - .as_ref() - .expect("This value is set in the previous line, so it cannot be None")) + Ok(self.access_token.insert(access_token)) } /// The [`AuthServer`] that issues the tokens. @@ -423,26 +437,28 @@ impl OAuthSession { /// /// - [`TokenError::NoAccessToken`] if an access token has not been requested. /// - [`TokenError::InvalidAccessToken`] if the access token is invalid. - pub fn validate(&self) -> Result { - self.access_token().map_or_else( - |_| Err(TokenError::NoAccessToken), - insecure_validate_token_exp, - ) + pub fn validate(&self) -> Result { + let access_token = self.access_token()?; + insecure_validate_token_exp(access_token)?; + Ok(access_token.clone()) } } /// Validates the access token's format and `exp` claim, but no other claims or /// signature. We do this only to determine if the token is expired and needs refreshing, /// there is no way to securely validate the token's signature on the client side. -pub(crate) fn insecure_validate_token_exp(access_token: &str) -> Result { +pub(crate) fn insecure_validate_token_exp( + access_token: &SecretAccessToken, +) -> Result<(), TokenError> { let placeholder_key = DecodingKey::from_secret(&[]); let mut validation = Validation::new(Algorithm::RS256); validation.validate_exp = true; validation.leeway = 60; validation.validate_aud = false; validation.insecure_disable_signature_validation(); - jsonwebtoken::decode::(access_token, &placeholder_key, &validation) - .map(|_| access_token.to_string()) + + jsonwebtoken::decode::(access_token.secret(), &placeholder_key, &validation) + .map(|_| ()) .map_err(TokenError::InvalidAccessToken) } @@ -525,7 +541,7 @@ impl TokenDispatcher { /// /// - [`TokenError::NoAccessToken`] if there is no access token /// - [`TokenError::InvalidAccessToken`] if the access token is invalid - pub async fn validate(&self) -> Result { + pub async fn validate(&self) -> Result { self.use_tokens(OAuthSession::validate).await } @@ -563,10 +579,9 @@ impl TokenDispatcher { if !Secrets::is_read_only(secrets_path).await? { // If the payload is a PkceFlow, write the fresh refresh token if available. let refresh_token = match &oauth_session.payload { - OAuthGrant::PkceFlow(payload) => payload - .refresh_token - .as_ref() - .map(|rt| rt.refresh_token.as_str()), + OAuthGrant::PkceFlow(payload) => { + payload.refresh_token.as_ref().map(|rt| &rt.refresh_token) + } _ => None, }; @@ -629,7 +644,7 @@ impl ExternallyManaged { /// # Example /// /// ``` - /// use qcs_api_client_common::configuration::{AuthServer, ExternallyManaged, TokenError}; + /// use qcs_api_client_common::configuration::{settings::AuthServer, tokens::ExternallyManaged, TokenError}; /// use std::future::Future; /// use std::pin::Pin; /// use std::boxed::Box; @@ -662,7 +677,7 @@ impl ExternallyManaged { /// # Example /// /// ``` - /// use qcs_api_client_common::configuration::{AuthServer, ExternallyManaged, TokenError}; + /// use qcs_api_client_common::configuration::{settings::AuthServer, tokens::ExternallyManaged, TokenError}; /// use tokio::runtime::Runtime; /// use std::error::Error; /// @@ -676,7 +691,7 @@ impl ExternallyManaged { /// let rt = Runtime::new().unwrap(); /// rt.block_on(async { /// match token_manager.request_access_token(&AuthServer::default()).await { - /// Ok(token) => println!("Token: {}", token), + /// Ok(token) => println!("Token: {token:?}"), /// Err(e) => println!("Failed to refresh token: {:?}", e), /// } /// }); @@ -706,7 +721,7 @@ impl ExternallyManaged { /// # Example /// /// ``` - /// use qcs_api_client_common::configuration::{AuthServer, ExternallyManaged, TokenError}; + /// use qcs_api_client_common::configuration::{settings::AuthServer, tokens::ExternallyManaged, TokenError}; /// use tokio::runtime::Runtime; /// use std::error::Error; /// @@ -720,7 +735,7 @@ impl ExternallyManaged { /// let rt = Runtime::new().unwrap(); /// rt.block_on(async { /// match token_manager.request_access_token(&AuthServer::default()).await { - /// Ok(token) => println!("Token: {}", token), + /// Ok(token) => println!("Token: {token:?}"), /// Err(e) => println!("Failed to refresh token: {:?}", e), /// } /// }); @@ -747,8 +762,10 @@ impl ExternallyManaged { pub async fn request_access_token( &self, auth_server: &AuthServer, - ) -> Result> { - (self.refresh_function)(auth_server.clone()).await + ) -> Result> { + (self.refresh_function)(auth_server.clone()) + .await + .map(SecretAccessToken::from) } } @@ -797,8 +814,8 @@ impl ClientCredentialsRequest { #[derive(Deserialize, Debug, Serialize)] pub(super) struct RefreshTokenResponse { - pub(super) refresh_token: String, - pub(super) access_token: String, + pub(super) refresh_token: SecretRefreshToken, + pub(super) access_token: SecretAccessToken, } /// Get and refresh access tokens @@ -809,13 +826,13 @@ pub trait TokenRefresher: Clone + std::fmt::Debug + Send { type Error; /// Get and validate the current access token, refreshing it if it doesn't exist or is invalid. - async fn validated_access_token(&self) -> Result; + async fn validated_access_token(&self) -> Result; /// Get the current access token, if any - async fn get_access_token(&self) -> Result, Self::Error>; + async fn get_access_token(&self) -> Result, Self::Error>; /// Get a fresh access token - async fn refresh_access_token(&self) -> Result; + async fn refresh_access_token(&self) -> Result; /// Get the base URL for requests #[cfg(feature = "tracing")] @@ -846,18 +863,16 @@ pub trait TokenRefresher: Clone + std::fmt::Debug + Send { impl TokenRefresher for ClientConfiguration { type Error = TokenError; - async fn validated_access_token(&self) -> Result { + async fn validated_access_token(&self) -> Result { self.get_bearer_access_token().await } - async fn refresh_access_token(&self) -> Result { - Ok(self.refresh().await?.access_token()?.to_string()) + async fn refresh_access_token(&self) -> Result { + Ok(self.refresh().await?.access_token()?.clone()) } - async fn get_access_token(&self) -> Result, Self::Error> { - Ok(Some( - self.oauth_session().await?.access_token()?.to_string(), - )) + async fn get_access_token(&self) -> Result, Self::Error> { + Ok(Some(self.oauth_session().await?.access_token()?.clone())) } #[cfg(feature = "tracing")] @@ -910,15 +925,18 @@ mod test { then.status(200) .delay(Duration::from_secs(3)) .json_body_obj(&RefreshTokenResponse { - access_token: "new_access".to_string(), - refresh_token: "new_refresh".to_string(), + access_token: SecretAccessToken::from("new_access"), + refresh_token: SecretRefreshToken::from("new_refresh"), }); }) .await; let original_tokens = OAuthSession::from_refresh_token( - RefreshToken::new("refresh".to_string()), - AuthServer::new("client_id".to_string(), mock_server.base_url()), + RefreshToken::new(SecretRefreshToken::from("refresh")), + AuthServer { + client_id: "client_id".to_string(), + issuer: mock_server.base_url(), + }, None, ); let dispatcher: TokenDispatcher = original_tokens.clone().into(); @@ -955,9 +973,15 @@ mod test { read_duration >= refresh_duration, "Read operation was not blocked by the write operation" ); - assert_eq!(read_result.access_token.as_ref().unwrap(), "new_access"); + assert_eq!( + read_result.access_token.unwrap(), + SecretAccessToken::from("new_access") + ); if let OAuthGrant::RefreshToken(payload) = read_result.payload { - assert_eq!(&payload.refresh_token, "new_refresh"); + assert_eq!( + payload.refresh_token, + SecretRefreshToken::from("new_refresh") + ); } else { panic!( "Expected RefreshToken payload, got {:?}", @@ -1036,22 +1060,22 @@ updated_at = "2024-01-01T00:00:00Z" .await; // Set up the mock token endpoint - let new_access_token = "new_access_token"; + let new_access_token = SecretAccessToken::from("new_access_token"); let issuer_mock = mock_server .mock_async(|when, then| { when.method(POST).path("/v1/token"); then.status(200).json_body_obj(&RefreshTokenResponse { - access_token: new_access_token.to_string(), - refresh_token: initial_refresh_token.to_string(), + access_token: new_access_token.clone(), + refresh_token: SecretRefreshToken::from(initial_refresh_token), }); }) .await; // Create tokens and dispatcher let original_tokens = OAuthSession::from_refresh_token( - RefreshToken::new(initial_refresh_token.to_string()), - AuthServer::new("client_id".to_string(), mock_server.base_url()), - Some(initial_refresh_token.to_string()), + RefreshToken::new(SecretRefreshToken::from(initial_refresh_token)), + AuthServer { client_id: "client_id".to_string(), issuer: mock_server.base_url() }, + Some(SecretAccessToken::from(initial_refresh_token)), ); let dispatcher: TokenDispatcher = original_tokens.into(); @@ -1101,9 +1125,11 @@ updated_at = "2024-01-01T00:00:00Z" }) .expect("Should be able to get token_payload table"); + let access_token = token_payload.get("access_token").unwrap().as_str().map(str::to_string).map(SecretAccessToken::from); + assert_eq!( - token_payload.get("access_token").unwrap().as_str().unwrap(), - new_access_token + access_token, + Some(new_access_token) ); assert!( @@ -1128,12 +1154,15 @@ updated_at = "2024-01-01T00:00:00Z" #[test] fn test_auth_session_debug_fmt() { let session = OAuthSession { - payload: OAuthGrant::ClientCredentials(ClientCredentials { - client_id: "hidden_id".into(), - client_secret: "hidden_secret".into(), - }), - access_token: Some("token".into()), - auth_server: AuthServer::new("some_id".into(), "some_url".into()), + payload: OAuthGrant::ClientCredentials(ClientCredentials::new( + "hidden_id", + "hidden_secret", + )), + access_token: Some(SecretAccessToken::from("token")), + auth_server: AuthServer { + client_id: "some_id".into(), + issuer: "some_url".into(), + }, }; assert_eq!("OAuthSession { payload: ClientCredentials, access_token: Some(()), auth_server: AuthServer { client_id: \"some_id\", issuer: \"some_url\" } }", &format!("{session:?}")); diff --git a/qcs-api-client-common/src/py/mod.rs b/qcs-api-client-common/src/py/mod.rs index 410a5d2..243f385 100644 --- a/qcs-api-client-common/src/py/mod.rs +++ b/qcs-api-client-common/src/py/mod.rs @@ -5,7 +5,7 @@ #[macro_export] macro_rules! impl_repr { ($name: ident) => { - #[pyo3::pymethods] + #[::pyo3::pymethods] impl $name { #[must_use] fn __repr__(&self) -> String { @@ -15,37 +15,24 @@ macro_rules! impl_repr { }; } -/// Implement `__str__` for wrapper types whose inner type implements [`Display`](std::fmt::Display). -#[macro_export] -macro_rules! impl_str { - ($name: ident) => { - #[$crate::pyo3::pymethods] - impl $name { - fn __str__(&self) -> String { - format!("{}", $crate::PyWrapper::as_inner(self)) - } - } - }; -} - /// Provides support for equality checks of a [`pyo3::pyclass`] by implementing `__richcmp__`. /// /// The pyclass must implement [`PartialEq`]. #[macro_export] macro_rules! impl_eq { ($name: ident) => { - #[pymethods] + #[::pyo3::pymethods] impl $name { fn __richcmp__( &self, - py: pyo3::Python<'_>, + py: ::pyo3::Python<'_>, other: &Self, - op: pyo3::pyclass::CompareOp, - ) -> pyo3::PyObject { - use pyo3::IntoPy; + op: ::pyo3::pyclass::CompareOp, + ) -> ::pyo3::PyObject { + use ::pyo3::IntoPy; match op { - pyo3::pyclass::CompareOp::Eq => (self == other).into_py(py), - pyo3::pyclass::CompareOp::Ne => (self != other).into_py(py), + ::pyo3::pyclass::CompareOp::Eq => (self == other).into_py(py), + ::pyo3::pyclass::CompareOp::Ne => (self != other).into_py(py), _ => py.NotImplemented(), } } diff --git a/qcs-api-client-common/src/tracing_configuration.rs b/qcs-api-client-common/src/tracing_configuration.rs index a62615d..83b4e5f 100644 --- a/qcs-api-client-common/src/tracing_configuration.rs +++ b/qcs-api-client-common/src/tracing_configuration.rs @@ -113,7 +113,7 @@ impl HeaderAttributesFilter for IncludeExclude { .get(header_name) .and_then(|header_value| header_value.to_str().ok()) { - header_attributes.push((header_name.to_string(), header_value.to_string())); + header_attributes.push((header_name.clone(), header_value.to_string())); } } header_attributes diff --git a/qcs-api-client-common/tests/client_credentials_test.rs b/qcs-api-client-common/tests/client_credentials_test.rs index e822f03..a78a33e 100644 --- a/qcs-api-client-common/tests/client_credentials_test.rs +++ b/qcs-api-client-common/tests/client_credentials_test.rs @@ -1,6 +1,6 @@ //! Client-credentials (i.e. service authorization) test -use qcs_api_client_common::configuration::{AuthServer, ClientCredentials}; +use qcs_api_client_common::configuration::{settings::AuthServer, tokens::ClientCredentials}; const VAR_NAME_ISSUER_URL: &str = "ISSUER_URL"; const VAR_NAME_CLIENT_ID: &str = "ISSUER_CLIENT_ID"; @@ -12,10 +12,10 @@ fn require_var(key: &str) -> String { #[tokio::test] async fn test_client_credentials() { - let credentials = ClientCredentials { - client_id: require_var(VAR_NAME_CLIENT_ID), - client_secret: require_var(VAR_NAME_CLIENT_SECRET), - }; + let credentials = ClientCredentials::new( + require_var(VAR_NAME_CLIENT_ID), + require_var(VAR_NAME_CLIENT_SECRET), + ); let issuer = AuthServer::new( credentials.client_id.clone(), require_var(VAR_NAME_ISSUER_URL), diff --git a/qcs-api-client-common/tests/token_refresh_test.rs b/qcs-api-client-common/tests/token_refresh_test.rs index 921190f..f531604 100644 --- a/qcs-api-client-common/tests/token_refresh_test.rs +++ b/qcs-api-client-common/tests/token_refresh_test.rs @@ -3,7 +3,8 @@ use std::time::Duration; use qcs_api_client_common::configuration::{ - ClientConfiguration, ConfigSource, SECRETS_READ_ONLY_VAR, + secrets::{SecretAccessToken, SECRETS_READ_ONLY_VAR}, + ClientConfiguration, ConfigSource, }; use time::{format_description::well_known::Rfc3339, OffsetDateTime}; use toml_edit::DocumentMut; @@ -25,7 +26,7 @@ async fn test_token_refresh() { .await .expect("Should be able to fetch recently refreshed token."); - assert_eq!(fresh_tokens.access_token().unwrap(), access_token, "Testing that a newly refreshed token is not refreshed when fetching the token immediately after, implying that JWT validation is working as expected."); + assert_eq!(fresh_tokens.access_token().unwrap(), &access_token, "Testing that a newly refreshed token is not refreshed when fetching the token immediately after, implying that JWT validation is working as expected."); tokio::time::sleep(Duration::from_secs_f64(2.0)).await; @@ -53,8 +54,13 @@ async fn test_token_refresh() { .and_then(|profile| profile.get("token_payload")) { assert_eq!( - token_payload.get("access_token").unwrap().as_str().unwrap(), - access_token + token_payload + .get("access_token") + .unwrap() + .as_str() + .map(str::to_string) + .map(SecretAccessToken::from), + Some(access_token) ); assert!( diff --git a/qcs-api-client-common/tests_py/test_configuration.py b/qcs-api-client-common/tests_py/test_configuration.py index e1a9f5a..2d3cf04 100644 --- a/qcs-api-client-common/tests_py/test_configuration.py +++ b/qcs-api-client-common/tests_py/test_configuration.py @@ -6,6 +6,8 @@ ExternallyManaged, OAuthSession, RefreshToken, + SecretAccessToken, + SecretRefreshToken, ) @@ -27,7 +29,7 @@ def test_build(self, snapshot: SnapshotAssertion): builder.quilc_url = "builder_quilc_url" builder.qvm_url = "builder_qvm_url" auth_server = AuthServer("builder_client_id", "builder_issuer") - builder.oauth_session = OAuthSession(RefreshToken("builder_refresh_token"), auth_server, "builder_access_token") + builder.oauth_session = OAuthSession(RefreshToken(SecretRefreshToken("builder_refresh_token")), auth_server, SecretAccessToken("builder_access_token")) assert builder.build() == snapshot @@ -47,10 +49,10 @@ def test_eq(self): class TestCredentials: def test_properties(self): - payload = RefreshToken("refresh") + payload = RefreshToken(SecretRefreshToken("refresh")) auth_server = AuthServer("some_client_id", "some_issuer") - credentials = OAuthSession(payload, auth_server, "access") - assert credentials.access_token == "access" + credentials = OAuthSession(payload, auth_server, SecretAccessToken("access")) + assert credentials.access_token.secret == "access" assert credentials.auth_server == auth_server assert credentials.payload == payload @@ -68,4 +70,18 @@ def refresh_function(auth_server: AuthServer): session = OAuthSession(manager, expected_auth_server) token = session.request_access_token() - assert token == "access_token_from_refresh_function" + assert token.secret == "access_token_from_refresh_function" + + +class TestSecrets: + def test_secret_access_token(self): + secret = "super_secret" + secret_access_token = SecretAccessToken(secret) + assert secret not in repr(secret_access_token) + assert secret_access_token.secret == secret + + def test_secret_refresh_token(self): + secret = "super_secret" + secret_refresh_token = SecretRefreshToken(secret) + assert secret not in repr(secret_refresh_token) + assert secret_refresh_token.secret == secret \ No newline at end of file diff --git a/qcs-api-client-grpc/CHANGELOG.md b/qcs-api-client-grpc/CHANGELOG.md index bbbd6ed..5d6ca55 100644 --- a/qcs-api-client-grpc/CHANGELOG.md +++ b/qcs-api-client-grpc/CHANGELOG.md @@ -1,3 +1,10 @@ +## 0.13.0-kstrand.0 (2025-12-18) + +### Breaking Changes + +- export Secrets and Settings structs, add secret value wrappers to help prevent accidental leakage. +- upgrade tonic (prerelease) + ## 0.12.12 (2025-12-05) ### Fixes diff --git a/qcs-api-client-grpc/Cargo.toml b/qcs-api-client-grpc/Cargo.toml index c6966a9..f725386 100644 --- a/qcs-api-client-grpc/Cargo.toml +++ b/qcs-api-client-grpc/Cargo.toml @@ -8,6 +8,9 @@ [build-dependencies.tonic-build] workspace = true + [build-dependencies.tonic-prost-build] + workspace = true + [dependencies] [dependencies.backoff] features = ['tokio'] @@ -62,8 +65,8 @@ workspace = true [dependencies.qcs-api-client-common] - path = '../qcs-api-client-common' - version = '0.12.12' + version = '0.13.0-kstrand.0' + workspace = true [dependencies.serde] workspace = true @@ -78,6 +81,9 @@ [dependencies.tonic] workspace = true + [dependencies.tonic-prost] + workspace = true + [dependencies.tonic-web] optional = true workspace = true @@ -166,4 +172,4 @@ publish = true readme = 'README.md' repository = 'https://github.com/rigetti/qcs-api-client-rust' - version = '0.12.12' + version = '0.13.0-kstrand.0' diff --git a/qcs-api-client-grpc/build.rs b/qcs-api-client-grpc/build.rs index 3585008..4a64edf 100644 --- a/qcs-api-client-grpc/build.rs +++ b/qcs-api-client-grpc/build.rs @@ -69,7 +69,7 @@ fn main() { ); config.protoc_arg("--experimental_allow_proto3_optional"); - tonic_build::configure() + tonic_prost_build::configure() .server_mod_attribute("services.controller", r#"#[cfg(feature = "server")]"#) .server_mod_attribute("services.translation", r#"#[cfg(feature = "server")]"#) .compile_with_config(config, &proto_files, &[root]) diff --git a/qcs-api-client-grpc/src/gen/models.controller.rs b/qcs-api-client-grpc/src/gen/models.controller.rs index 575fa32..419cce5 100644 --- a/qcs-api-client-grpc/src/gen/models.controller.rs +++ b/qcs-api-client-grpc/src/gen/models.controller.rs @@ -41,7 +41,7 @@ pub mod readout_values { } /// IntegerReadoutValues are integer arrays emitted by a readout receiver or transformation pipeline. /// These may include (but are not limited to) qudit values or raw ADC capture data. -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct IntegerReadoutValues { #[prost(int32, repeated, tag = "1")] pub values: ::prost::alloc::vec::Vec, @@ -54,7 +54,7 @@ pub struct Complex64ReadoutValues { } /// An EncryptedControllerJob includes the configuration necessary to execute an instance of /// the contained job data on control hardware in encrypted format. -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct EncryptedControllerJob { /// Encrypted form of ControllerJob. #[prost(bytes = "vec", tag = "1")] @@ -64,7 +64,7 @@ pub struct EncryptedControllerJob { pub encryption: ::core::option::Option, } /// Information about the means by which a ControllerJob was encrypted. -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct JobEncryption { /// Opaque identifier for the key to use in decryption #[prost(string, tag = "1")] @@ -106,13 +106,13 @@ pub mod data_value { } } /// Binary value, corresponding to both BIT and OCTET data types in Quil. -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct BinaryDataValue { #[prost(bytes = "vec", tag = "1")] pub data: ::prost::alloc::vec::Vec, } /// Signed integer value, corresponding to INTEGER in Quil. -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct IntegerDataValue { #[prost(int64, repeated, tag = "1")] pub data: ::prost::alloc::vec::Vec, diff --git a/qcs-api-client-grpc/src/gen/models.controller.serde.rs b/qcs-api-client-grpc/src/gen/models.controller.serde.rs index c6d9693..cfdde15 100644 --- a/qcs-api-client-grpc/src/gen/models.controller.serde.rs +++ b/qcs-api-client-grpc/src/gen/models.controller.serde.rs @@ -54,7 +54,7 @@ impl<'de> serde::Deserialize<'de> for BinaryDataValue { { struct GeneratedVisitor; - impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + impl serde::de::Visitor<'_> for GeneratedVisitor { type Value = GeneratedField; fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { @@ -155,7 +155,7 @@ impl<'de> serde::Deserialize<'de> for Complex64 { { struct GeneratedVisitor; - impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + impl serde::de::Visitor<'_> for GeneratedVisitor { type Value = GeneratedField; fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { @@ -259,7 +259,7 @@ impl<'de> serde::Deserialize<'de> for Complex64ReadoutValues { { struct GeneratedVisitor; - impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + impl serde::de::Visitor<'_> for GeneratedVisitor { type Value = GeneratedField; fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { @@ -390,7 +390,7 @@ impl<'de> serde::Deserialize<'de> for ControllerJobExecutionResult { { struct GeneratedVisitor; - impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + impl serde::de::Visitor<'_> for GeneratedVisitor { type Value = GeneratedField; fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { @@ -516,7 +516,7 @@ impl<'de> serde::Deserialize<'de> for controller_job_execution_result::Status { struct GeneratedVisitor; - impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + impl serde::de::Visitor<'_> for GeneratedVisitor { type Value = controller_job_execution_result::Status; fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { @@ -617,7 +617,7 @@ impl<'de> serde::Deserialize<'de> for DataValue { { struct GeneratedVisitor; - impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + impl serde::de::Visitor<'_> for GeneratedVisitor { type Value = GeneratedField; fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { @@ -735,7 +735,7 @@ impl<'de> serde::Deserialize<'de> for EncryptedControllerJob { { struct GeneratedVisitor; - impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + impl serde::de::Visitor<'_> for GeneratedVisitor { type Value = GeneratedField; fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { @@ -837,7 +837,7 @@ impl<'de> serde::Deserialize<'de> for IntegerDataValue { { struct GeneratedVisitor; - impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + impl serde::de::Visitor<'_> for GeneratedVisitor { type Value = GeneratedField; fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { @@ -931,7 +931,7 @@ impl<'de> serde::Deserialize<'de> for IntegerReadoutValues { { struct GeneratedVisitor; - impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + impl serde::de::Visitor<'_> for GeneratedVisitor { type Value = GeneratedField; fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { @@ -1036,7 +1036,7 @@ impl<'de> serde::Deserialize<'de> for JobEncryption { { struct GeneratedVisitor; - impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + impl serde::de::Visitor<'_> for GeneratedVisitor { type Value = GeneratedField; fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { @@ -1139,7 +1139,7 @@ impl<'de> serde::Deserialize<'de> for JobExecutionConfiguration { { struct GeneratedVisitor; - impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + impl serde::de::Visitor<'_> for GeneratedVisitor { type Value = GeneratedField; fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { @@ -1243,7 +1243,7 @@ impl<'de> serde::Deserialize<'de> for ReadoutValues { { struct GeneratedVisitor; - impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + impl serde::de::Visitor<'_> for GeneratedVisitor { type Value = GeneratedField; fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { @@ -1343,7 +1343,7 @@ impl<'de> serde::Deserialize<'de> for RealDataValue { { struct GeneratedVisitor; - impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + impl serde::de::Visitor<'_> for GeneratedVisitor { type Value = GeneratedField; fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { diff --git a/qcs-api-client-grpc/src/gen/models.translation.serde.rs b/qcs-api-client-grpc/src/gen/models.translation.serde.rs index b77d3a4..8075a68 100644 --- a/qcs-api-client-grpc/src/gen/models.translation.serde.rs +++ b/qcs-api-client-grpc/src/gen/models.translation.serde.rs @@ -53,7 +53,7 @@ impl<'de> serde::Deserialize<'de> for QuilTranslationMetadata { { struct GeneratedVisitor; - impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + impl serde::de::Visitor<'_> for GeneratedVisitor { type Value = GeneratedField; fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { diff --git a/qcs-api-client-grpc/src/gen/services.controller.rs b/qcs-api-client-grpc/src/gen/services.controller.rs index a8b63c5..7f375e9 100644 --- a/qcs-api-client-grpc/src/gen/services.controller.rs +++ b/qcs-api-client-grpc/src/gen/services.controller.rs @@ -56,13 +56,13 @@ pub struct ExecuteControllerJobRequest { /// Nested message and enum types in `ExecuteControllerJobRequest`. pub mod execute_controller_job_request { #[derive(serde::Deserialize)] - #[derive(Clone, PartialEq, ::prost::Oneof)] + #[derive(Clone, PartialEq, Eq, Hash, ::prost::Oneof)] pub enum Job { #[prost(message, tag = "201")] Encrypted(super::super::super::models::controller::EncryptedControllerJob), } /// Required by the gateway to forward requests to the correct execution host. - #[derive(Clone, PartialEq, ::prost::Oneof)] + #[derive(Clone, PartialEq, Eq, Hash, ::prost::Oneof)] pub enum Target { #[prost(string, tag = "101")] QuantumProcessorId(::prost::alloc::string::String), @@ -71,7 +71,7 @@ pub mod execute_controller_job_request { } } /// Options specified on execution requests describing any features or processes requested before or after job execution. -#[derive(Clone, Copy, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] pub struct ExecutionOptions { /// If jobs contain settings that would cause managed settings to change values, /// that job will be rejected unless this field is set to true and the submitter has the appropriate authorization. @@ -88,13 +88,13 @@ pub struct ExecutionOptions { #[prost(message, optional, tag = "4")] pub timeout: ::core::option::Option<::pbjson_types::Duration>, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct ExecuteControllerJobResponse { /// One execution ID per input JobExecutionConfiguration, in the same order as the input. #[prost(string, repeated, tag = "1")] pub job_execution_ids: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct GetControllerJobResultsRequest { /// Which Controller Job execution to query for results #[prost(string, tag = "1")] @@ -106,7 +106,7 @@ pub struct GetControllerJobResultsRequest { /// Nested message and enum types in `GetControllerJobResultsRequest`. pub mod get_controller_job_results_request { /// Required by the gateway to forward requests to the correct execution host. - #[derive(Clone, PartialEq, ::prost::Oneof)] + #[derive(Clone, PartialEq, Eq, Hash, ::prost::Oneof)] pub enum Target { #[prost(string, tag = "101")] QuantumProcessorId(::prost::alloc::string::String), @@ -129,7 +129,7 @@ pub struct GetControllerJobResultsResponse { /// Success response indicates only that the request was received. Cancellation /// is not guaranteed, as it is based on job state at time of cancellation, and is /// completed on a best-effort basis. -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct CancelControllerJobsRequest { #[prost(string, repeated, tag = "1")] pub job_ids: ::prost::alloc::vec::Vec<::prost::alloc::string::String>, @@ -140,7 +140,7 @@ pub struct CancelControllerJobsRequest { /// Nested message and enum types in `CancelControllerJobsRequest`. pub mod cancel_controller_jobs_request { /// Required by ConServ gateway to forward requests to the correct rackhost. - #[derive(Clone, PartialEq, ::prost::Oneof)] + #[derive(Clone, PartialEq, Eq, Hash, ::prost::Oneof)] pub enum Target { #[prost(string, tag = "101")] QuantumProcessorId(::prost::alloc::string::String), @@ -148,9 +148,9 @@ pub mod cancel_controller_jobs_request { EndpointId(::prost::alloc::string::String), } } -#[derive(Clone, Copy, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] pub struct CancelControllerJobsResponse {} -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct GetControllerJobStatusRequest { #[prost(string, tag = "1")] pub job_id: ::prost::alloc::string::String, @@ -161,7 +161,7 @@ pub struct GetControllerJobStatusRequest { /// Nested message and enum types in `GetControllerJobStatusRequest`. pub mod get_controller_job_status_request { /// Required by ConServ gateway to forward requests to the correct rackhost. - #[derive(Clone, PartialEq, ::prost::Oneof)] + #[derive(Clone, PartialEq, Eq, Hash, ::prost::Oneof)] pub enum Target { #[prost(string, tag = "101")] QuantumProcessorId(::prost::alloc::string::String), @@ -169,7 +169,7 @@ pub mod get_controller_job_status_request { EndpointId(::prost::alloc::string::String), } } -#[derive(Clone, Copy, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] pub struct GetControllerJobStatusResponse { #[prost(enumeration = "get_controller_job_status_response::Status", tag = "1")] pub status: i32, @@ -240,7 +240,7 @@ pub mod get_controller_job_status_response { } /// An estimation of the delay before a specific event, such as when a queued job /// is expected to be dequeued and run. -#[derive(Clone, Copy, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] pub struct EstimatedDelay { /// Our most optimistic estimate of the delay before the event (will always be the lowest duration in /// this message) @@ -282,7 +282,7 @@ pub mod controller_client { } impl ControllerClient where - T: tonic::client::GrpcService, + T: tonic::client::GrpcService, T::Error: Into, T::ResponseBody: Body + std::marker::Send + 'static, ::Error: Into + std::marker::Send, @@ -303,13 +303,13 @@ pub mod controller_client { F: tonic::service::Interceptor, T::ResponseBody: Default, T: tonic::codegen::Service< - http::Request, + http::Request, Response = http::Response< - >::ResponseBody, + >::ResponseBody, >, >, , + http::Request, >>::Error: Into + std::marker::Send + std::marker::Sync, { ControllerClient::new(InterceptedService::new(inner, interceptor)) @@ -360,7 +360,7 @@ pub mod controller_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/services.controller.Controller/ExecuteControllerJob", ); @@ -389,7 +389,7 @@ pub mod controller_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/services.controller.Controller/BatchExecuteControllerJobs", ); @@ -418,7 +418,7 @@ pub mod controller_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/services.controller.Controller/GetControllerJobResults", ); @@ -447,7 +447,7 @@ pub mod controller_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/services.controller.Controller/CancelControllerJobs", ); @@ -476,7 +476,7 @@ pub mod controller_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/services.controller.Controller/GetControllerJobStatus", ); @@ -607,7 +607,7 @@ pub mod controller_server { B: Body + std::marker::Send + 'static, B::Error: Into + std::marker::Send + 'static, { - type Response = http::Response; + type Response = http::Response; type Error = std::convert::Infallible; type Future = BoxFuture; fn poll_ready( @@ -649,7 +649,7 @@ pub mod controller_server { let inner = self.inner.clone(); let fut = async move { let method = ExecuteControllerJobSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -701,7 +701,7 @@ pub mod controller_server { let inner = self.inner.clone(); let fut = async move { let method = BatchExecuteControllerJobsSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -752,7 +752,7 @@ pub mod controller_server { let inner = self.inner.clone(); let fut = async move { let method = GetControllerJobResultsSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -798,7 +798,7 @@ pub mod controller_server { let inner = self.inner.clone(); let fut = async move { let method = CancelControllerJobsSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -847,7 +847,7 @@ pub mod controller_server { let inner = self.inner.clone(); let fut = async move { let method = GetControllerJobStatusSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -864,7 +864,9 @@ pub mod controller_server { } _ => { Box::pin(async move { - let mut response = http::Response::new(empty_body()); + let mut response = http::Response::new( + tonic::body::Body::default(), + ); let headers = response.headers_mut(); headers .insert( diff --git a/qcs-api-client-grpc/src/gen/services.controller.serde.rs b/qcs-api-client-grpc/src/gen/services.controller.serde.rs index ea571d4..9a45b34 100644 --- a/qcs-api-client-grpc/src/gen/services.controller.serde.rs +++ b/qcs-api-client-grpc/src/gen/services.controller.serde.rs @@ -52,7 +52,7 @@ impl<'de> serde::Deserialize<'de> for BatchExecuteControllerJobsRequest { { struct GeneratedVisitor; - impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + impl serde::de::Visitor<'_> for GeneratedVisitor { type Value = GeneratedField; fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { @@ -143,7 +143,7 @@ impl<'de> serde::Deserialize<'de> for BatchExecuteControllerJobsResponse { { struct GeneratedVisitor; - impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + impl serde::de::Visitor<'_> for GeneratedVisitor { type Value = GeneratedField; fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { @@ -254,7 +254,7 @@ impl<'de> serde::Deserialize<'de> for CancelControllerJobsRequest { { struct GeneratedVisitor; - impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + impl serde::de::Visitor<'_> for GeneratedVisitor { type Value = GeneratedField; fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { @@ -353,7 +353,7 @@ impl<'de> serde::Deserialize<'de> for CancelControllerJobsResponse { { struct GeneratedVisitor; - impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + impl serde::de::Visitor<'_> for GeneratedVisitor { type Value = GeneratedField; fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { @@ -448,7 +448,7 @@ impl<'de> serde::Deserialize<'de> for EstimatedDelay { { struct GeneratedVisitor; - impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + impl serde::de::Visitor<'_> for GeneratedVisitor { type Value = GeneratedField; fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { @@ -597,7 +597,7 @@ impl<'de> serde::Deserialize<'de> for ExecuteControllerJobRequest { { struct GeneratedVisitor; - impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + impl serde::de::Visitor<'_> for GeneratedVisitor { type Value = GeneratedField; fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { @@ -724,7 +724,7 @@ impl<'de> serde::Deserialize<'de> for ExecuteControllerJobResponse { { struct GeneratedVisitor; - impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + impl serde::de::Visitor<'_> for GeneratedVisitor { type Value = GeneratedField; fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { @@ -824,7 +824,7 @@ impl<'de> serde::Deserialize<'de> for ExecutionOptions { { struct GeneratedVisitor; - impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + impl serde::de::Visitor<'_> for GeneratedVisitor { type Value = GeneratedField; fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { @@ -944,7 +944,7 @@ impl<'de> serde::Deserialize<'de> for GetControllerJobResultsRequest { { struct GeneratedVisitor; - impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + impl serde::de::Visitor<'_> for GeneratedVisitor { type Value = GeneratedField; fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { @@ -1051,7 +1051,7 @@ impl<'de> serde::Deserialize<'de> for GetControllerJobResultsResponse { { struct GeneratedVisitor; - impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + impl serde::de::Visitor<'_> for GeneratedVisitor { type Value = GeneratedField; fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { @@ -1162,7 +1162,7 @@ impl<'de> serde::Deserialize<'de> for GetControllerJobStatusRequest { { struct GeneratedVisitor; - impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + impl serde::de::Visitor<'_> for GeneratedVisitor { type Value = GeneratedField; fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { @@ -1280,7 +1280,7 @@ impl<'de> serde::Deserialize<'de> for GetControllerJobStatusResponse { { struct GeneratedVisitor; - impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + impl serde::de::Visitor<'_> for GeneratedVisitor { type Value = GeneratedField; fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { @@ -1377,7 +1377,7 @@ impl<'de> serde::Deserialize<'de> for get_controller_job_status_response::Status struct GeneratedVisitor; - impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + impl serde::de::Visitor<'_> for GeneratedVisitor { type Value = get_controller_job_status_response::Status; fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { diff --git a/qcs-api-client-grpc/src/gen/services.translation.rs b/qcs-api-client-grpc/src/gen/services.translation.rs index 34d1da6..50be015 100644 --- a/qcs-api-client-grpc/src/gen/services.translation.rs +++ b/qcs-api-client-grpc/src/gen/services.translation.rs @@ -34,7 +34,7 @@ pub struct TranslationOptions { } /// Nested message and enum types in `TranslationOptions`. pub mod translation_options { - #[derive(Clone, Copy, PartialEq, ::prost::Message)] + #[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] pub struct QCtrl { /// Indicates whether Q-CTRL pre-processing should consider the set of /// program qubits to be fixed. If true, Q-CTRL may only remap qubits to @@ -74,7 +74,7 @@ pub mod translation_options { } } /// Options for translation backend V1 -#[derive(Clone, Copy, PartialEq, ::prost::Message)] +#[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] pub struct BackendV1Options {} /// Options for translation backend V2 #[derive(Clone, Copy, PartialEq, ::prost::Message)] @@ -117,7 +117,7 @@ pub struct TranslateQuilToEncryptedControllerJobRequest { } /// Nested message and enum types in `TranslateQuilToEncryptedControllerJobRequest`. pub mod translate_quil_to_encrypted_controller_job_request { - #[derive(Clone, Copy, PartialEq, ::prost::Oneof)] + #[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Oneof)] pub enum NumShots { #[prost(uint32, tag = "3")] NumShotsValue(u32), @@ -134,13 +134,13 @@ pub struct TranslateQuilToEncryptedControllerJobResponse { super::super::models::translation::QuilTranslationMetadata, >, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct QuantumProcessorQuilCalibrationProgram { /// The Quil program containing the requested calibrations #[prost(string, tag = "1")] pub quil_calibration_program: ::prost::alloc::string::String, } -#[derive(Clone, PartialEq, ::prost::Message)] +#[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] pub struct GetQuantumProcessorQuilCalibrationProgramRequest { /// The quantum processor for which to retrieve the calibration program. #[prost(string, tag = "1")] @@ -174,7 +174,7 @@ pub mod translation_client { } impl TranslationClient where - T: tonic::client::GrpcService, + T: tonic::client::GrpcService, T::Error: Into, T::ResponseBody: Body + std::marker::Send + 'static, ::Error: Into + std::marker::Send, @@ -195,13 +195,13 @@ pub mod translation_client { F: tonic::service::Interceptor, T::ResponseBody: Default, T: tonic::codegen::Service< - http::Request, + http::Request, Response = http::Response< - >::ResponseBody, + >::ResponseBody, >, >, , + http::Request, >>::Error: Into + std::marker::Send + std::marker::Sync, { TranslationClient::new(InterceptedService::new(inner, interceptor)) @@ -254,7 +254,7 @@ pub mod translation_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/services.translation.Translation/TranslateQuilToEncryptedControllerJob", ); @@ -286,7 +286,7 @@ pub mod translation_client { format!("Service was not ready: {}", e.into()), ) })?; - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let path = http::uri::PathAndQuery::from_static( "/services.translation.Translation/GetQuantumProcessorQuilCalibrationProgram", ); @@ -399,7 +399,7 @@ pub mod translation_server { B: Body + std::marker::Send + 'static, B::Error: Into + std::marker::Send + 'static, { - type Response = http::Response; + type Response = http::Response; type Error = std::convert::Infallible; type Future = BoxFuture; fn poll_ready( @@ -449,7 +449,7 @@ pub mod translation_server { let inner = self.inner.clone(); let fut = async move { let method = TranslateQuilToEncryptedControllerJobSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -503,7 +503,7 @@ pub mod translation_server { let inner = self.inner.clone(); let fut = async move { let method = GetQuantumProcessorQuilCalibrationProgramSvc(inner); - let codec = tonic::codec::ProstCodec::default(); + let codec = tonic_prost::ProstCodec::default(); let mut grpc = tonic::server::Grpc::new(codec) .apply_compression_config( accept_compression_encodings, @@ -520,7 +520,9 @@ pub mod translation_server { } _ => { Box::pin(async move { - let mut response = http::Response::new(empty_body()); + let mut response = http::Response::new( + tonic::body::Body::default(), + ); let headers = response.headers_mut(); headers .insert( diff --git a/qcs-api-client-grpc/src/gen/services.translation.serde.rs b/qcs-api-client-grpc/src/gen/services.translation.serde.rs index 55a2175..6c883dc 100644 --- a/qcs-api-client-grpc/src/gen/services.translation.serde.rs +++ b/qcs-api-client-grpc/src/gen/services.translation.serde.rs @@ -44,7 +44,7 @@ impl<'de> serde::Deserialize<'de> for BackendV1Options { { struct GeneratedVisitor; - impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + impl serde::de::Visitor<'_> for GeneratedVisitor { type Value = GeneratedField; fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { @@ -160,7 +160,7 @@ impl<'de> serde::Deserialize<'de> for BackendV2Options { { struct GeneratedVisitor; - impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + impl serde::de::Visitor<'_> for GeneratedVisitor { type Value = GeneratedField; fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { @@ -290,7 +290,7 @@ impl<'de> serde::Deserialize<'de> for GetQuantumProcessorQuilCalibrationProgramR { struct GeneratedVisitor; - impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + impl serde::de::Visitor<'_> for GeneratedVisitor { type Value = GeneratedField; fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { @@ -382,7 +382,7 @@ impl<'de> serde::Deserialize<'de> for QuantumProcessorQuilCalibrationProgram { { struct GeneratedVisitor; - impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + impl serde::de::Visitor<'_> for GeneratedVisitor { type Value = GeneratedField; fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { @@ -504,7 +504,7 @@ impl<'de> serde::Deserialize<'de> for TranslateQuilToEncryptedControllerJobReque { struct GeneratedVisitor; - impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + impl serde::de::Visitor<'_> for GeneratedVisitor { type Value = GeneratedField; fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { @@ -630,7 +630,7 @@ impl<'de> serde::Deserialize<'de> for TranslateQuilToEncryptedControllerJobRespo { struct GeneratedVisitor; - impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + impl serde::de::Visitor<'_> for GeneratedVisitor { type Value = GeneratedField; fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { @@ -756,7 +756,7 @@ impl<'de> serde::Deserialize<'de> for TranslationOptions { { struct GeneratedVisitor; - impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + impl serde::de::Visitor<'_> for GeneratedVisitor { type Value = GeneratedField; fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { @@ -875,7 +875,7 @@ impl<'de> serde::Deserialize<'de> for translation_options::QCtrl { { struct GeneratedVisitor; - impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + impl serde::de::Visitor<'_> for GeneratedVisitor { type Value = GeneratedField; fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { @@ -980,7 +980,7 @@ impl<'de> serde::Deserialize<'de> for translation_options::Riverlane { { struct GeneratedVisitor; - impl<'de> serde::de::Visitor<'de> for GeneratedVisitor { + impl serde::de::Visitor<'_> for GeneratedVisitor { type Value = GeneratedField; fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { diff --git a/qcs-api-client-grpc/src/tonic/channel.rs b/qcs-api-client-grpc/src/tonic/channel.rs index 1c539a1..6f94f8f 100644 --- a/qcs-api-client-grpc/src/tonic/channel.rs +++ b/qcs-api-client-grpc/src/tonic/channel.rs @@ -3,13 +3,13 @@ //! The [`ChannelBuilder`] is the primary entry point for configuring a gRPC channel. use std::time::Duration; +use super::BoxBody; use backoff::ExponentialBackoff; use http::{uri::InvalidUri, Uri}; use hyper_proxy2::{Intercept, Proxy, ProxyConnector}; use hyper_socks2::{Auth, SocksConnector}; use hyper_util::client::legacy::connect::HttpConnector; use tonic::{ - body::BoxBody, client::GrpcService, transport::{Channel, ClientTlsConfig, Endpoint}, }; @@ -18,7 +18,7 @@ use url::Url; use qcs_api_client_common::{ backoff::{self, default_backoff}, - configuration::{ClientConfiguration, LoadError, TokenError, TokenRefresher}, + configuration::{tokens::TokenRefresher, ClientConfiguration, LoadError, TokenError}, }; #[cfg(feature = "tracing")] @@ -316,6 +316,7 @@ where /// # Errors /// /// Returns a [`ChannelError`] if the service cannot be built. + #[allow(clippy::result_large_err)] pub fn build(self) -> Result { let channel = get_channel_with_endpoint(&self.endpoint)?; #[cfg(feature = "tracing")] @@ -336,6 +337,7 @@ where /// # Errors /// /// [`Error::InvalidUri`] if the string is an invalid URI. +#[allow(clippy::result_large_err)] pub fn parse_uri(s: &str) -> Result> { s.parse().map_err(Error::from) } @@ -400,6 +402,7 @@ fn get_uri_socks_auth(uri: &Uri) -> Result, url::ParseError> { /// # Errors /// /// See [`ChannelError`]. +#[allow(clippy::result_large_err)] pub fn get_channel(uri: Uri) -> Result { let endpoint = get_endpoint(uri); get_channel_with_endpoint(&endpoint) @@ -421,6 +424,7 @@ pub fn get_channel(uri: Uri) -> Result { /// # Errors /// /// See [`ChannelError`]. +#[allow(clippy::result_large_err)] pub fn get_channel_with_timeout( uri: Uri, timeout: Option, @@ -447,7 +451,11 @@ pub fn get_channel_with_timeout( /// # Errors /// /// Returns a [`ChannelError`] if the channel cannot be constructed. -#[allow(clippy::similar_names)] // http(s)_proxy are similar but precise in this case. +#[allow( + clippy::similar_names, + reason = "http(s)_proxy are similar but precise in this case" +)] +#[allow(clippy::result_large_err)] pub fn get_channel_with_endpoint(endpoint: &Endpoint) -> Result { let https_proxy = get_env_uri("HTTPS_PROXY")?; let http_proxy = get_env_uri("HTTP_PROXY")?; @@ -521,6 +529,7 @@ pub fn get_channel_with_endpoint(endpoint: &Endpoint) -> Result Result, Error> { @@ -562,6 +571,7 @@ where /// # Errors /// /// See [`Error`] +#[allow(clippy::result_large_err)] pub fn wrap_channel( channel: C, ) -> Result, Error> @@ -578,6 +588,7 @@ where /// # Errors /// /// See [`Error`] +#[allow(clippy::result_large_err)] pub fn wrap_channel_with_profile( channel: C, profile: String, diff --git a/qcs-api-client-grpc/src/tonic/grpc_web.rs b/qcs-api-client-grpc/src/tonic/grpc_web.rs index 7656f95..5580e55 100644 --- a/qcs-api-client-grpc/src/tonic/grpc_web.rs +++ b/qcs-api-client-grpc/src/tonic/grpc_web.rs @@ -12,10 +12,10 @@ // See the License for the specific language governing permissions and // limitations under the License. +use super::BoxBody; use std::future::Future; use std::pin::Pin; use std::task::{Context, Poll}; -use tonic::body::BoxBody; use tonic::client::GrpcService; use tonic::codegen::http::{Request, Response}; use tonic_web::{GrpcWebCall, GrpcWebClientService}; diff --git a/qcs-api-client-grpc/src/tonic/mod.rs b/qcs-api-client-grpc/src/tonic/mod.rs index 3474f1d..68efe52 100644 --- a/qcs-api-client-grpc/src/tonic/mod.rs +++ b/qcs-api-client-grpc/src/tonic/mod.rs @@ -4,9 +4,11 @@ use std::convert::Infallible; /// use futures_util::pin_mut; use http::Request; -use http_body::Body; +use http_body::Body as HttpBody; use http_body_util::BodyExt; -use tonic::body::BoxBody; + +/// Re-export tonic's Body type as BoxBody for compatibility +pub type BoxBody = tonic::body::Body; mod channel; mod common; @@ -26,7 +28,6 @@ pub use refresh::*; pub use retry::*; #[cfg(feature = "tracing")] pub use trace::*; - /// An error observed while duplicating a request body. This may be returned by any /// [`tower::Service`] that duplicates a request body for the purpose of retrying a request. #[derive(Debug, thiserror::Error)] @@ -59,8 +60,8 @@ type RequestBodyDuplicationResult = Result; /// (i.e. the stream cannot contain any trailers); if a trailer frame is found, /// the cancelled status will be returned. async fn build_duplicate_frame_bytes( - mut request: Request, -) -> RequestBodyDuplicationResult<(tonic::body::BoxBody, tonic::body::BoxBody)> { + mut request: Request, +) -> RequestBodyDuplicationResult<(tonic::body::Body, tonic::body::Body)> { let mut bytes = Vec::new(); let body = request.body_mut(); @@ -77,8 +78,8 @@ async fn build_duplicate_frame_bytes( let bytes = http_body_util::Full::from(bytes) .map_err(|_: Infallible| -> tonic::Status { unreachable!() }); Ok(( - tonic::body::BoxBody::new(bytes.clone()), - tonic::body::BoxBody::new(bytes), + tonic::body::Body::new(bytes.clone()), + tonic::body::Body::new(bytes), )) } @@ -98,8 +99,8 @@ async fn build_duplicate_request( .version(req.version()); for (key, val) in req.headers() { - builder_1 = builder_1.header(key.clone(), val.clone()); - builder_2 = builder_2.header(key.clone(), val.clone()); + builder_1 = builder_1.header(key, val); + builder_2 = builder_2.header(key, val); } let (body_1, body_2) = build_duplicate_frame_bytes(req).await?; @@ -198,17 +199,20 @@ pub(crate) mod uds_grpc_stream { /// /// See [`Error`]. #[allow(clippy::significant_drop_tightening)] - pub async fn serve(service: S, f: F) -> Result<(), Error> + pub async fn serve(service: S, f: F) -> Result<(), Error> where S: tower::Service< - http::Request, - Response = http::Response, + http::Request, + Response = http::Response, Error = Infallible, > + NamedService + Clone + Send + + Sync + 'static, - S::Future: Send, + S::Future: Send + 'static, + B: http_body::Body + Send + 'static, + B::Error: Into> + Send + Sync, F: FnOnce(Channel) -> R + Send, R: std::future::Future + Send, { @@ -238,6 +242,8 @@ mod otel_tests { use opentelemetry::trace::{TraceContextExt, TraceId}; use opentelemetry_http::HeaderExtractor; use opentelemetry_sdk::propagation::TraceContextPropagator; + use qcs_api_client_common::configuration::secrets::{SecretAccessToken, SecretRefreshToken}; + use qcs_api_client_common::configuration::tokens::RefreshToken; use serde::{Deserialize, Serialize}; use std::time::{Duration, SystemTime}; use tonic::codegen::http::{HeaderMap, HeaderValue}; @@ -249,7 +255,7 @@ mod otel_tests { use crate::tonic::{uds_grpc_stream, wrap_channel_with_tracing}; use qcs_api_client_common::configuration::ClientConfiguration; - use qcs_api_client_common::configuration::{AuthServer, OAuthSession, RefreshToken}; + use qcs_api_client_common::configuration::{settings::AuthServer, tokens::OAuthSession}; static HEALTH_CHECK_PATH: &str = "/grpc.health.v1.Health/Check"; @@ -266,7 +272,7 @@ mod otel_tests { let client_config = ClientConfiguration::builder() .tracing_configuration(Some(tracing_configuration)) .oauth_session(Some(OAuthSession::from_refresh_token( - RefreshToken::new("refresh_token".to_string()), + RefreshToken::new(SecretRefreshToken::from("refresh_token")), AuthServer::default(), Some(create_jwt()), ))) @@ -285,7 +291,7 @@ mod otel_tests { let client_config = ClientConfiguration::builder() .tracing_configuration(Some(tracing_configuration)) .oauth_session(Some(OAuthSession::from_refresh_token( - RefreshToken::new("refresh_token".to_string()), + RefreshToken::new(SecretRefreshToken::from("refresh_token")), AuthServer::default(), Some(create_jwt()), ))) @@ -313,7 +319,7 @@ mod otel_tests { let client_config = ClientConfiguration::builder() .tracing_configuration(Some(tracing_configuration)) .oauth_session(Some(OAuthSession::from_refresh_token( - RefreshToken::new("refresh_token".to_string()), + RefreshToken::new(SecretRefreshToken::from("refresh_token")), AuthServer::default(), Some(create_jwt()), ))) @@ -331,7 +337,7 @@ mod otel_tests { let propagate_otel_context = client_configuration.tracing_configuration().is_some_and( qcs_api_client_common::tracing_configuration::TracingConfiguration::propagate_otel_context, ); - let spans = tracing_test::start( + let spans: Vec = tracing_test::start( "test_trace_id_propagation", |trace_id, _span_id| async move { let sleepy_health_service = SleepyHealthService { @@ -411,7 +417,7 @@ mod otel_tests { let client_config = ClientConfiguration::builder() .tracing_configuration(Some(tracing_configuration)) .oauth_session(Some(OAuthSession::from_refresh_token( - RefreshToken::new("refresh_token".to_string()), + RefreshToken::new(SecretRefreshToken::from("refresh_token")), AuthServer::default(), Some(create_jwt()), ))) @@ -427,7 +433,7 @@ mod otel_tests { async fn assert_grpc_health_check_not_traced(client_configuration: ClientConfiguration) { use opentelemetry::trace::FutureExt; - let spans = + let spans: Vec = tracing_test::start("test_tracing_disabled", |_trace_id, _span_id| async move { let interceptor = validate_otel_context_not_propagated; let health_server = HealthServer::with_interceptor( @@ -476,7 +482,7 @@ mod otel_tests { /// Create an HS256 signed JWT token with sub and exp claims. This is good enough to pass the /// [`RefreshService`] token validation. - pub(crate) fn create_jwt() -> String { + pub(crate) fn create_jwt() -> SecretAccessToken { use jsonwebtoken::{encode, Algorithm, EncodingKey, Header}; let expiration = SystemTime::now() .checked_add(Duration::from_secs(60)) @@ -492,7 +498,9 @@ mod otel_tests { // The client doesn't check the signature, so for convenience here, we just sign with HS256 // instead of RS256. let header = Header::new(Algorithm::HS256); - encode(&header, &claims, &EncodingKey::from_secret(JWT_SECRET)).unwrap() + encode(&header, &claims, &EncodingKey::from_secret(JWT_SECRET)) + .map(SecretAccessToken::from) + .unwrap() } #[derive(Debug, thiserror::Error)] @@ -512,6 +520,7 @@ mod otel_tests { /// Given an incoming gRPC request, validate that the the specified [`TraceId`] is propagated /// via the `traceparent` metadata header. + #[allow(clippy::result_large_err)] fn validate_trace_id_propagated( trace_id: TraceId, req: Request<()>, @@ -558,6 +567,7 @@ mod otel_tests { /// Simply validate that the `traceparent` and `tracestate` metadata headers are not present /// on the incoming gRPC. + #[allow(clippy::result_large_err)] fn validate_otel_context_not_propagated( req: Request<()>, ) -> Result, tonic::Status> { @@ -620,11 +630,10 @@ mod otel_tests { use futures_util::Future; use opentelemetry::global::BoxedTracer; use opentelemetry::trace::{ - mark_span_as_active, FutureExt, Span, SpanId, TraceId, TraceResult, Tracer, - TracerProvider, + mark_span_as_active, FutureExt, Span, SpanId, TraceId, Tracer, TracerProvider, }; - use opentelemetry_sdk::export::trace::SpanData; - use opentelemetry_sdk::trace::SpanProcessor; + use opentelemetry_sdk::error::OTelSdkError; + use opentelemetry_sdk::trace::{SpanData, SpanProcessor}; use std::collections::HashMap; use std::sync::{Arc, RwLock}; @@ -656,7 +665,7 @@ mod otel_tests { cache.notified(span_id).await?; // remove and return the spans processed for this test. - let mut data = cache.data.write().map_err(|e| e.to_string())?; + let mut data = cache.data.write().map_err(|e| format!("{e:?}"))?; Ok(data.remove(&trace_id).unwrap_or_default()) } @@ -676,7 +685,7 @@ mod otel_tests { CACHE.get_or_init(|| { let processor = Self::default(); - let provider = opentelemetry_sdk::trace::TracerProvider::builder() + let provider = opentelemetry_sdk::trace::SdkTracerProvider::builder() .with_span_processor(processor.clone()) .build(); opentelemetry::global::set_tracer_provider(provider.clone()); @@ -695,7 +704,7 @@ mod otel_tests { let notify = Arc::new(tokio::sync::Notify::new()); self.notifications .write() - .map_err(|e| e.to_string())? + .map_err(|e| format!("{e:?}"))? .insert(span_id, notify); Ok(()) } @@ -730,11 +739,7 @@ mod otel_tests { .data .write() .expect("failed to write access cache span data"); - if let Some(spans) = data.get_mut(&trace_id) { - spans.push(span); - } else { - data.insert(trace_id, vec![span]); - } + data.entry(trace_id).or_default().push(span); } if let Some(notify) = self @@ -748,11 +753,18 @@ mod otel_tests { } /// This is a no-op because spans are processed synchronously in `on_end`. - fn force_flush(&self) -> TraceResult<()> { + fn force_flush(&self) -> Result<(), OTelSdkError> { Ok(()) } - fn shutdown(&self) -> TraceResult<()> { + fn shutdown(&self) -> Result<(), OTelSdkError> { + Ok(()) + } + + fn shutdown_with_timeout( + &self, + _timeout: std::time::Duration, + ) -> Result<(), OTelSdkError> { Ok(()) } } diff --git a/qcs-api-client-grpc/src/tonic/refresh.rs b/qcs-api-client-grpc/src/tonic/refresh.rs index 7fabe6b..f2ec07f 100644 --- a/qcs-api-client-grpc/src/tonic/refresh.rs +++ b/qcs-api-client-grpc/src/tonic/refresh.rs @@ -4,15 +4,17 @@ use std::{ task::{Context, Poll}, }; +use super::BoxBody; use http::StatusCode; use tonic::{ - body::BoxBody, client::GrpcService, codegen::http::{Request, Response}, }; use tower::Layer; -use qcs_api_client_common::configuration::{ClientConfiguration, TokenError, TokenRefresher}; +use qcs_api_client_common::configuration::{ + secrets::SecretAccessToken, tokens::TokenRefresher, ClientConfiguration, TokenError, +}; use super::error::Error; @@ -44,6 +46,7 @@ impl RefreshLayer { /// # Errors /// /// Will fail with error if loading the [`ClientConfiguration`] fails. + #[allow(clippy::result_large_err)] pub fn new() -> Result> { let config = ClientConfiguration::load_default()?; Ok(Self::with_config(config)) @@ -54,6 +57,7 @@ impl RefreshLayer { /// # Errors /// /// Will fail if loading the [`ClientConfiguration`] fails. + #[allow(clippy::result_large_err)] pub fn with_profile(profile: String) -> Result> { let config = ClientConfiguration::load_profile(profile)?; Ok(Self::with_config(config)) @@ -162,7 +166,7 @@ where } // Ensure that the service is ready before trying to use it. // Failure to do this *will* cause a panic. - poll_fn(|cx| channel.poll_ready(cx)) + poll_fn(|cx| -> Poll> { channel.poll_ready(cx) }) .await .map_err(super::error::Error::from)?; make_request(&mut channel, retry_req, token).await @@ -174,7 +178,7 @@ where async fn make_request( service: &mut C, mut request: Request, - token: String, + access_token: SecretAccessToken, ) -> Result>::ResponseBody>, Error> where C: GrpcService + Send, @@ -182,7 +186,7 @@ where >::Future: Send, Error: From, { - let header_val = format!("Bearer {token}") + let header_val = format!("Bearer {}", access_token.secret()) .try_into() .map_err(Error::InvalidAccessToken)?; request.headers_mut().insert("authorization", header_val); diff --git a/qcs-api-client-grpc/src/tonic/retry.rs b/qcs-api-client-grpc/src/tonic/retry.rs index b359802..68df80e 100644 --- a/qcs-api-client-grpc/src/tonic/retry.rs +++ b/qcs-api-client-grpc/src/tonic/retry.rs @@ -1,9 +1,10 @@ +use super::BoxBody; use http::{HeaderValue, Request, Response}; use qcs_api_client_common::{ backoff::{self, backoff::Backoff, ExponentialBackoff}, configuration::TokenError, }; -use tonic::{body::BoxBody, client::GrpcService, Status}; +use tonic::{client::GrpcService, Status}; use qcs_api_client_common::backoff::duration_from_response as duration_from_http_response; use std::{ @@ -117,7 +118,7 @@ where // Ensure that the service is ready before trying to use it. // Failure to do this *will* cause a panic. - poll_fn(|cx| service.poll_ready(cx)) + poll_fn(|cx| -> Poll> { service.poll_ready(cx) }) .await .map_err(super::error::Error::from)?; @@ -180,6 +181,7 @@ mod tests { } } + #[allow(clippy::result_large_err)] fn make_response(&self) -> Result { let remaining = self.required_tries_count.fetch_sub(1, Ordering::SeqCst); if remaining == 0 { diff --git a/qcs-api-client-grpc/src/tonic/trace/shared.rs b/qcs-api-client-grpc/src/tonic/trace/shared.rs index bd9c0d5..432b820 100644 --- a/qcs-api-client-grpc/src/tonic/trace/shared.rs +++ b/qcs-api-client-grpc/src/tonic/trace/shared.rs @@ -64,9 +64,7 @@ pub(super) fn should_trace_request( let url = parsed.ok(); filter .and_then(|filter| url.map(|url| (filter, url))) - .map_or(true, |(filter, url)| { - filter.is_enabled(&UrlPatternMatchInput::Url(url)) - }) + .is_none_or(|(filter, url)| filter.is_enabled(&UrlPatternMatchInput::Url(url))) } /// A [`tower_http::trace::OnFailure`] implementation for gRPC requests. diff --git a/qcs-api-client-grpc/src/tonic/trace/trace_layer.rs b/qcs-api-client-grpc/src/tonic/trace/trace_layer.rs index 8e76abd..7a7d515 100644 --- a/qcs-api-client-grpc/src/tonic/trace/trace_layer.rs +++ b/qcs-api-client-grpc/src/tonic/trace/trace_layer.rs @@ -101,10 +101,8 @@ pub type CustomTraceService = tower_http::trace::Trace< /// /// # Arguments /// -/// * `base_url` - The base URL of the gRPC service. This is used for matching -/// against the configured [`TracingFilter`]. -/// * `configuration` - The tracing configuration. If `None`, no requests will -/// be traced. +/// * `base_url` - The base URL of the gRPC service. This is used for matching against the configured [`TracingFilter`]. +/// * `configuration` - The tracing configuration. If `None`, no requests will be traced. #[must_use] pub fn build_layer( base_url: String, diff --git a/qcs-api-client-grpc/src/tonic/trace/trace_layer_otel_ext.rs b/qcs-api-client-grpc/src/tonic/trace/trace_layer_otel_ext.rs index 66e0eb9..4e818d1 100644 --- a/qcs-api-client-grpc/src/tonic/trace/trace_layer_otel_ext.rs +++ b/qcs-api-client-grpc/src/tonic/trace/trace_layer_otel_ext.rs @@ -30,6 +30,7 @@ //! All of this behavior is configurable via //! [`qcs_api_client_common::tracing_configuration::TracingConfiguration`]. use crate::tonic::common::get_status_code_from_headers; +use crate::tonic::BoxBody; use http::{HeaderMap, HeaderValue}; use opentelemetry::propagation::TextMapPropagator; use opentelemetry::trace::FutureExt; @@ -40,7 +41,7 @@ use qcs_api_client_common::tracing_configuration::HeaderAttributesFilter; use qcs_api_client_common::tracing_configuration::{ IncludeExclude, TracingConfiguration, TracingFilter, }; -use tonic::{body::BoxBody, client::GrpcService}; +use tonic::client::GrpcService; use tracing::Span; use tracing_opentelemetry::OpenTelemetrySpanExt; @@ -100,7 +101,7 @@ impl tower_http::trace::MakeSpan for MakeSpan { && should_trace_request(self.base_url.as_str(), request, self.filter.as_ref()) { let span = make_grpc_request_span(request); - span.set_parent(opentelemetry::Context::current()); + let _ = span.set_parent(opentelemetry::Context::current()); set_metadata_attribute( &span, @@ -218,9 +219,9 @@ impl CustomTraceService { /// /// * `propagate_trace_id` - Whether to propagate the OpenTelemetry context. /// * `base_url` - The base URL of the gRPC service. This is used for matching - /// against the configured `TracingFilter`. + /// against the configured `TracingFilter`. /// * `filter` - A filter to determine which requests should be traced. If `None`, - /// all requests will be traced. + /// all requests will be traced. /// * `inner` - The base trace service. pub fn new( propagate_trace_id: bool, diff --git a/qcs-api-client-openapi/CHANGELOG.md b/qcs-api-client-openapi/CHANGELOG.md index 1af8209..96ea85c 100644 --- a/qcs-api-client-openapi/CHANGELOG.md +++ b/qcs-api-client-openapi/CHANGELOG.md @@ -1,3 +1,10 @@ +## 0.14.0-kstrand.0 (2025-12-18) + +### Breaking Changes + +- export Secrets and Settings structs, add secret value wrappers to help prevent accidental leakage. +- upgrade tonic (prerelease) + ## 0.13.13 (2025-12-05) ### Fixes diff --git a/qcs-api-client-openapi/Cargo.toml b/qcs-api-client-openapi/Cargo.toml index f3693b7..e31c002 100644 --- a/qcs-api-client-openapi/Cargo.toml +++ b/qcs-api-client-openapi/Cargo.toml @@ -1,14 +1,14 @@ [dependencies] [dependencies.anyhow] optional = true - version = '1.0.68' + workspace = true [dependencies.http] workspace = true [dependencies.qcs-api-client-common] - path = '../qcs-api-client-common' - version = '0.12.12' + version = '0.13.0-kstrand.0' + workspace = true [dependencies.reqwest] features = ['json', 'multipart', 'rustls-tls-native-roots'] @@ -72,4 +72,4 @@ name = 'qcs-api-client-openapi' publish = true repository = 'https://github.com/rigetti/qcs-api-client-rust' - version = '0.13.13' + version = '0.14.0-kstrand.0' diff --git a/qcs-api-client-openapi/src/apis/account_api.rs b/qcs-api-client-openapi/src/apis/account_api.rs index 01968f6..1fe02ec 100644 --- a/qcs-api-client-openapi/src/apis/account_api.rs +++ b/qcs-api-client-openapi/src/apis/account_api.rs @@ -28,7 +28,7 @@ use ::qcs_api_client_common::backoff::{ duration_from_io_error, duration_from_reqwest_error, duration_from_response, ExponentialBackoff, }; #[cfg(feature = "tracing")] -use qcs_api_client_common::configuration::TokenRefresher; +use qcs_api_client_common::configuration::tokens::TokenRefresher; use reqwest::StatusCode; use serde::{Deserialize, Serialize}; @@ -259,15 +259,14 @@ async fn activate_user_inner( { // Ignore parsing errors if the URL is invalid for some reason. // If it is invalid, it will turn up as an error later when actually making the request. - let local_var_do_tracing = - local_var_uri_str - .parse::<::url::Url>() - .ok() - .map_or(true, |url| { - configuration - .qcs_config - .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) - }); + let local_var_do_tracing = local_var_uri_str + .parse::<::url::Url>() + .ok() + .is_none_or(|url| { + configuration + .qcs_config + .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) + }); if local_var_do_tracing { ::tracing::debug!( @@ -302,7 +301,7 @@ async fn activate_user_inner( "No client credentials found, but this call does not require authentication." ); } else { - local_var_req_builder = local_var_req_builder.bearer_auth(token?); + local_var_req_builder = local_var_req_builder.bearer_auth(token?.secret()); } } @@ -403,15 +402,14 @@ async fn add_group_user_inner( { // Ignore parsing errors if the URL is invalid for some reason. // If it is invalid, it will turn up as an error later when actually making the request. - let local_var_do_tracing = - local_var_uri_str - .parse::<::url::Url>() - .ok() - .map_or(true, |url| { - configuration - .qcs_config - .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) - }); + let local_var_do_tracing = local_var_uri_str + .parse::<::url::Url>() + .ok() + .is_none_or(|url| { + configuration + .qcs_config + .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) + }); if local_var_do_tracing { ::tracing::debug!( @@ -446,7 +444,7 @@ async fn add_group_user_inner( "No client credentials found, but this call does not require authentication." ); } else { - local_var_req_builder = local_var_req_builder.bearer_auth(token?); + local_var_req_builder = local_var_req_builder.bearer_auth(token?.secret()); } } @@ -547,15 +545,14 @@ async fn dismiss_viewer_announcement_inner( { // Ignore parsing errors if the URL is invalid for some reason. // If it is invalid, it will turn up as an error later when actually making the request. - let local_var_do_tracing = - local_var_uri_str - .parse::<::url::Url>() - .ok() - .map_or(true, |url| { - configuration - .qcs_config - .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) - }); + let local_var_do_tracing = local_var_uri_str + .parse::<::url::Url>() + .ok() + .is_none_or(|url| { + configuration + .qcs_config + .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) + }); if local_var_do_tracing { ::tracing::debug!( @@ -590,7 +587,7 @@ async fn dismiss_viewer_announcement_inner( "No client credentials found, but this call does not require authentication." ); } else { - local_var_req_builder = local_var_req_builder.bearer_auth(token?); + local_var_req_builder = local_var_req_builder.bearer_auth(token?.secret()); } } @@ -690,15 +687,14 @@ async fn get_group_balance_inner( { // Ignore parsing errors if the URL is invalid for some reason. // If it is invalid, it will turn up as an error later when actually making the request. - let local_var_do_tracing = - local_var_uri_str - .parse::<::url::Url>() - .ok() - .map_or(true, |url| { - configuration - .qcs_config - .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) - }); + let local_var_do_tracing = local_var_uri_str + .parse::<::url::Url>() + .ok() + .is_none_or(|url| { + configuration + .qcs_config + .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) + }); if local_var_do_tracing { ::tracing::debug!( @@ -733,7 +729,7 @@ async fn get_group_balance_inner( "No client credentials found, but this call does not require authentication." ); } else { - local_var_req_builder = local_var_req_builder.bearer_auth(token?); + local_var_req_builder = local_var_req_builder.bearer_auth(token?.secret()); } } @@ -832,15 +828,14 @@ async fn get_group_billing_customer_inner( { // Ignore parsing errors if the URL is invalid for some reason. // If it is invalid, it will turn up as an error later when actually making the request. - let local_var_do_tracing = - local_var_uri_str - .parse::<::url::Url>() - .ok() - .map_or(true, |url| { - configuration - .qcs_config - .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) - }); + let local_var_do_tracing = local_var_uri_str + .parse::<::url::Url>() + .ok() + .is_none_or(|url| { + configuration + .qcs_config + .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) + }); if local_var_do_tracing { ::tracing::debug!( @@ -875,7 +870,7 @@ async fn get_group_billing_customer_inner( "No client credentials found, but this call does not require authentication." ); } else { - local_var_req_builder = local_var_req_builder.bearer_auth(token?); + local_var_req_builder = local_var_req_builder.bearer_auth(token?.secret()); } } @@ -975,15 +970,14 @@ async fn get_group_upcoming_billing_invoice_inner( { // Ignore parsing errors if the URL is invalid for some reason. // If it is invalid, it will turn up as an error later when actually making the request. - let local_var_do_tracing = - local_var_uri_str - .parse::<::url::Url>() - .ok() - .map_or(true, |url| { - configuration - .qcs_config - .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) - }); + let local_var_do_tracing = local_var_uri_str + .parse::<::url::Url>() + .ok() + .is_none_or(|url| { + configuration + .qcs_config + .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) + }); if local_var_do_tracing { ::tracing::debug!( @@ -1018,7 +1012,7 @@ async fn get_group_upcoming_billing_invoice_inner( "No client credentials found, but this call does not require authentication." ); } else { - local_var_req_builder = local_var_req_builder.bearer_auth(token?); + local_var_req_builder = local_var_req_builder.bearer_auth(token?.secret()); } } @@ -1122,15 +1116,14 @@ async fn get_user_balance_inner( { // Ignore parsing errors if the URL is invalid for some reason. // If it is invalid, it will turn up as an error later when actually making the request. - let local_var_do_tracing = - local_var_uri_str - .parse::<::url::Url>() - .ok() - .map_or(true, |url| { - configuration - .qcs_config - .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) - }); + let local_var_do_tracing = local_var_uri_str + .parse::<::url::Url>() + .ok() + .is_none_or(|url| { + configuration + .qcs_config + .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) + }); if local_var_do_tracing { ::tracing::debug!( @@ -1165,7 +1158,7 @@ async fn get_user_balance_inner( "No client credentials found, but this call does not require authentication." ); } else { - local_var_req_builder = local_var_req_builder.bearer_auth(token?); + local_var_req_builder = local_var_req_builder.bearer_auth(token?.secret()); } } @@ -1264,15 +1257,14 @@ async fn get_user_billing_customer_inner( { // Ignore parsing errors if the URL is invalid for some reason. // If it is invalid, it will turn up as an error later when actually making the request. - let local_var_do_tracing = - local_var_uri_str - .parse::<::url::Url>() - .ok() - .map_or(true, |url| { - configuration - .qcs_config - .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) - }); + let local_var_do_tracing = local_var_uri_str + .parse::<::url::Url>() + .ok() + .is_none_or(|url| { + configuration + .qcs_config + .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) + }); if local_var_do_tracing { ::tracing::debug!( @@ -1307,7 +1299,7 @@ async fn get_user_billing_customer_inner( "No client credentials found, but this call does not require authentication." ); } else { - local_var_req_builder = local_var_req_builder.bearer_auth(token?); + local_var_req_builder = local_var_req_builder.bearer_auth(token?.secret()); } } @@ -1408,15 +1400,14 @@ async fn get_user_event_billing_price_inner( { // Ignore parsing errors if the URL is invalid for some reason. // If it is invalid, it will turn up as an error later when actually making the request. - let local_var_do_tracing = - local_var_uri_str - .parse::<::url::Url>() - .ok() - .map_or(true, |url| { - configuration - .qcs_config - .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) - }); + let local_var_do_tracing = local_var_uri_str + .parse::<::url::Url>() + .ok() + .is_none_or(|url| { + configuration + .qcs_config + .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) + }); if local_var_do_tracing { ::tracing::debug!( @@ -1451,7 +1442,7 @@ async fn get_user_event_billing_price_inner( "No client credentials found, but this call does not require authentication." ); } else { - local_var_req_builder = local_var_req_builder.bearer_auth(token?); + local_var_req_builder = local_var_req_builder.bearer_auth(token?.secret()); } } @@ -1559,15 +1550,14 @@ async fn get_user_upcoming_billing_invoice_inner( { // Ignore parsing errors if the URL is invalid for some reason. // If it is invalid, it will turn up as an error later when actually making the request. - let local_var_do_tracing = - local_var_uri_str - .parse::<::url::Url>() - .ok() - .map_or(true, |url| { - configuration - .qcs_config - .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) - }); + let local_var_do_tracing = local_var_uri_str + .parse::<::url::Url>() + .ok() + .is_none_or(|url| { + configuration + .qcs_config + .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) + }); if local_var_do_tracing { ::tracing::debug!( @@ -1602,7 +1592,7 @@ async fn get_user_upcoming_billing_invoice_inner( "No client credentials found, but this call does not require authentication." ); } else { - local_var_req_builder = local_var_req_builder.bearer_auth(token?); + local_var_req_builder = local_var_req_builder.bearer_auth(token?.secret()); } } @@ -1704,15 +1694,14 @@ async fn get_viewer_user_onboarding_completed_inner( { // Ignore parsing errors if the URL is invalid for some reason. // If it is invalid, it will turn up as an error later when actually making the request. - let local_var_do_tracing = - local_var_uri_str - .parse::<::url::Url>() - .ok() - .map_or(true, |url| { - configuration - .qcs_config - .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) - }); + let local_var_do_tracing = local_var_uri_str + .parse::<::url::Url>() + .ok() + .is_none_or(|url| { + configuration + .qcs_config + .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) + }); if local_var_do_tracing { ::tracing::debug!( @@ -1747,7 +1736,7 @@ async fn get_viewer_user_onboarding_completed_inner( "No client credentials found, but this call does not require authentication." ); } else { - local_var_req_builder = local_var_req_builder.bearer_auth(token?); + local_var_req_builder = local_var_req_builder.bearer_auth(token?.secret()); } } @@ -1855,15 +1844,14 @@ async fn list_group_billing_invoice_lines_inner( { // Ignore parsing errors if the URL is invalid for some reason. // If it is invalid, it will turn up as an error later when actually making the request. - let local_var_do_tracing = - local_var_uri_str - .parse::<::url::Url>() - .ok() - .map_or(true, |url| { - configuration - .qcs_config - .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) - }); + let local_var_do_tracing = local_var_uri_str + .parse::<::url::Url>() + .ok() + .is_none_or(|url| { + configuration + .qcs_config + .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) + }); if local_var_do_tracing { ::tracing::debug!( @@ -1907,7 +1895,7 @@ async fn list_group_billing_invoice_lines_inner( "No client credentials found, but this call does not require authentication." ); } else { - local_var_req_builder = local_var_req_builder.bearer_auth(token?); + local_var_req_builder = local_var_req_builder.bearer_auth(token?.secret()); } } @@ -2023,15 +2011,14 @@ async fn list_group_billing_invoices_inner( { // Ignore parsing errors if the URL is invalid for some reason. // If it is invalid, it will turn up as an error later when actually making the request. - let local_var_do_tracing = - local_var_uri_str - .parse::<::url::Url>() - .ok() - .map_or(true, |url| { - configuration - .qcs_config - .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) - }); + let local_var_do_tracing = local_var_uri_str + .parse::<::url::Url>() + .ok() + .is_none_or(|url| { + configuration + .qcs_config + .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) + }); if local_var_do_tracing { ::tracing::debug!( @@ -2075,7 +2062,7 @@ async fn list_group_billing_invoices_inner( "No client credentials found, but this call does not require authentication." ); } else { - local_var_req_builder = local_var_req_builder.bearer_auth(token?); + local_var_req_builder = local_var_req_builder.bearer_auth(token?.secret()); } } @@ -2189,15 +2176,14 @@ async fn list_group_upcoming_billing_invoice_lines_inner( { // Ignore parsing errors if the URL is invalid for some reason. // If it is invalid, it will turn up as an error later when actually making the request. - let local_var_do_tracing = - local_var_uri_str - .parse::<::url::Url>() - .ok() - .map_or(true, |url| { - configuration - .qcs_config - .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) - }); + let local_var_do_tracing = local_var_uri_str + .parse::<::url::Url>() + .ok() + .is_none_or(|url| { + configuration + .qcs_config + .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) + }); if local_var_do_tracing { ::tracing::debug!( @@ -2241,7 +2227,7 @@ async fn list_group_upcoming_billing_invoice_lines_inner( "No client credentials found, but this call does not require authentication." ); } else { - local_var_req_builder = local_var_req_builder.bearer_auth(token?); + local_var_req_builder = local_var_req_builder.bearer_auth(token?.secret()); } } @@ -2354,15 +2340,14 @@ async fn list_group_users_inner( { // Ignore parsing errors if the URL is invalid for some reason. // If it is invalid, it will turn up as an error later when actually making the request. - let local_var_do_tracing = - local_var_uri_str - .parse::<::url::Url>() - .ok() - .map_or(true, |url| { - configuration - .qcs_config - .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) - }); + let local_var_do_tracing = local_var_uri_str + .parse::<::url::Url>() + .ok() + .is_none_or(|url| { + configuration + .qcs_config + .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) + }); if local_var_do_tracing { ::tracing::debug!( @@ -2406,7 +2391,7 @@ async fn list_group_users_inner( "No client credentials found, but this call does not require authentication." ); } else { - local_var_req_builder = local_var_req_builder.bearer_auth(token?); + local_var_req_builder = local_var_req_builder.bearer_auth(token?.secret()); } } @@ -2521,15 +2506,14 @@ async fn list_user_billing_invoice_lines_inner( { // Ignore parsing errors if the URL is invalid for some reason. // If it is invalid, it will turn up as an error later when actually making the request. - let local_var_do_tracing = - local_var_uri_str - .parse::<::url::Url>() - .ok() - .map_or(true, |url| { - configuration - .qcs_config - .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) - }); + let local_var_do_tracing = local_var_uri_str + .parse::<::url::Url>() + .ok() + .is_none_or(|url| { + configuration + .qcs_config + .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) + }); if local_var_do_tracing { ::tracing::debug!( @@ -2573,7 +2557,7 @@ async fn list_user_billing_invoice_lines_inner( "No client credentials found, but this call does not require authentication." ); } else { - local_var_req_builder = local_var_req_builder.bearer_auth(token?); + local_var_req_builder = local_var_req_builder.bearer_auth(token?.secret()); } } @@ -2689,15 +2673,14 @@ async fn list_user_billing_invoices_inner( { // Ignore parsing errors if the URL is invalid for some reason. // If it is invalid, it will turn up as an error later when actually making the request. - let local_var_do_tracing = - local_var_uri_str - .parse::<::url::Url>() - .ok() - .map_or(true, |url| { - configuration - .qcs_config - .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) - }); + let local_var_do_tracing = local_var_uri_str + .parse::<::url::Url>() + .ok() + .is_none_or(|url| { + configuration + .qcs_config + .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) + }); if local_var_do_tracing { ::tracing::debug!( @@ -2741,7 +2724,7 @@ async fn list_user_billing_invoices_inner( "No client credentials found, but this call does not require authentication." ); } else { - local_var_req_builder = local_var_req_builder.bearer_auth(token?); + local_var_req_builder = local_var_req_builder.bearer_auth(token?.secret()); } } @@ -2852,15 +2835,14 @@ async fn list_user_groups_inner( { // Ignore parsing errors if the URL is invalid for some reason. // If it is invalid, it will turn up as an error later when actually making the request. - let local_var_do_tracing = - local_var_uri_str - .parse::<::url::Url>() - .ok() - .map_or(true, |url| { - configuration - .qcs_config - .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) - }); + let local_var_do_tracing = local_var_uri_str + .parse::<::url::Url>() + .ok() + .is_none_or(|url| { + configuration + .qcs_config + .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) + }); if local_var_do_tracing { ::tracing::debug!( @@ -2904,7 +2886,7 @@ async fn list_user_groups_inner( "No client credentials found, but this call does not require authentication." ); } else { - local_var_req_builder = local_var_req_builder.bearer_auth(token?); + local_var_req_builder = local_var_req_builder.bearer_auth(token?.secret()); } } @@ -3017,15 +2999,14 @@ async fn list_user_upcoming_billing_invoice_lines_inner( { // Ignore parsing errors if the URL is invalid for some reason. // If it is invalid, it will turn up as an error later when actually making the request. - let local_var_do_tracing = - local_var_uri_str - .parse::<::url::Url>() - .ok() - .map_or(true, |url| { - configuration - .qcs_config - .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) - }); + let local_var_do_tracing = local_var_uri_str + .parse::<::url::Url>() + .ok() + .is_none_or(|url| { + configuration + .qcs_config + .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) + }); if local_var_do_tracing { ::tracing::debug!( @@ -3069,7 +3050,7 @@ async fn list_user_upcoming_billing_invoice_lines_inner( "No client credentials found, but this call does not require authentication." ); } else { - local_var_req_builder = local_var_req_builder.bearer_auth(token?); + local_var_req_builder = local_var_req_builder.bearer_auth(token?.secret()); } } @@ -3181,15 +3162,14 @@ async fn list_viewer_announcements_inner( { // Ignore parsing errors if the URL is invalid for some reason. // If it is invalid, it will turn up as an error later when actually making the request. - let local_var_do_tracing = - local_var_uri_str - .parse::<::url::Url>() - .ok() - .map_or(true, |url| { - configuration - .qcs_config - .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) - }); + let local_var_do_tracing = local_var_uri_str + .parse::<::url::Url>() + .ok() + .is_none_or(|url| { + configuration + .qcs_config + .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) + }); if local_var_do_tracing { ::tracing::debug!( @@ -3237,7 +3217,7 @@ async fn list_viewer_announcements_inner( "No client credentials found, but this call does not require authentication." ); } else { - local_var_req_builder = local_var_req_builder.bearer_auth(token?); + local_var_req_builder = local_var_req_builder.bearer_auth(token?.secret()); } } @@ -3347,15 +3327,14 @@ async fn put_viewer_user_onboarding_completed_inner( { // Ignore parsing errors if the URL is invalid for some reason. // If it is invalid, it will turn up as an error later when actually making the request. - let local_var_do_tracing = - local_var_uri_str - .parse::<::url::Url>() - .ok() - .map_or(true, |url| { - configuration - .qcs_config - .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) - }); + let local_var_do_tracing = local_var_uri_str + .parse::<::url::Url>() + .ok() + .is_none_or(|url| { + configuration + .qcs_config + .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) + }); if local_var_do_tracing { ::tracing::debug!( @@ -3390,7 +3369,7 @@ async fn put_viewer_user_onboarding_completed_inner( "No client credentials found, but this call does not require authentication." ); } else { - local_var_req_builder = local_var_req_builder.bearer_auth(token?); + local_var_req_builder = local_var_req_builder.bearer_auth(token?.secret()); } } @@ -3498,15 +3477,14 @@ async fn remove_group_user_inner( { // Ignore parsing errors if the URL is invalid for some reason. // If it is invalid, it will turn up as an error later when actually making the request. - let local_var_do_tracing = - local_var_uri_str - .parse::<::url::Url>() - .ok() - .map_or(true, |url| { - configuration - .qcs_config - .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) - }); + let local_var_do_tracing = local_var_uri_str + .parse::<::url::Url>() + .ok() + .is_none_or(|url| { + configuration + .qcs_config + .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) + }); if local_var_do_tracing { ::tracing::debug!( @@ -3541,7 +3519,7 @@ async fn remove_group_user_inner( "No client credentials found, but this call does not require authentication." ); } else { - local_var_req_builder = local_var_req_builder.bearer_auth(token?); + local_var_req_builder = local_var_req_builder.bearer_auth(token?.secret()); } } @@ -3645,15 +3623,14 @@ async fn update_viewer_user_profile_inner( { // Ignore parsing errors if the URL is invalid for some reason. // If it is invalid, it will turn up as an error later when actually making the request. - let local_var_do_tracing = - local_var_uri_str - .parse::<::url::Url>() - .ok() - .map_or(true, |url| { - configuration - .qcs_config - .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) - }); + let local_var_do_tracing = local_var_uri_str + .parse::<::url::Url>() + .ok() + .is_none_or(|url| { + configuration + .qcs_config + .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) + }); if local_var_do_tracing { ::tracing::debug!( @@ -3688,7 +3665,7 @@ async fn update_viewer_user_profile_inner( "No client credentials found, but this call does not require authentication." ); } else { - local_var_req_builder = local_var_req_builder.bearer_auth(token?); + local_var_req_builder = local_var_req_builder.bearer_auth(token?.secret()); } } diff --git a/qcs-api-client-openapi/src/apis/authentication_api.rs b/qcs-api-client-openapi/src/apis/authentication_api.rs index fbe564c..c185e4a 100644 --- a/qcs-api-client-openapi/src/apis/authentication_api.rs +++ b/qcs-api-client-openapi/src/apis/authentication_api.rs @@ -28,7 +28,7 @@ use ::qcs_api_client_common::backoff::{ duration_from_io_error, duration_from_reqwest_error, duration_from_response, ExponentialBackoff, }; #[cfg(feature = "tracing")] -use qcs_api_client_common::configuration::TokenRefresher; +use qcs_api_client_common::configuration::tokens::TokenRefresher; use reqwest::StatusCode; use serde::{Deserialize, Serialize}; @@ -89,15 +89,14 @@ async fn auth_email_password_reset_token_inner( { // Ignore parsing errors if the URL is invalid for some reason. // If it is invalid, it will turn up as an error later when actually making the request. - let local_var_do_tracing = - local_var_uri_str - .parse::<::url::Url>() - .ok() - .map_or(true, |url| { - configuration - .qcs_config - .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) - }); + let local_var_do_tracing = local_var_uri_str + .parse::<::url::Url>() + .ok() + .is_none_or(|url| { + configuration + .qcs_config + .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) + }); if local_var_do_tracing { ::tracing::debug!( @@ -132,7 +131,7 @@ async fn auth_email_password_reset_token_inner( "No client credentials found, but this call does not require authentication." ); } else { - local_var_req_builder = local_var_req_builder.bearer_auth(token?); + local_var_req_builder = local_var_req_builder.bearer_auth(token?.secret()); } } @@ -237,15 +236,14 @@ async fn auth_get_user_inner( { // Ignore parsing errors if the URL is invalid for some reason. // If it is invalid, it will turn up as an error later when actually making the request. - let local_var_do_tracing = - local_var_uri_str - .parse::<::url::Url>() - .ok() - .map_or(true, |url| { - configuration - .qcs_config - .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) - }); + let local_var_do_tracing = local_var_uri_str + .parse::<::url::Url>() + .ok() + .is_none_or(|url| { + configuration + .qcs_config + .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) + }); if local_var_do_tracing { ::tracing::debug!( @@ -280,7 +278,7 @@ async fn auth_get_user_inner( "No client credentials found, but this call does not require authentication." ); } else { - local_var_req_builder = local_var_req_builder.bearer_auth(token?); + local_var_req_builder = local_var_req_builder.bearer_auth(token?.secret()); } } @@ -377,15 +375,14 @@ async fn auth_reset_password_inner( { // Ignore parsing errors if the URL is invalid for some reason. // If it is invalid, it will turn up as an error later when actually making the request. - let local_var_do_tracing = - local_var_uri_str - .parse::<::url::Url>() - .ok() - .map_or(true, |url| { - configuration - .qcs_config - .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) - }); + let local_var_do_tracing = local_var_uri_str + .parse::<::url::Url>() + .ok() + .is_none_or(|url| { + configuration + .qcs_config + .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) + }); if local_var_do_tracing { ::tracing::debug!( @@ -420,7 +417,7 @@ async fn auth_reset_password_inner( "No client credentials found, but this call does not require authentication." ); } else { - local_var_req_builder = local_var_req_builder.bearer_auth(token?); + local_var_req_builder = local_var_req_builder.bearer_auth(token?.secret()); } } @@ -524,15 +521,14 @@ async fn auth_reset_password_with_token_inner( { // Ignore parsing errors if the URL is invalid for some reason. // If it is invalid, it will turn up as an error later when actually making the request. - let local_var_do_tracing = - local_var_uri_str - .parse::<::url::Url>() - .ok() - .map_or(true, |url| { - configuration - .qcs_config - .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) - }); + let local_var_do_tracing = local_var_uri_str + .parse::<::url::Url>() + .ok() + .is_none_or(|url| { + configuration + .qcs_config + .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) + }); if local_var_do_tracing { ::tracing::debug!( @@ -567,7 +563,7 @@ async fn auth_reset_password_with_token_inner( "No client credentials found, but this call does not require authentication." ); } else { - local_var_req_builder = local_var_req_builder.bearer_auth(token?); + local_var_req_builder = local_var_req_builder.bearer_auth(token?.secret()); } } diff --git a/qcs-api-client-openapi/src/apis/client_applications_api.rs b/qcs-api-client-openapi/src/apis/client_applications_api.rs index a80cc98..05a9493 100644 --- a/qcs-api-client-openapi/src/apis/client_applications_api.rs +++ b/qcs-api-client-openapi/src/apis/client_applications_api.rs @@ -28,7 +28,7 @@ use ::qcs_api_client_common::backoff::{ duration_from_io_error, duration_from_reqwest_error, duration_from_response, ExponentialBackoff, }; #[cfg(feature = "tracing")] -use qcs_api_client_common::configuration::TokenRefresher; +use qcs_api_client_common::configuration::tokens::TokenRefresher; use reqwest::StatusCode; use serde::{Deserialize, Serialize}; @@ -76,15 +76,14 @@ async fn check_client_application_inner( { // Ignore parsing errors if the URL is invalid for some reason. // If it is invalid, it will turn up as an error later when actually making the request. - let local_var_do_tracing = - local_var_uri_str - .parse::<::url::Url>() - .ok() - .map_or(true, |url| { - configuration - .qcs_config - .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) - }); + let local_var_do_tracing = local_var_uri_str + .parse::<::url::Url>() + .ok() + .is_none_or(|url| { + configuration + .qcs_config + .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) + }); if local_var_do_tracing { ::tracing::debug!( @@ -119,7 +118,7 @@ async fn check_client_application_inner( "No client credentials found, but this call does not require authentication." ); } else { - local_var_req_builder = local_var_req_builder.bearer_auth(token?); + local_var_req_builder = local_var_req_builder.bearer_auth(token?.secret()); } } @@ -225,15 +224,14 @@ async fn get_client_application_inner( { // Ignore parsing errors if the URL is invalid for some reason. // If it is invalid, it will turn up as an error later when actually making the request. - let local_var_do_tracing = - local_var_uri_str - .parse::<::url::Url>() - .ok() - .map_or(true, |url| { - configuration - .qcs_config - .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) - }); + let local_var_do_tracing = local_var_uri_str + .parse::<::url::Url>() + .ok() + .is_none_or(|url| { + configuration + .qcs_config + .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) + }); if local_var_do_tracing { ::tracing::debug!( @@ -268,7 +266,7 @@ async fn get_client_application_inner( "No client credentials found, but this call does not require authentication." ); } else { - local_var_req_builder = local_var_req_builder.bearer_auth(token?); + local_var_req_builder = local_var_req_builder.bearer_auth(token?.secret()); } } @@ -370,15 +368,14 @@ async fn list_client_applications_inner( { // Ignore parsing errors if the URL is invalid for some reason. // If it is invalid, it will turn up as an error later when actually making the request. - let local_var_do_tracing = - local_var_uri_str - .parse::<::url::Url>() - .ok() - .map_or(true, |url| { - configuration - .qcs_config - .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) - }); + let local_var_do_tracing = local_var_uri_str + .parse::<::url::Url>() + .ok() + .is_none_or(|url| { + configuration + .qcs_config + .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) + }); if local_var_do_tracing { ::tracing::debug!( @@ -413,7 +410,7 @@ async fn list_client_applications_inner( "No client credentials found, but this call does not require authentication." ); } else { - local_var_req_builder = local_var_req_builder.bearer_auth(token?); + local_var_req_builder = local_var_req_builder.bearer_auth(token?.secret()); } } diff --git a/qcs-api-client-openapi/src/apis/configuration.rs b/qcs-api-client-openapi/src/apis/configuration.rs index 5e1d1cf..403ff53 100644 --- a/qcs-api-client-openapi/src/apis/configuration.rs +++ b/qcs-api-client-openapi/src/apis/configuration.rs @@ -206,11 +206,11 @@ mod tests { #[cfg(feature = "otel-tracing")] use rstest::rstest; - /// https://docs.rs/reqwest_mock doesn't seem well maintained and requires setting the - /// Configuration::client field to be a trait or struct from the reqwest_mock crate. - /// - /// Additionally, reqwest still doesn't support Unix domain sockets, so unit testing is fairly - /// limited for here. See more info on UDS, see . + // https://docs.rs/reqwest_mock doesn't seem well maintained and requires setting the + // Configuration::client field to be a trait or struct from the reqwest_mock crate. + // + // Additionally, reqwest still doesn't support Unix domain sockets, so unit testing is fairly + // limited for here. See more info on UDS, see . /// Test that all requests are traced when no filter is specified. #[cfg(feature = "otel-tracing")] diff --git a/qcs-api-client-openapi/src/apis/default_api.rs b/qcs-api-client-openapi/src/apis/default_api.rs index fbf9101..97252a5 100644 --- a/qcs-api-client-openapi/src/apis/default_api.rs +++ b/qcs-api-client-openapi/src/apis/default_api.rs @@ -28,7 +28,7 @@ use ::qcs_api_client_common::backoff::{ duration_from_io_error, duration_from_reqwest_error, duration_from_response, ExponentialBackoff, }; #[cfg(feature = "tracing")] -use qcs_api_client_common::configuration::TokenRefresher; +use qcs_api_client_common::configuration::tokens::TokenRefresher; use reqwest::StatusCode; use serde::{Deserialize, Serialize}; @@ -70,15 +70,14 @@ async fn get_health_inner( { // Ignore parsing errors if the URL is invalid for some reason. // If it is invalid, it will turn up as an error later when actually making the request. - let local_var_do_tracing = - local_var_uri_str - .parse::<::url::Url>() - .ok() - .map_or(true, |url| { - configuration - .qcs_config - .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) - }); + let local_var_do_tracing = local_var_uri_str + .parse::<::url::Url>() + .ok() + .is_none_or(|url| { + configuration + .qcs_config + .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) + }); if local_var_do_tracing { ::tracing::debug!( @@ -113,7 +112,7 @@ async fn get_health_inner( "No client credentials found, but this call does not require authentication." ); } else { - local_var_req_builder = local_var_req_builder.bearer_auth(token?); + local_var_req_builder = local_var_req_builder.bearer_auth(token?.secret()); } } @@ -209,15 +208,14 @@ async fn health_check_inner( { // Ignore parsing errors if the URL is invalid for some reason. // If it is invalid, it will turn up as an error later when actually making the request. - let local_var_do_tracing = - local_var_uri_str - .parse::<::url::Url>() - .ok() - .map_or(true, |url| { - configuration - .qcs_config - .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) - }); + let local_var_do_tracing = local_var_uri_str + .parse::<::url::Url>() + .ok() + .is_none_or(|url| { + configuration + .qcs_config + .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) + }); if local_var_do_tracing { ::tracing::debug!( @@ -252,7 +250,7 @@ async fn health_check_inner( "No client credentials found, but this call does not require authentication." ); } else { - local_var_req_builder = local_var_req_builder.bearer_auth(token?); + local_var_req_builder = local_var_req_builder.bearer_auth(token?.secret()); } } @@ -344,15 +342,14 @@ async fn health_check_deprecated_inner( { // Ignore parsing errors if the URL is invalid for some reason. // If it is invalid, it will turn up as an error later when actually making the request. - let local_var_do_tracing = - local_var_uri_str - .parse::<::url::Url>() - .ok() - .map_or(true, |url| { - configuration - .qcs_config - .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) - }); + let local_var_do_tracing = local_var_uri_str + .parse::<::url::Url>() + .ok() + .is_none_or(|url| { + configuration + .qcs_config + .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) + }); if local_var_do_tracing { ::tracing::debug!( @@ -387,7 +384,7 @@ async fn health_check_deprecated_inner( "No client credentials found, but this call does not require authentication." ); } else { - local_var_req_builder = local_var_req_builder.bearer_auth(token?); + local_var_req_builder = local_var_req_builder.bearer_auth(token?.secret()); } } diff --git a/qcs-api-client-openapi/src/apis/endpoints_api.rs b/qcs-api-client-openapi/src/apis/endpoints_api.rs index 30792c7..2c3a83e 100644 --- a/qcs-api-client-openapi/src/apis/endpoints_api.rs +++ b/qcs-api-client-openapi/src/apis/endpoints_api.rs @@ -28,7 +28,7 @@ use ::qcs_api_client_common::backoff::{ duration_from_io_error, duration_from_reqwest_error, duration_from_response, ExponentialBackoff, }; #[cfg(feature = "tracing")] -use qcs_api_client_common::configuration::TokenRefresher; +use qcs_api_client_common::configuration::tokens::TokenRefresher; use reqwest::StatusCode; use serde::{Deserialize, Serialize}; @@ -107,15 +107,14 @@ async fn create_endpoint_inner( { // Ignore parsing errors if the URL is invalid for some reason. // If it is invalid, it will turn up as an error later when actually making the request. - let local_var_do_tracing = - local_var_uri_str - .parse::<::url::Url>() - .ok() - .map_or(true, |url| { - configuration - .qcs_config - .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) - }); + let local_var_do_tracing = local_var_uri_str + .parse::<::url::Url>() + .ok() + .is_none_or(|url| { + configuration + .qcs_config + .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) + }); if local_var_do_tracing { ::tracing::debug!( @@ -150,7 +149,7 @@ async fn create_endpoint_inner( "No client credentials found, but this call does not require authentication." ); } else { - local_var_req_builder = local_var_req_builder.bearer_auth(token?); + local_var_req_builder = local_var_req_builder.bearer_auth(token?.secret()); } } @@ -256,15 +255,14 @@ async fn delete_endpoint_inner( { // Ignore parsing errors if the URL is invalid for some reason. // If it is invalid, it will turn up as an error later when actually making the request. - let local_var_do_tracing = - local_var_uri_str - .parse::<::url::Url>() - .ok() - .map_or(true, |url| { - configuration - .qcs_config - .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) - }); + let local_var_do_tracing = local_var_uri_str + .parse::<::url::Url>() + .ok() + .is_none_or(|url| { + configuration + .qcs_config + .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) + }); if local_var_do_tracing { ::tracing::debug!( @@ -299,7 +297,7 @@ async fn delete_endpoint_inner( "No client credentials found, but this call does not require authentication." ); } else { - local_var_req_builder = local_var_req_builder.bearer_auth(token?); + local_var_req_builder = local_var_req_builder.bearer_auth(token?.secret()); } } @@ -397,15 +395,14 @@ async fn get_default_endpoint_inner( { // Ignore parsing errors if the URL is invalid for some reason. // If it is invalid, it will turn up as an error later when actually making the request. - let local_var_do_tracing = - local_var_uri_str - .parse::<::url::Url>() - .ok() - .map_or(true, |url| { - configuration - .qcs_config - .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) - }); + let local_var_do_tracing = local_var_uri_str + .parse::<::url::Url>() + .ok() + .is_none_or(|url| { + configuration + .qcs_config + .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) + }); if local_var_do_tracing { ::tracing::debug!( @@ -440,7 +437,7 @@ async fn get_default_endpoint_inner( "No client credentials found, but this call does not require authentication." ); } else { - local_var_req_builder = local_var_req_builder.bearer_auth(token?); + local_var_req_builder = local_var_req_builder.bearer_auth(token?.secret()); } } @@ -541,15 +538,14 @@ async fn get_endpoint_inner( { // Ignore parsing errors if the URL is invalid for some reason. // If it is invalid, it will turn up as an error later when actually making the request. - let local_var_do_tracing = - local_var_uri_str - .parse::<::url::Url>() - .ok() - .map_or(true, |url| { - configuration - .qcs_config - .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) - }); + let local_var_do_tracing = local_var_uri_str + .parse::<::url::Url>() + .ok() + .is_none_or(|url| { + configuration + .qcs_config + .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) + }); if local_var_do_tracing { ::tracing::debug!( @@ -584,7 +580,7 @@ async fn get_endpoint_inner( "No client credentials found, but this call does not require authentication." ); } else { - local_var_req_builder = local_var_req_builder.bearer_auth(token?); + local_var_req_builder = local_var_req_builder.bearer_auth(token?.secret()); } } @@ -684,15 +680,14 @@ async fn list_endpoints_inner( { // Ignore parsing errors if the URL is invalid for some reason. // If it is invalid, it will turn up as an error later when actually making the request. - let local_var_do_tracing = - local_var_uri_str - .parse::<::url::Url>() - .ok() - .map_or(true, |url| { - configuration - .qcs_config - .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) - }); + let local_var_do_tracing = local_var_uri_str + .parse::<::url::Url>() + .ok() + .is_none_or(|url| { + configuration + .qcs_config + .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) + }); if local_var_do_tracing { ::tracing::debug!( @@ -740,7 +735,7 @@ async fn list_endpoints_inner( "No client credentials found, but this call does not require authentication." ); } else { - local_var_req_builder = local_var_req_builder.bearer_auth(token?); + local_var_req_builder = local_var_req_builder.bearer_auth(token?.secret()); } } @@ -849,15 +844,14 @@ async fn restart_endpoint_inner( { // Ignore parsing errors if the URL is invalid for some reason. // If it is invalid, it will turn up as an error later when actually making the request. - let local_var_do_tracing = - local_var_uri_str - .parse::<::url::Url>() - .ok() - .map_or(true, |url| { - configuration - .qcs_config - .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) - }); + let local_var_do_tracing = local_var_uri_str + .parse::<::url::Url>() + .ok() + .is_none_or(|url| { + configuration + .qcs_config + .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) + }); if local_var_do_tracing { ::tracing::debug!( @@ -892,7 +886,7 @@ async fn restart_endpoint_inner( "No client credentials found, but this call does not require authentication." ); } else { - local_var_req_builder = local_var_req_builder.bearer_auth(token?); + local_var_req_builder = local_var_req_builder.bearer_auth(token?.secret()); } } diff --git a/qcs-api-client-openapi/src/apis/engagements_api.rs b/qcs-api-client-openapi/src/apis/engagements_api.rs index 2e40b70..a96bf87 100644 --- a/qcs-api-client-openapi/src/apis/engagements_api.rs +++ b/qcs-api-client-openapi/src/apis/engagements_api.rs @@ -28,7 +28,7 @@ use ::qcs_api_client_common::backoff::{ duration_from_io_error, duration_from_reqwest_error, duration_from_response, ExponentialBackoff, }; #[cfg(feature = "tracing")] -use qcs_api_client_common::configuration::TokenRefresher; +use qcs_api_client_common::configuration::tokens::TokenRefresher; use reqwest::StatusCode; use serde::{Deserialize, Serialize}; @@ -65,15 +65,14 @@ async fn create_engagement_inner( { // Ignore parsing errors if the URL is invalid for some reason. // If it is invalid, it will turn up as an error later when actually making the request. - let local_var_do_tracing = - local_var_uri_str - .parse::<::url::Url>() - .ok() - .map_or(true, |url| { - configuration - .qcs_config - .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) - }); + let local_var_do_tracing = local_var_uri_str + .parse::<::url::Url>() + .ok() + .is_none_or(|url| { + configuration + .qcs_config + .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) + }); if local_var_do_tracing { ::tracing::debug!( @@ -117,7 +116,7 @@ async fn create_engagement_inner( "No client credentials found, but this call does not require authentication." ); } else { - local_var_req_builder = local_var_req_builder.bearer_auth(token?); + local_var_req_builder = local_var_req_builder.bearer_auth(token?.secret()); } } diff --git a/qcs-api-client-openapi/src/apis/quantum_processors_api.rs b/qcs-api-client-openapi/src/apis/quantum_processors_api.rs index 1f37b2f..e2b1828 100644 --- a/qcs-api-client-openapi/src/apis/quantum_processors_api.rs +++ b/qcs-api-client-openapi/src/apis/quantum_processors_api.rs @@ -28,7 +28,7 @@ use ::qcs_api_client_common::backoff::{ duration_from_io_error, duration_from_reqwest_error, duration_from_response, ExponentialBackoff, }; #[cfg(feature = "tracing")] -use qcs_api_client_common::configuration::TokenRefresher; +use qcs_api_client_common::configuration::tokens::TokenRefresher; use reqwest::StatusCode; use serde::{Deserialize, Serialize}; @@ -97,15 +97,14 @@ async fn get_instruction_set_architecture_inner( { // Ignore parsing errors if the URL is invalid for some reason. // If it is invalid, it will turn up as an error later when actually making the request. - let local_var_do_tracing = - local_var_uri_str - .parse::<::url::Url>() - .ok() - .map_or(true, |url| { - configuration - .qcs_config - .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) - }); + let local_var_do_tracing = local_var_uri_str + .parse::<::url::Url>() + .ok() + .is_none_or(|url| { + configuration + .qcs_config + .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) + }); if local_var_do_tracing { ::tracing::debug!( @@ -140,7 +139,7 @@ async fn get_instruction_set_architecture_inner( "No client credentials found, but this call does not require authentication." ); } else { - local_var_req_builder = local_var_req_builder.bearer_auth(token?); + local_var_req_builder = local_var_req_builder.bearer_auth(token?.secret()); } } @@ -243,15 +242,14 @@ async fn get_quantum_processor_inner( { // Ignore parsing errors if the URL is invalid for some reason. // If it is invalid, it will turn up as an error later when actually making the request. - let local_var_do_tracing = - local_var_uri_str - .parse::<::url::Url>() - .ok() - .map_or(true, |url| { - configuration - .qcs_config - .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) - }); + let local_var_do_tracing = local_var_uri_str + .parse::<::url::Url>() + .ok() + .is_none_or(|url| { + configuration + .qcs_config + .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) + }); if local_var_do_tracing { ::tracing::debug!( @@ -286,7 +284,7 @@ async fn get_quantum_processor_inner( "No client credentials found, but this call does not require authentication." ); } else { - local_var_req_builder = local_var_req_builder.bearer_auth(token?); + local_var_req_builder = local_var_req_builder.bearer_auth(token?.secret()); } } @@ -390,15 +388,14 @@ async fn list_instruction_set_architectures_inner( { // Ignore parsing errors if the URL is invalid for some reason. // If it is invalid, it will turn up as an error later when actually making the request. - let local_var_do_tracing = - local_var_uri_str - .parse::<::url::Url>() - .ok() - .map_or(true, |url| { - configuration - .qcs_config - .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) - }); + let local_var_do_tracing = local_var_uri_str + .parse::<::url::Url>() + .ok() + .is_none_or(|url| { + configuration + .qcs_config + .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) + }); if local_var_do_tracing { ::tracing::debug!( @@ -442,7 +439,7 @@ async fn list_instruction_set_architectures_inner( "No client credentials found, but this call does not require authentication." ); } else { - local_var_req_builder = local_var_req_builder.bearer_auth(token?); + local_var_req_builder = local_var_req_builder.bearer_auth(token?.secret()); } } @@ -555,15 +552,14 @@ async fn list_quantum_processor_accessors_inner( { // Ignore parsing errors if the URL is invalid for some reason. // If it is invalid, it will turn up as an error later when actually making the request. - let local_var_do_tracing = - local_var_uri_str - .parse::<::url::Url>() - .ok() - .map_or(true, |url| { - configuration - .qcs_config - .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) - }); + let local_var_do_tracing = local_var_uri_str + .parse::<::url::Url>() + .ok() + .is_none_or(|url| { + configuration + .qcs_config + .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) + }); if local_var_do_tracing { ::tracing::debug!( @@ -607,7 +603,7 @@ async fn list_quantum_processor_accessors_inner( "No client credentials found, but this call does not require authentication." ); } else { - local_var_req_builder = local_var_req_builder.bearer_auth(token?); + local_var_req_builder = local_var_req_builder.bearer_auth(token?.secret()); } } @@ -718,15 +714,14 @@ async fn list_quantum_processors_inner( { // Ignore parsing errors if the URL is invalid for some reason. // If it is invalid, it will turn up as an error later when actually making the request. - let local_var_do_tracing = - local_var_uri_str - .parse::<::url::Url>() - .ok() - .map_or(true, |url| { - configuration - .qcs_config - .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) - }); + let local_var_do_tracing = local_var_uri_str + .parse::<::url::Url>() + .ok() + .is_none_or(|url| { + configuration + .qcs_config + .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) + }); if local_var_do_tracing { ::tracing::debug!( @@ -770,7 +765,7 @@ async fn list_quantum_processors_inner( "No client credentials found, but this call does not require authentication." ); } else { - local_var_req_builder = local_var_req_builder.bearer_auth(token?); + local_var_req_builder = local_var_req_builder.bearer_auth(token?.secret()); } } diff --git a/qcs-api-client-openapi/src/apis/reservations_api.rs b/qcs-api-client-openapi/src/apis/reservations_api.rs index 21bc840..a12f074 100644 --- a/qcs-api-client-openapi/src/apis/reservations_api.rs +++ b/qcs-api-client-openapi/src/apis/reservations_api.rs @@ -28,7 +28,7 @@ use ::qcs_api_client_common::backoff::{ duration_from_io_error, duration_from_reqwest_error, duration_from_response, ExponentialBackoff, }; #[cfg(feature = "tracing")] -use qcs_api_client_common::configuration::TokenRefresher; +use qcs_api_client_common::configuration::tokens::TokenRefresher; use reqwest::StatusCode; use serde::{Deserialize, Serialize}; @@ -122,15 +122,14 @@ async fn create_reservation_inner( { // Ignore parsing errors if the URL is invalid for some reason. // If it is invalid, it will turn up as an error later when actually making the request. - let local_var_do_tracing = - local_var_uri_str - .parse::<::url::Url>() - .ok() - .map_or(true, |url| { - configuration - .qcs_config - .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) - }); + let local_var_do_tracing = local_var_uri_str + .parse::<::url::Url>() + .ok() + .is_none_or(|url| { + configuration + .qcs_config + .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) + }); if local_var_do_tracing { ::tracing::debug!( @@ -174,7 +173,7 @@ async fn create_reservation_inner( "No client credentials found, but this call does not require authentication." ); } else { - local_var_req_builder = local_var_req_builder.bearer_auth(token?); + local_var_req_builder = local_var_req_builder.bearer_auth(token?.secret()); } } @@ -284,15 +283,14 @@ async fn delete_reservation_inner( { // Ignore parsing errors if the URL is invalid for some reason. // If it is invalid, it will turn up as an error later when actually making the request. - let local_var_do_tracing = - local_var_uri_str - .parse::<::url::Url>() - .ok() - .map_or(true, |url| { - configuration - .qcs_config - .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) - }); + let local_var_do_tracing = local_var_uri_str + .parse::<::url::Url>() + .ok() + .is_none_or(|url| { + configuration + .qcs_config + .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) + }); if local_var_do_tracing { ::tracing::debug!( @@ -327,7 +325,7 @@ async fn delete_reservation_inner( "No client credentials found, but this call does not require authentication." ); } else { - local_var_req_builder = local_var_req_builder.bearer_auth(token?); + local_var_req_builder = local_var_req_builder.bearer_auth(token?.secret()); } } @@ -431,15 +429,14 @@ async fn find_available_reservations_inner( { // Ignore parsing errors if the URL is invalid for some reason. // If it is invalid, it will turn up as an error later when actually making the request. - let local_var_do_tracing = - local_var_uri_str - .parse::<::url::Url>() - .ok() - .map_or(true, |url| { - configuration - .qcs_config - .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) - }); + let local_var_do_tracing = local_var_uri_str + .parse::<::url::Url>() + .ok() + .is_none_or(|url| { + configuration + .qcs_config + .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) + }); if local_var_do_tracing { ::tracing::debug!( @@ -488,7 +485,7 @@ async fn find_available_reservations_inner( "No client credentials found, but this call does not require authentication." ); } else { - local_var_req_builder = local_var_req_builder.bearer_auth(token?); + local_var_req_builder = local_var_req_builder.bearer_auth(token?.secret()); } } @@ -601,15 +598,14 @@ async fn get_quantum_processor_calendar_inner( { // Ignore parsing errors if the URL is invalid for some reason. // If it is invalid, it will turn up as an error later when actually making the request. - let local_var_do_tracing = - local_var_uri_str - .parse::<::url::Url>() - .ok() - .map_or(true, |url| { - configuration - .qcs_config - .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) - }); + let local_var_do_tracing = local_var_uri_str + .parse::<::url::Url>() + .ok() + .is_none_or(|url| { + configuration + .qcs_config + .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) + }); if local_var_do_tracing { ::tracing::debug!( @@ -644,7 +640,7 @@ async fn get_quantum_processor_calendar_inner( "No client credentials found, but this call does not require authentication." ); } else { - local_var_req_builder = local_var_req_builder.bearer_auth(token?); + local_var_req_builder = local_var_req_builder.bearer_auth(token?.secret()); } } @@ -748,15 +744,14 @@ async fn get_reservation_inner( { // Ignore parsing errors if the URL is invalid for some reason. // If it is invalid, it will turn up as an error later when actually making the request. - let local_var_do_tracing = - local_var_uri_str - .parse::<::url::Url>() - .ok() - .map_or(true, |url| { - configuration - .qcs_config - .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) - }); + let local_var_do_tracing = local_var_uri_str + .parse::<::url::Url>() + .ok() + .is_none_or(|url| { + configuration + .qcs_config + .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) + }); if local_var_do_tracing { ::tracing::debug!( @@ -791,7 +786,7 @@ async fn get_reservation_inner( "No client credentials found, but this call does not require authentication." ); } else { - local_var_req_builder = local_var_req_builder.bearer_auth(token?); + local_var_req_builder = local_var_req_builder.bearer_auth(token?.secret()); } } @@ -896,15 +891,14 @@ async fn list_group_reservations_inner( { // Ignore parsing errors if the URL is invalid for some reason. // If it is invalid, it will turn up as an error later when actually making the request. - let local_var_do_tracing = - local_var_uri_str - .parse::<::url::Url>() - .ok() - .map_or(true, |url| { - configuration - .qcs_config - .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) - }); + let local_var_do_tracing = local_var_uri_str + .parse::<::url::Url>() + .ok() + .is_none_or(|url| { + configuration + .qcs_config + .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) + }); if local_var_do_tracing { ::tracing::debug!( @@ -960,7 +954,7 @@ async fn list_group_reservations_inner( "No client credentials found, but this call does not require authentication." ); } else { - local_var_req_builder = local_var_req_builder.bearer_auth(token?); + local_var_req_builder = local_var_req_builder.bearer_auth(token?.secret()); } } @@ -1079,15 +1073,14 @@ async fn list_reservations_inner( { // Ignore parsing errors if the URL is invalid for some reason. // If it is invalid, it will turn up as an error later when actually making the request. - let local_var_do_tracing = - local_var_uri_str - .parse::<::url::Url>() - .ok() - .map_or(true, |url| { - configuration - .qcs_config - .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) - }); + let local_var_do_tracing = local_var_uri_str + .parse::<::url::Url>() + .ok() + .is_none_or(|url| { + configuration + .qcs_config + .should_trace(&::urlpattern::UrlPatternMatchInput::Url(url)) + }); if local_var_do_tracing { ::tracing::debug!( @@ -1151,7 +1144,7 @@ async fn list_reservations_inner( "No client credentials found, but this call does not require authentication." ); } else { - local_var_req_builder = local_var_req_builder.bearer_auth(token?); + local_var_req_builder = local_var_req_builder.bearer_auth(token?.secret()); } } diff --git a/qcs-api-client-openapi/src/models/account_type.rs b/qcs-api-client-openapi/src/models/account_type.rs index ede28eb..0bd8868 100644 --- a/qcs-api-client-openapi/src/models/account_type.rs +++ b/qcs-api-client-openapi/src/models/account_type.rs @@ -26,9 +26,10 @@ use serde::{Deserialize, Serialize}; /// There are two types of accounts within QCS: user (representing a single user in Okta) and group (representing one or more users in Okta). -#[derive(Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] +#[derive(Clone, Debug, Default, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] pub enum AccountType { #[serde(rename = "group")] + #[default] Group, #[serde(rename = "user")] User, @@ -46,9 +47,3 @@ impl std::fmt::Display for AccountType { } } } - -impl Default for AccountType { - fn default() -> AccountType { - Self::Group - } -} diff --git a/qcs-api-client-openapi/src/models/billing_invoice_line.rs b/qcs-api-client-openapi/src/models/billing_invoice_line.rs index c3db3a0..b5b272d 100644 --- a/qcs-api-client-openapi/src/models/billing_invoice_line.rs +++ b/qcs-api-client-openapi/src/models/billing_invoice_line.rs @@ -74,17 +74,13 @@ impl BillingInvoiceLine { } } -/// -#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] +#[derive( + Clone, Copy, Default, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize, +)] pub enum LineItemType { #[serde(rename = "invoiceitem")] + #[default] Invoiceitem, #[serde(rename = "subscription")] Subscription, } - -impl Default for LineItemType { - fn default() -> LineItemType { - Self::Invoiceitem - } -} diff --git a/qcs-api-client-openapi/src/models/billing_invoice_status.rs b/qcs-api-client-openapi/src/models/billing_invoice_status.rs index 156e20e..dd5c20f 100644 --- a/qcs-api-client-openapi/src/models/billing_invoice_status.rs +++ b/qcs-api-client-openapi/src/models/billing_invoice_status.rs @@ -24,10 +24,10 @@ use serde::{Deserialize, Serialize}; -/// -#[derive(Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] +#[derive(Clone, Debug, Default, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] pub enum BillingInvoiceStatus { #[serde(rename = "draft")] + #[default] Draft, #[serde(rename = "open")] Open, @@ -54,9 +54,3 @@ impl std::fmt::Display for BillingInvoiceStatus { } } } - -impl Default for BillingInvoiceStatus { - fn default() -> BillingInvoiceStatus { - Self::Draft - } -} diff --git a/qcs-api-client-openapi/src/models/billing_price.rs b/qcs-api-client-openapi/src/models/billing_price.rs index d9cc8ba..c6dfeff 100644 --- a/qcs-api-client-openapi/src/models/billing_price.rs +++ b/qcs-api-client-openapi/src/models/billing_price.rs @@ -74,28 +74,23 @@ impl BillingPrice { } /// This object's type, which is always `price`. -#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] +#[derive( + Clone, Copy, Default, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize, +)] pub enum Object { #[serde(rename = "price")] + #[default] Price, } -impl Default for Object { - fn default() -> Object { - Self::Price - } -} /// Use `one_time` to invoice immediately based on a single usage report, e.g. purchasing a QPU reservation. Use `recurring` to aggregate usage reports over an interval and then invoice once based on `BillingPriceRecurrence`, e.g. on-demand QPU usage. -#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] +#[derive( + Clone, Copy, Default, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize, +)] pub enum PriceType { #[serde(rename = "one_time")] + #[default] OneTime, #[serde(rename = "recurring")] Recurring, } - -impl Default for PriceType { - fn default() -> PriceType { - Self::OneTime - } -} diff --git a/qcs-api-client-openapi/src/models/billing_price_recurrence.rs b/qcs-api-client-openapi/src/models/billing_price_recurrence.rs index 08bff97..be93de0 100644 --- a/qcs-api-client-openapi/src/models/billing_price_recurrence.rs +++ b/qcs-api-client-openapi/src/models/billing_price_recurrence.rs @@ -54,9 +54,12 @@ impl BillingPriceRecurrence { } /// How to determine the aggregate usage over the `interval` when `usageType=metered`. Using `sum` is recommended. -#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] +#[derive( + Clone, Copy, Default, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize, +)] pub enum AggregateUsage { #[serde(rename = "last_during_period")] + #[default] LastDuringPeriod, #[serde(rename = "last_ever")] LastEver, @@ -66,15 +69,13 @@ pub enum AggregateUsage { Sum, } -impl Default for AggregateUsage { - fn default() -> AggregateUsage { - Self::LastDuringPeriod - } -} /// The frequency at which recurring usage should be billed. Using `month` is recommended. -#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] +#[derive( + Clone, Copy, Default, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize, +)] pub enum Interval { #[serde(rename = "day")] + #[default] Day, #[serde(rename = "month")] Month, @@ -84,22 +85,14 @@ pub enum Interval { Year, } -impl Default for Interval { - fn default() -> Interval { - Self::Day - } -} /// Use `metered` to calculate a dynamic quantity based on reported usage records (recommended). Use `licensed` when you provide a fixed quantity, e.g. a TV subscription. -#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] +#[derive( + Clone, Copy, Default, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize, +)] pub enum UsageType { #[serde(rename = "licensed")] + #[default] Licensed, #[serde(rename = "metered")] Metered, } - -impl Default for UsageType { - fn default() -> UsageType { - Self::Licensed - } -} diff --git a/qcs-api-client-openapi/src/models/billing_price_scheme.rs b/qcs-api-client-openapi/src/models/billing_price_scheme.rs index f71d323..744c99d 100644 --- a/qcs-api-client-openapi/src/models/billing_price_scheme.rs +++ b/qcs-api-client-openapi/src/models/billing_price_scheme.rs @@ -26,9 +26,10 @@ use serde::{Deserialize, Serialize}; /// Use `per_unit` to charge a linear rate per quantity (recommended). Use `tiered` to charge a dynamic rate based on quantity as defined in the `tiers` of a `BillingPice`. -#[derive(Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] +#[derive(Clone, Debug, Default, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] pub enum BillingPriceScheme { #[serde(rename = "per_unit")] + #[default] PerUnit, #[serde(rename = "tiered")] Tiered, @@ -46,9 +47,3 @@ impl std::fmt::Display for BillingPriceScheme { } } } - -impl Default for BillingPriceScheme { - fn default() -> BillingPriceScheme { - Self::PerUnit - } -} diff --git a/qcs-api-client-openapi/src/models/billing_price_tiers_mode.rs b/qcs-api-client-openapi/src/models/billing_price_tiers_mode.rs index 7983074..e4d717d 100644 --- a/qcs-api-client-openapi/src/models/billing_price_tiers_mode.rs +++ b/qcs-api-client-openapi/src/models/billing_price_tiers_mode.rs @@ -26,9 +26,10 @@ use serde::{Deserialize, Serialize}; /// Use `graduated` to apply each tier calculation to the portion of relevant quantity, e.g. how US federal tax brackets work. Use `volume` to apply the highest relevant tier to the entire quantity. -#[derive(Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] +#[derive(Clone, Debug, Default, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] pub enum BillingPriceTiersMode { #[serde(rename = "graduated")] + #[default] Graduated, #[serde(rename = "volume")] Volume, @@ -46,9 +47,3 @@ impl std::fmt::Display for BillingPriceTiersMode { } } } - -impl Default for BillingPriceTiersMode { - fn default() -> BillingPriceTiersMode { - Self::Graduated - } -} diff --git a/qcs-api-client-openapi/src/models/billing_product.rs b/qcs-api-client-openapi/src/models/billing_product.rs index c1cc659..9bfc3bf 100644 --- a/qcs-api-client-openapi/src/models/billing_product.rs +++ b/qcs-api-client-openapi/src/models/billing_product.rs @@ -57,14 +57,11 @@ impl BillingProduct { } /// This object's type, which is always `product`. -#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] +#[derive( + Clone, Copy, Default, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize, +)] pub enum Object { #[serde(rename = "product")] + #[default] ProductObject, } - -impl Default for Object { - fn default() -> Object { - Self::ProductObject - } -} diff --git a/qcs-api-client-openapi/src/models/checksum_description.rs b/qcs-api-client-openapi/src/models/checksum_description.rs index 4b55e8b..167f44a 100644 --- a/qcs-api-client-openapi/src/models/checksum_description.rs +++ b/qcs-api-client-openapi/src/models/checksum_description.rs @@ -38,15 +38,11 @@ impl ChecksumDescription { } } -/// -#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] +#[derive( + Clone, Copy, Default, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize, +)] pub enum Type { #[serde(rename = "md5")] + #[default] Md5, } - -impl Default for Type { - fn default() -> Type { - Self::Md5 - } -} diff --git a/qcs-api-client-openapi/src/models/code.rs b/qcs-api-client-openapi/src/models/code.rs index 804def3..c4a5ce1 100644 --- a/qcs-api-client-openapi/src/models/code.rs +++ b/qcs-api-client-openapi/src/models/code.rs @@ -26,9 +26,10 @@ use serde::{Deserialize, Serialize}; /// API error codes to indicate what kind of error occurred beyond what an HTTP status can convey. -#[derive(Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] +#[derive(Clone, Debug, Default, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] pub enum Code { #[serde(rename = "conflicting_resource_access")] + #[default] ConflictingResourceAccess, #[serde(rename = "resource_exists")] ResourceExists, @@ -67,9 +68,3 @@ impl std::fmt::Display for Code { } } } - -impl Default for Code { - fn default() -> Code { - Self::ConflictingResourceAccess - } -} diff --git a/qcs-api-client-openapi/src/models/family.rs b/qcs-api-client-openapi/src/models/family.rs index 41e9648..c0e9fdc 100644 --- a/qcs-api-client-openapi/src/models/family.rs +++ b/qcs-api-client-openapi/src/models/family.rs @@ -26,9 +26,10 @@ use serde::{Deserialize, Serialize}; /// Family identifier. Value 'None' implies the architecture has no specific layout topology. Value 'Full' implies that each node is connected to every other (a fully-connected architecture) For other values based on deployed architecture layouts (e.g. `Aspen` and `Ankaa`), refer to the architecture classes themselves for more details. -#[derive(Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] +#[derive(Clone, Debug, Default, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] pub enum Family { #[serde(rename = "None")] + #[default] None, #[serde(rename = "Full")] Full, @@ -52,9 +53,3 @@ impl std::fmt::Display for Family { } } } - -impl Default for Family { - fn default() -> Family { - Self::None - } -} diff --git a/qcs-api-client-openapi/src/models/nomad_job_datacenters.rs b/qcs-api-client-openapi/src/models/nomad_job_datacenters.rs index fbf73b2..a483e6d 100644 --- a/qcs-api-client-openapi/src/models/nomad_job_datacenters.rs +++ b/qcs-api-client-openapi/src/models/nomad_job_datacenters.rs @@ -26,9 +26,10 @@ use serde::{Deserialize, Serialize}; /// An enumeration. -#[derive(Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] +#[derive(Clone, Debug, Default, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] pub enum NomadJobDatacenters { #[serde(rename = "berkeley-775")] + #[default] Berkeley775, #[serde(rename = "fremont-fab")] FremontFab, @@ -49,9 +50,3 @@ impl std::fmt::Display for NomadJobDatacenters { } } } - -impl Default for NomadJobDatacenters { - fn default() -> NomadJobDatacenters { - Self::Berkeley775 - } -} diff --git a/qcs-api-client-openapi/src/models/product.rs b/qcs-api-client-openapi/src/models/product.rs index 9c147f7..c0f45c5 100644 --- a/qcs-api-client-openapi/src/models/product.rs +++ b/qcs-api-client-openapi/src/models/product.rs @@ -26,9 +26,10 @@ use serde::{Deserialize, Serialize}; /// The set of known QCS service products. -#[derive(Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] +#[derive(Clone, Debug, Default, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] pub enum Product { #[serde(rename = "reservationCreation")] + #[default] ReservationCreation, #[serde(rename = "qpuJobCompletion")] QpuJobCompletion, @@ -49,9 +50,3 @@ impl std::fmt::Display for Product { } } } - -impl Default for Product { - fn default() -> Product { - Self::ReservationCreation - } -} diff --git a/qcs-api-client-openapi/src/models/quantum_processor_accessor_type.rs b/qcs-api-client-openapi/src/models/quantum_processor_accessor_type.rs index f1b9bfb..730e198 100644 --- a/qcs-api-client-openapi/src/models/quantum_processor_accessor_type.rs +++ b/qcs-api-client-openapi/src/models/quantum_processor_accessor_type.rs @@ -26,9 +26,10 @@ use serde::{Deserialize, Serialize}; /// Types of access mechanisms for a QPU. Each accessor type has its own access characteristics, benefits, and drawbacks. -#[derive(Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] +#[derive(Clone, Debug, Default, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] pub enum QuantumProcessorAccessorType { #[serde(rename = "gateway.v1")] + #[default] GatewayV1, #[serde(untagged)] @@ -43,9 +44,3 @@ impl std::fmt::Display for QuantumProcessorAccessorType { } } } - -impl Default for QuantumProcessorAccessorType { - fn default() -> QuantumProcessorAccessorType { - Self::GatewayV1 - } -} diff --git a/qcs-api-client-openapi/src/models/validation_error.rs b/qcs-api-client-openapi/src/models/validation_error.rs index 55ffd69..f73cae9 100644 --- a/qcs-api-client-openapi/src/models/validation_error.rs +++ b/qcs-api-client-openapi/src/models/validation_error.rs @@ -44,10 +44,12 @@ impl ValidationError { } } -/// -#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] +#[derive( + Clone, Copy, Default, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize, +)] pub enum In { #[serde(rename = "header")] + #[default] Header, #[serde(rename = "query")] Query, @@ -56,9 +58,3 @@ pub enum In { #[serde(rename = "body")] Body, } - -impl Default for In { - fn default() -> In { - Self::Header - } -} diff --git a/qcs-api-client-openapi/src/models/validation_location.rs b/qcs-api-client-openapi/src/models/validation_location.rs index e4fc07a..57dea12 100644 --- a/qcs-api-client-openapi/src/models/validation_location.rs +++ b/qcs-api-client-openapi/src/models/validation_location.rs @@ -24,10 +24,10 @@ use serde::{Deserialize, Serialize}; -/// -#[derive(Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] +#[derive(Clone, Debug, Default, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize)] pub enum ValidationLocation { #[serde(rename = "header")] + #[default] Header, #[serde(rename = "query")] Query, @@ -51,9 +51,3 @@ impl std::fmt::Display for ValidationLocation { } } } - -impl Default for ValidationLocation { - fn default() -> ValidationLocation { - Self::Header - } -} From 05de9e5d6b2bcdeaaf702fd5235e4a630fb4c863 Mon Sep 17 00:00:00 2001 From: Kyle Strand Date: Thu, 18 Dec 2025 05:01:59 +0000 Subject: [PATCH 2/3] chore: prepare new release(s) --- qcs-api-client-common/CHANGELOG-py.md | 2 +- qcs-api-client-common/CHANGELOG.md | 2 +- qcs-api-client-common/Cargo.toml | 2 +- qcs-api-client-common/pyproject.toml | 2 +- qcs-api-client-grpc/CHANGELOG.md | 2 +- qcs-api-client-grpc/Cargo.toml | 4 ++-- qcs-api-client-openapi/CHANGELOG.md | 2 +- qcs-api-client-openapi/Cargo.toml | 4 ++-- 8 files changed, 10 insertions(+), 10 deletions(-) diff --git a/qcs-api-client-common/CHANGELOG-py.md b/qcs-api-client-common/CHANGELOG-py.md index 90454e5..0e3c2bc 100644 --- a/qcs-api-client-common/CHANGELOG-py.md +++ b/qcs-api-client-common/CHANGELOG-py.md @@ -1,4 +1,4 @@ -## 0.13.0-kstrand.0 (2025-12-18) +## 0.13.0-kstrand.1 (2025-12-18) ### Breaking Changes diff --git a/qcs-api-client-common/CHANGELOG.md b/qcs-api-client-common/CHANGELOG.md index a4a624d..e12335c 100644 --- a/qcs-api-client-common/CHANGELOG.md +++ b/qcs-api-client-common/CHANGELOG.md @@ -1,4 +1,4 @@ -## 0.13.0-kstrand.0 (2025-12-18) +## 0.13.0-kstrand.1 (2025-12-18) ### Breaking Changes diff --git a/qcs-api-client-common/Cargo.toml b/qcs-api-client-common/Cargo.toml index ac893d6..9fe877e 100644 --- a/qcs-api-client-common/Cargo.toml +++ b/qcs-api-client-common/Cargo.toml @@ -200,7 +200,7 @@ publish = true readme = 'README.md' repository = 'https://github.com/rigetti/qcs-api-client-rust' - version = '0.13.0-kstrand.0' + version = '0.13.0-kstrand.1' [package.metadata] [package.metadata.docs] diff --git a/qcs-api-client-common/pyproject.toml b/qcs-api-client-common/pyproject.toml index 06a95a4..d38fe3e 100644 --- a/qcs-api-client-common/pyproject.toml +++ b/qcs-api-client-common/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "qcs-api-client-common" -version = "0.13.0-kstrand.0kstrand.0" +version = "0.13.0-kstrand.1kstrand.1" description = "Contains core QCS client functionality and middleware implementations." readme = "README-py.md" license = { text = "Apache-2.0" } diff --git a/qcs-api-client-grpc/CHANGELOG.md b/qcs-api-client-grpc/CHANGELOG.md index 5d6ca55..4a0ef75 100644 --- a/qcs-api-client-grpc/CHANGELOG.md +++ b/qcs-api-client-grpc/CHANGELOG.md @@ -1,4 +1,4 @@ -## 0.13.0-kstrand.0 (2025-12-18) +## 0.13.0-kstrand.1 (2025-12-18) ### Breaking Changes diff --git a/qcs-api-client-grpc/Cargo.toml b/qcs-api-client-grpc/Cargo.toml index f725386..3b9a266 100644 --- a/qcs-api-client-grpc/Cargo.toml +++ b/qcs-api-client-grpc/Cargo.toml @@ -65,7 +65,7 @@ workspace = true [dependencies.qcs-api-client-common] - version = '0.13.0-kstrand.0' + version = '0.13.0-kstrand.1' workspace = true [dependencies.serde] @@ -172,4 +172,4 @@ publish = true readme = 'README.md' repository = 'https://github.com/rigetti/qcs-api-client-rust' - version = '0.13.0-kstrand.0' + version = '0.13.0-kstrand.1' diff --git a/qcs-api-client-openapi/CHANGELOG.md b/qcs-api-client-openapi/CHANGELOG.md index 96ea85c..a211a43 100644 --- a/qcs-api-client-openapi/CHANGELOG.md +++ b/qcs-api-client-openapi/CHANGELOG.md @@ -1,4 +1,4 @@ -## 0.14.0-kstrand.0 (2025-12-18) +## 0.14.0-kstrand.1 (2025-12-18) ### Breaking Changes diff --git a/qcs-api-client-openapi/Cargo.toml b/qcs-api-client-openapi/Cargo.toml index e31c002..96834ed 100644 --- a/qcs-api-client-openapi/Cargo.toml +++ b/qcs-api-client-openapi/Cargo.toml @@ -7,7 +7,7 @@ workspace = true [dependencies.qcs-api-client-common] - version = '0.13.0-kstrand.0' + version = '0.13.0-kstrand.1' workspace = true [dependencies.reqwest] @@ -72,4 +72,4 @@ name = 'qcs-api-client-openapi' publish = true repository = 'https://github.com/rigetti/qcs-api-client-rust' - version = '0.14.0-kstrand.0' + version = '0.14.0-kstrand.1' From e064fbbbde16f8b13386652d5d00707fab2e16f3 Mon Sep 17 00:00:00 2001 From: Kyle Strand Date: Thu, 18 Dec 2025 19:35:25 +0000 Subject: [PATCH 3/3] chore: prepare new release(s) --- Cargo.lock | 4763 +++++++++++++++++++++++++ Cargo.toml | 3 +- qcs-api-client-common/CHANGELOG-py.md | 2 +- qcs-api-client-common/CHANGELOG.md | 2 +- qcs-api-client-common/Cargo.toml | 2 +- qcs-api-client-common/pyproject.toml | 2 +- qcs-api-client-grpc/CHANGELOG.md | 2 +- qcs-api-client-grpc/Cargo.toml | 3 +- qcs-api-client-openapi/CHANGELOG.md | 2 +- qcs-api-client-openapi/Cargo.toml | 3 +- 10 files changed, 4773 insertions(+), 11 deletions(-) create mode 100644 Cargo.lock diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..3db2dca --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,4763 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "aho-corasick" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddd31a130427c27518df266943a5308ed92d4b226cc639f5a8f1002816174301" +dependencies = [ + "memchr", +] + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anyhow" +version = "1.0.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" + +[[package]] +name = "assert-json-diff" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47e4f2b81832e72834d7518d8487a0396a28cc408186a2e8854c0f98011faf12" +dependencies = [ + "serde", + "serde_json", +] + +[[package]] +name = "async-attributes" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3203e79f4dd9bdda415ed03cf14dae5a2bf775c683a00f94e9cd1faf0f596e5" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "async-channel" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" +dependencies = [ + "concurrent-queue", + "event-listener 2.5.3", + "futures-core", +] + +[[package]] +name = "async-channel" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-executor" +version = "1.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "497c00e0fd83a72a79a39fcbd8e3e2f055d6f6c7e025f3b3d91f4f8e76527fb8" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand", + "futures-lite", + "pin-project-lite", + "slab", +] + +[[package]] +name = "async-global-executor" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c" +dependencies = [ + "async-channel 2.5.0", + "async-executor", + "async-io", + "async-lock", + "blocking", + "futures-lite", + "once_cell", +] + +[[package]] +name = "async-io" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" +dependencies = [ + "autocfg", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite", + "parking", + "polling", + "rustix", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "async-lock" +version = "3.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fd03604047cee9b6ce9de9f70c6cd540a0520c813cbd49bae61f33ab80ed1dc" +dependencies = [ + "event-listener 5.4.1", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-object-pool" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1ac0219111eb7bb7cb76d4cf2cb50c598e7ae549091d3616f9e95442c18486f" +dependencies = [ + "async-lock", + "event-listener 5.4.1", +] + +[[package]] +name = "async-socks5" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8da2537846e16b96d2972ee52a3b355663872a1a687ce6d57a3b6f6b6a181c89" +dependencies = [ + "thiserror 1.0.69", + "tokio", +] + +[[package]] +name = "async-std" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c8e079a4ab67ae52b7403632e4618815d6db36d2a010cfe41b02c1b1578f93b" +dependencies = [ + "async-attributes", + "async-channel 1.9.0", + "async-global-executor", + "async-io", + "async-lock", + "crossbeam-utils", + "futures-channel", + "futures-core", + "futures-io", + "futures-lite", + "gloo-timers", + "kv-log-macro", + "log", + "memchr", + "once_cell", + "pin-project-lite", + "pin-utils", + "slab", + "wasm-bindgen-futures", +] + +[[package]] +name = "async-task" +version = "4.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" + +[[package]] +name = "async-tempfile" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8a57b75c36e16f4d015e60e6a177552976a99b6947724403c551bcfa7cb1207" +dependencies = [ + "tokio", + "uuid", +] + +[[package]] +name = "async-trait" +version = "0.1.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "atomic" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89cbf775b137e9b968e67227ef7f775587cde3fd31b0d8599dbd0f598a48340" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "aws-lc-rs" +version = "1.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a88aab2464f1f25453baa7a07c84c5b7684e274054ba06817f382357f77a288" +dependencies = [ + "aws-lc-sys", + "untrusted 0.7.1", + "zeroize", +] + +[[package]] +name = "aws-lc-sys" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b45afffdee1e7c9126814751f88dddc747f41d91da16c9551a0f1e8a11e788a1" +dependencies = [ + "cc", + "cmake", + "dunce", + "fs_extra", +] + +[[package]] +name = "axum" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b098575ebe77cb6d14fc7f32749631a6e44edbef6b796f89b020e99ba20d425" +dependencies = [ + "axum-core", + "bytes", + "form_urlencoded", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "itoa", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "serde_core", + "serde_json", + "serde_path_to_error", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tower 0.5.2", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "axum-core" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59446ce19cd142f8833f856eb31f3eb097812d1479ab224f54d72428ca21ea22" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "http-body-util", + "mime", + "pin-project-lite", + "sync_wrapper", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "backoff" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b62ddb9cb1ec0a098ad4bbf9344d0713fa193ae1a80af55febcff2627b6a00c1" +dependencies = [ + "futures-core", + "getrandom 0.2.16", + "instant", + "pin-project-lite", + "rand 0.8.5", + "tokio", +] + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "base64ct" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e050f626429857a27ddccb31e0aca21356bfa709c04041aefddac081a8f068a" + +[[package]] +name = "bitflags" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "blocking" +version = "1.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" +dependencies = [ + "async-channel 2.5.0", + "async-task", + "futures-io", + "futures-lite", + "piper", +] + +[[package]] +name = "bumpalo" +version = "3.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510" + +[[package]] +name = "bytemuck" +version = "1.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" + +[[package]] +name = "bytes" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" +dependencies = [ + "serde", +] + +[[package]] +name = "cc" +version = "1.2.49" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90583009037521a116abf44494efecd645ba48b6622457080f080b85544e2215" +dependencies = [ + "find-msvc-tools", + "jobserver", + "libc", + "shlex", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cfg-if" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" + +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + +[[package]] +name = "chrono" +version = "0.4.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" +dependencies = [ + "iana-time-zone", + "js-sys", + "num-traits", + "serde", + "wasm-bindgen", + "windows-link", +] + +[[package]] +name = "cmake" +version = "0.1.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75443c44cd6b379beb8c5b45d85d0773baf31cce901fe7bb252f4eff3008ef7d" +dependencies = [ + "cc", +] + +[[package]] +name = "colored" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fde0e0ec90c9dfb3b4b1a0891a7dcd0e2bffde2f7efed5fe7c9bb00e5bfb915e" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "cookie" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747" +dependencies = [ + "percent-encoding", + "time", + "version_check", +] + +[[package]] +name = "cookie_store" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fc4bff745c9b4c7fb1e97b25d13153da2bc7796260141df62378998d070207f" +dependencies = [ + "cookie", + "document-features", + "idna", + "log", + "publicsuffix", + "serde", + "serde_derive", + "serde_json", + "time", + "url", +] + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "darling" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.111", +] + +[[package]] +name = "darling_macro" +version = "0.20.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "der" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +dependencies = [ + "const-oid", + "pem-rfc7468", + "zeroize", +] + +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", + "serde", +] + +[[package]] +name = "derive_builder" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947" +dependencies = [ + "derive_builder_macro", +] + +[[package]] +name = "derive_builder_core" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "derive_builder_macro" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" +dependencies = [ + "derive_builder_core", + "syn 2.0.111", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "const-oid", + "crypto-common", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "document-features" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" +dependencies = [ + "litrs", +] + +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + +[[package]] +name = "event-listener" +version = "5.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" +dependencies = [ + "event-listener 5.4.1", + "pin-project-lite", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "figment" +version = "0.10.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cb01cd46b0cf372153850f4c6c272d9cbea2da513e07538405148f95bd789f3" +dependencies = [ + "atomic", + "parking_lot", + "pear", + "serde", + "tempfile", + "toml 0.8.23", + "uncased", + "version_check", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a3076410a55c90011c298b04d0cfa770b00fa04e1e3c97d3f6c9de105a03844" + +[[package]] +name = "fixedbitset" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "fs_extra" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" + +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-lite" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-timer" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi", + "wasip2", + "wasm-bindgen", +] + +[[package]] +name = "glob" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" + +[[package]] +name = "gloo-timers" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "h2" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" + +[[package]] +name = "headers" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3314d5adb5d94bcdf56771f2e50dbbc80bb4bdf88967526706205ac9eff24eb" +dependencies = [ + "base64 0.22.1", + "bytes", + "headers-core", + "http", + "httpdate", + "mime", + "sha1", +] + +[[package]] +name = "headers-core" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54b4a22553d4242c49fddb9ba998a99962b5cc6f22cb5a3482bec22522403ce4" +dependencies = [ + "http", +] + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + +[[package]] +name = "home" +version = "0.5.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "http" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "httpmock" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "511f510e9b1888d67f10bab4397f8b019d2a9b249a2c10acbce2d705b1b32e26" +dependencies = [ + "assert-json-diff", + "async-object-pool", + "async-trait", + "base64 0.22.1", + "bytes", + "crossbeam-utils", + "form_urlencoded", + "futures-timer", + "futures-util", + "headers", + "http", + "http-body-util", + "hyper", + "hyper-util", + "path-tree", + "regex", + "serde", + "serde_json", + "serde_regex", + "similar", + "stringmetrics", + "tabwriter", + "thiserror 2.0.17", + "tokio", + "tracing", + "url", +] + +[[package]] +name = "hyper" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "pin-utils", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-proxy2" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9043b7b23fb0bc4a1c7014c27b50a4fc42cc76206f71d34fc0dfe5b28ddc3faf" +dependencies = [ + "bytes", + "futures-util", + "headers", + "http", + "hyper", + "hyper-rustls 0.26.0", + "hyper-util", + "pin-project-lite", + "rustls-native-certs 0.7.3", + "tokio", + "tokio-rustls 0.25.0", + "tower-service", + "webpki", +] + +[[package]] +name = "hyper-rustls" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0bea761b46ae2b24eb4aef630d8d1c398157b6fc29e6350ecf090a0b70c952c" +dependencies = [ + "futures-util", + "http", + "hyper", + "hyper-util", + "log", + "rustls 0.22.4", + "rustls-native-certs 0.7.3", + "rustls-pki-types", + "tokio", + "tokio-rustls 0.25.0", + "tower-service", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" +dependencies = [ + "http", + "hyper", + "hyper-util", + "rustls 0.23.35", + "rustls-native-certs 0.8.2", + "rustls-pki-types", + "tokio", + "tokio-rustls 0.26.4", + "tower-service", + "webpki-roots", +] + +[[package]] +name = "hyper-socks2" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51c227614c208f7e7c2e040526912604a1a957fe467c9c2f5b06c5d032337dab" +dependencies = [ + "async-socks5", + "http", + "hyper", + "hyper-util", + "thiserror 1.0.69", + "tokio", + "tower-service", +] + +[[package]] +name = "hyper-timeout" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" +dependencies = [ + "hyper", + "hyper-util", + "pin-project-lite", + "tokio", + "tower-service", +] + +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes", + "http-body-util", + "hyper", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "727805d60e7938b76b826a6ef209eb70eaa1812794f9424d4a4e2d740662df5f" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "http", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2", + "system-configuration", + "tokio", + "tower-service", + "tracing", + "windows-registry", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "icu_collections" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" + +[[package]] +name = "icu_properties" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" + +[[package]] +name = "icu_provider" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "indexmap" +version = "2.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3ce74acf2" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "indoc" +version = "2.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79cf5c93f93228cf8efb3ba362535fb11199ac548a09ce117c9b1adc3030d706" +dependencies = [ + "rustversion", +] + +[[package]] +name = "inlinable_string" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8fae54786f62fb2918dcfae3d568594e50eb9b5c25bf04371af6fe7516452fb" + +[[package]] +name = "instant" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "inventory" +version = "0.3.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc61209c082fbeb19919bee74b176221b27223e27b65d781eb91af24eb1fb46e" +dependencies = [ + "rustversion", +] + +[[package]] +name = "ipnet" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" + +[[package]] +name = "iri-string" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f867b9d1d896b67beb18518eda36fdb77a32ea590de864f1325b294a6d14397" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys", + "log", + "thiserror 1.0.69", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[package]] +name = "jobserver" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" +dependencies = [ + "getrandom 0.3.4", + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "464a3709c7f55f1f721e5389aa6ea4e3bc6aba669353300af094b29ffbdde1d8" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "jsonwebtoken" +version = "9.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a87cc7a48537badeae96744432de36f4be2b4a34a05a5ef32e9dd8a1c169dde" +dependencies = [ + "base64 0.22.1", + "js-sys", + "pem", + "ring", + "serde", + "serde_json", + "simple_asn1", +] + +[[package]] +name = "jsonwebtoken" +version = "10.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c76e1c7d7df3e34443b3621b459b066a7b79644f059fc8b2db7070c825fd417e" +dependencies = [ + "aws-lc-rs", + "base64 0.22.1", + "getrandom 0.2.16", + "js-sys", + "pem", + "serde", + "serde_json", + "signature", + "simple_asn1", +] + +[[package]] +name = "kv-log-macro" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f" +dependencies = [ + "log", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +dependencies = [ + "spin", +] + +[[package]] +name = "libc" +version = "0.2.178" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37c93d8daa9d8a012fd8ab92f088405fb202ea0b6ab73ee2482ae66af4f42091" + +[[package]] +name = "libm" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" + +[[package]] +name = "linux-raw-sys" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" + +[[package]] +name = "litemap" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" + +[[package]] +name = "litrs" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" +dependencies = [ + "value-bag", +] + +[[package]] +name = "lru-slab" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + +[[package]] +name = "matchers" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" +dependencies = [ + "regex-automata", +] + +[[package]] +name = "matchit" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" + +[[package]] +name = "memchr" +version = "2.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "mime_guess" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" +dependencies = [ + "mime", + "unicase", +] + +[[package]] +name = "mio" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.61.2", +] + +[[package]] +name = "multimap" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084" + +[[package]] +name = "native-tls" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" +dependencies = [ + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework 2.11.1", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "nu-ansi-term" +version = "0.50.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-bigint-dig" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e661dda6640fad38e827a6d4a310ff4763082116fe217f279885c97f511bb0b7" +dependencies = [ + "lazy_static", + "libm", + "num-integer", + "num-iter", + "num-traits", + "rand 0.8.5", + "smallvec", + "zeroize", +] + +[[package]] +name = "num-complex" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "oauth2" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51e219e79014df21a225b1860a479e2dcd7cbd9130f4defd4bd0e191ea31d67d" +dependencies = [ + "base64 0.22.1", + "chrono", + "getrandom 0.2.16", + "http", + "rand 0.8.5", + "reqwest", + "serde", + "serde_json", + "serde_path_to_error", + "sha2", + "thiserror 1.0.69", + "url", +] + +[[package]] +name = "oauth2-test-server" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bb78cf155f91eba1d99533e49aafc31f5e7e42b9964d2c0c8470d6641accb54" +dependencies = [ + "axum", + "base64 0.21.7", + "chrono", + "colored", + "futures", + "http", + "jsonwebtoken 10.2.0", + "once_cell", + "rand 0.8.5", + "reqwest", + "rsa", + "serde", + "serde_json", + "sha2", + "tokio", + "tower-http 0.5.2", + "tracing", + "tracing-subscriber", + "url", + "uuid", +] + +[[package]] +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +dependencies = [ + "malloc_buf", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "openssl" +version = "0.10.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08838db121398ad17ab8531ce9de97b244589089e290a384c900cb9ff7434328" +dependencies = [ + "bitflags", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "openssl-probe" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" + +[[package]] +name = "openssl-sys" +version = "0.9.111" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82cab2d520aa75e3c58898289429321eb788c3106963d0dc886ec7a5f4adc321" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "opentelemetry" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e87237e2775f74896f9ad219d26a2081751187eb7c9f5c58dde20a23b95d16c" +dependencies = [ + "futures-core", + "futures-sink", + "js-sys", + "pin-project-lite", + "thiserror 2.0.17", + "tracing", +] + +[[package]] +name = "opentelemetry" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b84bcd6ae87133e903af7ef497404dda70c60d0ea14895fc8a5e6722754fc2a0" +dependencies = [ + "futures-core", + "futures-sink", + "js-sys", + "pin-project-lite", + "thiserror 2.0.17", + "tracing", +] + +[[package]] +name = "opentelemetry-http" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7a6d09a73194e6b66df7c8f1b680f156d916a1a942abf2de06823dd02b7855d" +dependencies = [ + "async-trait", + "bytes", + "http", + "opentelemetry 0.31.0", +] + +[[package]] +name = "opentelemetry_sdk" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afdefb21d1d47394abc1ba6c57363ab141be19e27cc70d0e422b7f303e4d290b" +dependencies = [ + "futures-channel", + "futures-executor", + "futures-util", + "glob", + "opentelemetry 0.29.1", + "percent-encoding", + "rand 0.9.2", + "thiserror 2.0.17", +] + +[[package]] +name = "opentelemetry_sdk" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e14ae4f5991976fd48df6d843de219ca6d31b01daaab2dad5af2badeded372bd" +dependencies = [ + "futures-channel", + "futures-executor", + "futures-util", + "opentelemetry 0.31.0", + "percent-encoding", + "rand 0.9.2", + "thiserror 2.0.17", +] + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-link", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "path-tree" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a97453bc21a968f722df730bfe11bd08745cb50d1300b0df2bda131dece136" +dependencies = [ + "smallvec", +] + +[[package]] +name = "pbjson" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8edd1efdd8ab23ba9cb9ace3d9987a72663d5d7c9f74fa00b51d6213645cf6c" +dependencies = [ + "base64 0.22.1", + "serde", +] + +[[package]] +name = "pbjson-build" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ed4d5c6ae95e08ac768883c8401cf0e8deb4e6e1d6a4e1fd3d2ec4f0ec63200" +dependencies = [ + "heck 0.5.0", + "itertools", + "prost", + "prost-types", +] + +[[package]] +name = "pbjson-types" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a14e2757d877c0f607a82ce1b8560e224370f159d66c5d52eb55ea187ef0350e" +dependencies = [ + "bytes", + "chrono", + "pbjson", + "pbjson-build", + "prost", + "prost-build", + "serde", +] + +[[package]] +name = "pear" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdeeaa00ce488657faba8ebf44ab9361f9365a97bd39ffb8a60663f57ff4b467" +dependencies = [ + "inlinable_string", + "pear_codegen", + "yansi", +] + +[[package]] +name = "pear_codegen" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bab5b985dc082b345f812b7df84e1bef27e7207b39e448439ba8bd69c93f147" +dependencies = [ + "proc-macro2", + "proc-macro2-diagnostics", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "pem" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d30c53c26bc5b31a98cd02d20f25a7c8567146caf63ed593a9d87b2775291be" +dependencies = [ + "base64 0.22.1", + "serde_core", +] + +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "petgraph" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3672b37090dbd86368a4145bc067582552b29c27377cad4e0a306c97f9bd7772" +dependencies = [ + "fixedbitset", + "indexmap", +] + +[[package]] +name = "pin-project" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "piper" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" +dependencies = [ + "atomic-waker", + "fastrand", + "futures-io", +] + +[[package]] +name = "pkcs1" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" +dependencies = [ + "der", + "pkcs8", + "spki", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "polling" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi", + "pin-project-lite", + "rustix", + "windows-sys 0.61.2", +] + +[[package]] +name = "portable-atomic" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" + +[[package]] +name = "potential_utf" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +dependencies = [ + "zerovec", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn 2.0.111", +] + +[[package]] +name = "proc-macro-crate" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" +dependencies = [ + "toml_edit 0.23.10+spec-1.0.0", +] + +[[package]] +name = "proc-macro2" +version = "1.0.103" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ee95bc4ef87b8d5ba32e8b7714ccc834865276eab0aed5c9958d00ec45f49e8" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "proc-macro2-diagnostics" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", + "version_check", + "yansi", +] + +[[package]] +name = "prost" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7231bd9b3d3d33c86b58adbac74b5ec0ad9f496b19d22801d773636feaa95f3d" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-build" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac6c3320f9abac597dcbc668774ef006702672474aad53c6d596b62e487b40b1" +dependencies = [ + "heck 0.5.0", + "itertools", + "log", + "multimap", + "once_cell", + "petgraph", + "prettyplease", + "prost", + "prost-types", + "pulldown-cmark", + "pulldown-cmark-to-cmark", + "regex", + "syn 2.0.111", + "tempfile", +] + +[[package]] +name = "prost-derive" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9120690fafc389a67ba3803df527d0ec9cbbc9cc45e4cc20b332996dfb672425" +dependencies = [ + "anyhow", + "itertools", + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "prost-types" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9b4db3d6da204ed77bb26ba83b6122a73aeb2e87e25fbf7ad2e84c4ccbf8f72" +dependencies = [ + "prost", +] + +[[package]] +name = "psl-types" +version = "2.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33cb294fe86a74cbcf50d4445b37da762029549ebeea341421c7c70370f86cac" + +[[package]] +name = "publicsuffix" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f42ea446cab60335f76979ec15e12619a2165b5ae2c12166bef27d283a9fadf" +dependencies = [ + "idna", + "psl-types", +] + +[[package]] +name = "pulldown-cmark" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e8bbe1a966bd2f362681a44f6edce3c2310ac21e4d5067a6e7ec396297a6ea0" +dependencies = [ + "bitflags", + "memchr", + "unicase", +] + +[[package]] +name = "pulldown-cmark-to-cmark" +version = "21.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8246feae3db61428fd0bb94285c690b460e4517d83152377543ca802357785f1" +dependencies = [ + "pulldown-cmark", +] + +[[package]] +name = "pyo3" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53bdbb96d49157e65d45cc287af5f32ffadd5f4761438b527b055fb0d4bb8233" +dependencies = [ + "cfg-if", + "indoc", + "inventory", + "libc", + "memoffset", + "num-complex", + "parking_lot", + "portable-atomic", + "pyo3-build-config 0.20.3", + "pyo3-ffi", + "pyo3-macros", + "unindent", +] + +[[package]] +name = "pyo3-asyncio" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ea6b68e93db3622f3bb3bf363246cf948ed5375afe7abff98ccbdd50b184995" +dependencies = [ + "futures", + "once_cell", + "pin-project-lite", + "pyo3", + "tokio", +] + +[[package]] +name = "pyo3-build-config" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "deaa5745de3f5231ce10517a1f5dd97d53e5a2fd77aa6b5842292085831d48d7" +dependencies = [ + "once_cell", + "target-lexicon", +] + +[[package]] +name = "pyo3-build-config" +version = "0.22.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b14b5775b5ff446dd1056212d778012cbe8a0fbffd368029fd9e25b514479c38" +dependencies = [ + "once_cell", + "target-lexicon", +] + +[[package]] +name = "pyo3-ffi" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b42531d03e08d4ef1f6e85a2ed422eb678b8cd62b762e53891c05faf0d4afa" +dependencies = [ + "libc", + "pyo3-build-config 0.20.3", +] + +[[package]] +name = "pyo3-macros" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7305c720fa01b8055ec95e484a6eca7a83c841267f0dd5280f0c8b8551d2c158" +dependencies = [ + "proc-macro2", + "pyo3-macros-backend", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "pyo3-macros-backend" +version = "0.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c7e9b68bb9c3149c5b0cade5d07f953d6d125eb4337723c4ccdb665f1f96185" +dependencies = [ + "heck 0.4.1", + "proc-macro2", + "pyo3-build-config 0.20.3", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "qcs-api-client-common" +version = "0.13.0-kstrand.2" +dependencies = [ + "async-tempfile", + "async-trait", + "backoff", + "derive_builder", + "figment", + "futures", + "home", + "http", + "http-body-util", + "httpmock", + "hyper", + "hyper-util", + "jsonwebtoken 9.3.1", + "oauth2", + "oauth2-test-server", + "paste", + "pyo3", + "pyo3-asyncio", + "pyo3-build-config 0.22.6", + "reqwest", + "rigetti-pyo3", + "rstest", + "serde", + "serde_json", + "serial_test", + "shellexpand", + "thiserror 2.0.17", + "time", + "tokio", + "tokio-util", + "toml 0.9.10+spec-1.1.0", + "toml_edit 0.23.10+spec-1.0.0", + "tracing", + "url", + "urlpattern", + "webbrowser", +] + +[[package]] +name = "qcs-api-client-grpc" +version = "0.13.0-kstrand.2" +dependencies = [ + "async-std", + "backoff", + "futures-util", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-proxy2", + "hyper-socks2", + "hyper-util", + "jsonwebtoken 9.3.1", + "once_cell", + "opentelemetry 0.31.0", + "opentelemetry-http", + "opentelemetry_sdk 0.31.0", + "pbjson", + "pbjson-build", + "pbjson-types", + "prost", + "prost-build", + "qcs-api-client-common", + "rstest", + "serde", + "serde_json", + "tempfile", + "thiserror 2.0.17", + "tokio", + "tokio-stream", + "tonic", + "tonic-build", + "tonic-health", + "tonic-prost", + "tonic-prost-build", + "tonic-web", + "tower 0.4.13", + "tower-http 0.5.2", + "tracing", + "tracing-opentelemetry 0.32.0", + "tracing-subscriber", + "url", + "urlpattern", + "uuid", +] + +[[package]] +name = "qcs-api-client-openapi" +version = "0.14.0-kstrand.2" +dependencies = [ + "anyhow", + "http", + "qcs-api-client-common", + "reqwest", + "reqwest-middleware 0.3.3", + "reqwest-tracing", + "rstest", + "serde", + "serde_json", + "tokio", + "tracing", + "tracing-opentelemetry 0.32.0", + "url", + "urlpattern", +] + +[[package]] +name = "quinn" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" +dependencies = [ + "bytes", + "cfg_aliases", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls 0.23.35", + "socket2", + "thiserror 2.0.17", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" +dependencies = [ + "bytes", + "getrandom 0.3.4", + "lru-slab", + "rand 0.9.2", + "ring", + "rustc-hash", + "rustls 0.23.35", + "rustls-pki-types", + "slab", + "thiserror 2.0.17", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2", + "tracing", + "windows-sys 0.60.2", +] + +[[package]] +name = "quote" +version = "1.0.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.3", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.3", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.16", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.4", +] + +[[package]] +name = "raw-window-handle" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags", +] + +[[package]] +name = "regex" +version = "1.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" + +[[package]] +name = "relative-path" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba39f3699c378cd8970968dcbff9c43159ea4cfbd88d43c00b22f2ef10a435d2" + +[[package]] +name = "reqwest" +version = "0.12.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b4c14b2d9afca6a60277086b0cc6a6ae0b568f6f7916c943a8cdc79f8be240f" +dependencies = [ + "base64 0.22.1", + "bytes", + "cookie", + "cookie_store", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls 0.27.7", + "hyper-tls", + "hyper-util", + "js-sys", + "log", + "mime", + "mime_guess", + "native-tls", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls 0.23.35", + "rustls-native-certs 0.8.2", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-native-tls", + "tokio-rustls 0.26.4", + "tokio-util", + "tower 0.5.2", + "tower-http 0.6.8", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", + "webpki-roots", +] + +[[package]] +name = "reqwest-middleware" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562ceb5a604d3f7c885a792d42c199fd8af239d0a51b2fa6a78aafa092452b04" +dependencies = [ + "anyhow", + "async-trait", + "http", + "reqwest", + "serde", + "thiserror 1.0.69", + "tower-service", +] + +[[package]] +name = "reqwest-middleware" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57f17d28a6e6acfe1733fe24bcd30774d13bffa4b8a22535b4c8c98423088d4e" +dependencies = [ + "anyhow", + "async-trait", + "http", + "reqwest", + "serde", + "thiserror 1.0.69", + "tower-service", +] + +[[package]] +name = "reqwest-tracing" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d70ea85f131b2ee9874f0b160ac5976f8af75f3c9badfe0d955880257d10bd83" +dependencies = [ + "anyhow", + "async-trait", + "getrandom 0.2.16", + "http", + "matchit", + "opentelemetry 0.29.1", + "reqwest", + "reqwest-middleware 0.4.2", + "tracing", + "tracing-opentelemetry 0.30.0", +] + +[[package]] +name = "rigetti-pyo3" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59068763670399bb3e895a17cc631d9214c3172b64fc74d3ab63dac7371c340" +dependencies = [ + "num-complex", + "num-traits", + "paste", + "pyo3", + "time", +] + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.16", + "libc", + "untrusted 0.9.0", + "windows-sys 0.52.0", +] + +[[package]] +name = "rsa" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40a0376c50d0358279d9d643e4bf7b7be212f1f4ff1da9070a7b54d22ef75c88" +dependencies = [ + "const-oid", + "digest", + "num-bigint-dig", + "num-integer", + "num-traits", + "pkcs1", + "pkcs8", + "rand_core 0.6.4", + "signature", + "spki", + "subtle", + "zeroize", +] + +[[package]] +name = "rstest" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5a3193c063baaa2a95a33f03035c8a72b83d97a54916055ba22d35ed3839d49" +dependencies = [ + "futures-timer", + "futures-util", + "rstest_macros", +] + +[[package]] +name = "rstest_macros" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c845311f0ff7951c5506121a9ad75aec44d083c31583b2ea5a30bcb0b0abba0" +dependencies = [ + "cfg-if", + "glob", + "proc-macro-crate", + "proc-macro2", + "quote", + "regex", + "relative-path", + "rustc_version", + "syn 2.0.111", + "unicode-ident", +] + +[[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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" +dependencies = [ + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustls" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf4ef73721ac7bcd79b2b315da7779d8fc09718c6b3d2d1b2d94850eb8c18432" +dependencies = [ + "log", + "ring", + "rustls-pki-types", + "rustls-webpki 0.102.8", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls" +version = "0.23.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "533f54bc6a7d4f647e46ad909549eda97bf5afc1585190ef692b4286b198bd8f" +dependencies = [ + "log", + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki 0.103.8", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-native-certs" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5bfb394eeed242e909609f56089eecfe5fda225042e8b171791b9c95f5931e5" +dependencies = [ + "openssl-probe", + "rustls-pemfile", + "rustls-pki-types", + "schannel", + "security-framework 2.11.1", +] + +[[package]] +name = "rustls-native-certs" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9980d917ebb0c0536119ba501e90834767bffc3d60641457fd84a1f3fd337923" +dependencies = [ + "openssl-probe", + "rustls-pki-types", + "schannel", + "security-framework 3.5.1", +] + +[[package]] +name = "rustls-pemfile" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21e6f2ab2928ca4291b86736a8bd920a277a399bba1589409d72154ff87c1282" +dependencies = [ + "web-time", + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.102.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted 0.9.0", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ffdfa2f5286e2247234e03f680868ac2815974dc39e00ea15adc445d0aafe52" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted 0.9.0", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scc" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46e6f046b7fef48e2660c57ed794263155d713de679057f2d0c169bfc6e756cc" +dependencies = [ + "sdd", +] + +[[package]] +name = "schannel" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "sdd" +version = "3.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "490dcfcbfef26be6800d11870ff2df8774fa6e86d047e3e8c8a76b25655e41ca" + +[[package]] +name = "security-framework" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +dependencies = [ + "bitflags", + "core-foundation 0.9.4", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework" +version = "3.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef" +dependencies = [ + "bitflags", + "core-foundation 0.10.1", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" + +[[package]] +name = "serde" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "serde_json" +version = "1.0.145" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", + "serde_core", +] + +[[package]] +name = "serde_path_to_error" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" +dependencies = [ + "itoa", + "serde", + "serde_core", +] + +[[package]] +name = "serde_regex" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8136f1a4ea815d7eac4101cfd0b16dc0cb5e1fe1b8609dfd728058656b7badf" +dependencies = [ + "regex", + "serde", +] + +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_spanned" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8bbf91e5a4d6315eee45e704372590b30e260ee83af6639d64557f51b067776" +dependencies = [ + "serde_core", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serial_test" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b258109f244e1d6891bf1053a55d63a5cd4f8f4c30cf9a1280989f80e7a1fa9" +dependencies = [ + "futures", + "log", + "once_cell", + "parking_lot", + "scc", + "serial_test_derive", +] + +[[package]] +name = "serial_test_derive" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d69265a08751de7844521fd15003ae0a888e035773ba05695c5c759a6f89eef" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "shellexpand" +version = "3.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b1fdf65dd6331831494dd616b30351c38e96e45921a27745cf98490458b90bb" + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook-registry" +version = "1.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7664a098b8e616bdfcc2dc0e9ac44eb231eedf41db4e9fe95d8d32ec728dedad" +dependencies = [ + "libc", +] + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest", + "rand_core 0.6.4", +] + +[[package]] +name = "similar" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbbb5d9659141646ae647b42fe094daf6c6192d1620870b449d9557f748b2daa" + +[[package]] +name = "simple_asn1" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "297f631f50729c8c99b84667867963997ec0b50f32b2a7dbcab828ef0541e8bb" +dependencies = [ + "num-bigint", + "num-traits", + "thiserror 2.0.17", + "time", +] + +[[package]] +name = "slab" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "socket2" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" +dependencies = [ + "libc", + "windows-sys 0.60.2", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "stringmetrics" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b3c8667cd96245cbb600b8dec5680a7319edd719c5aa2b5d23c6bff94f39765" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +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.111" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "system-configuration" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" +dependencies = [ + "bitflags", + "core-foundation 0.9.4", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "tabwriter" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fce91f2f0ec87dff7e6bcbbeb267439aa1188703003c6055193c821487400432" +dependencies = [ + "unicode-width", +] + +[[package]] +name = "target-lexicon" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" + +[[package]] +name = "tempfile" +version = "3.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" +dependencies = [ + "fastrand", + "getrandom 0.3.4", + "once_cell", + "rustix", + "windows-sys 0.61.2", +] + +[[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.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" +dependencies = [ + "thiserror-impl 2.0.17", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "thread_local" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "time" +version = "0.3.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" + +[[package]] +name = "time-macros" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinystr" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" +dependencies = [ + "bytes", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-macros" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio", +] + +[[package]] +name = "tokio-rustls" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "775e0c0f0adb3a2f22a00c4745d728b479985fc15ee7ca6a2608388c5569860f" +dependencies = [ + "rustls 0.22.4", + "rustls-pki-types", + "tokio", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +dependencies = [ + "rustls 0.23.35", + "tokio", +] + +[[package]] +name = "tokio-stream" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", + "tokio-util", +] + +[[package]] +name = "tokio-util" +version = "0.7.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2efa149fe76073d6e8fd97ef4f4eca7b67f599660115591483572e406e165594" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" +dependencies = [ + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.11", + "toml_edit 0.22.27", +] + +[[package]] +name = "toml" +version = "0.9.10+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0825052159284a1a8b4d6c0c86cbc801f2da5afd2b225fa548c72f2e74002f48" +dependencies = [ + "indexmap", + "serde_core", + "serde_spanned 1.0.4", + "toml_datetime 0.7.5+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow", +] + +[[package]] +name = "toml_datetime" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_datetime" +version = "0.7.5+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.22.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" +dependencies = [ + "indexmap", + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.11", + "toml_write", + "winnow", +] + +[[package]] +name = "toml_edit" +version = "0.23.10+spec-1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84c8b9f757e028cee9fa244aea147aab2a9ec09d5325a9b01e0a49730c2b5269" +dependencies = [ + "indexmap", + "toml_datetime 0.7.5+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow", +] + +[[package]] +name = "toml_parser" +version = "1.0.6+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3198b4b0a8e11f09dd03e133c0280504d0801269e9afa46362ffde1cbeebf44" +dependencies = [ + "winnow", +] + +[[package]] +name = "toml_write" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" + +[[package]] +name = "toml_writer" +version = "1.0.6+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab16f14aed21ee8bfd8ec22513f7287cd4a91aa92e44edfe2c17ddd004e92607" + +[[package]] +name = "tonic" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb7613188ce9f7df5bfe185db26c5814347d110db17920415cf2fbcad85e7203" +dependencies = [ + "async-trait", + "axum", + "base64 0.22.1", + "bytes", + "h2", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-timeout", + "hyper-util", + "percent-encoding", + "pin-project", + "rustls-native-certs 0.8.2", + "socket2", + "sync_wrapper", + "tokio", + "tokio-rustls 0.26.4", + "tokio-stream", + "tower 0.5.2", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tonic-build" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c40aaccc9f9eccf2cd82ebc111adc13030d23e887244bc9cfa5d1d636049de3" +dependencies = [ + "prettyplease", + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "tonic-health" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a82868bf299e0a1d2e8dce0dc33a46c02d6f045b2c1f1d6cc8dc3d0bf1812ef" +dependencies = [ + "prost", + "tokio", + "tokio-stream", + "tonic", + "tonic-prost", +] + +[[package]] +name = "tonic-prost" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66bd50ad6ce1252d87ef024b3d64fe4c3cf54a86fb9ef4c631fdd0ded7aeaa67" +dependencies = [ + "bytes", + "prost", + "tonic", +] + +[[package]] +name = "tonic-prost-build" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4a16cba4043dc3ff43fcb3f96b4c5c154c64cbd18ca8dce2ab2c6a451d058a2" +dependencies = [ + "prettyplease", + "proc-macro2", + "prost-build", + "prost-types", + "quote", + "syn 2.0.111", + "tempfile", + "tonic-build", +] + +[[package]] +name = "tonic-web" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75214f6b6bd28c19aa752ac09fdf0eea546095670906c21fe3940e180a4c43f2" +dependencies = [ + "base64 0.22.1", + "bytes", + "http", + "http-body", + "pin-project", + "tokio-stream", + "tonic", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "pin-project", + "pin-project-lite", + "tokio", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "indexmap", + "pin-project-lite", + "slab", + "sync_wrapper", + "tokio", + "tokio-util", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-http" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5" +dependencies = [ + "bitflags", + "bytes", + "http", + "http-body", + "http-body-util", + "pin-project-lite", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-http" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" +dependencies = [ + "bitflags", + "bytes", + "futures-util", + "http", + "http-body", + "iri-string", + "pin-project-lite", + "tower 0.5.2", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-opentelemetry" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd8e764bd6f5813fd8bebc3117875190c5b0415be8f7f8059bffb6ecd979c444" +dependencies = [ + "js-sys", + "once_cell", + "opentelemetry 0.29.1", + "opentelemetry_sdk 0.29.0", + "smallvec", + "tracing", + "tracing-core", + "tracing-log", + "tracing-subscriber", + "web-time", +] + +[[package]] +name = "tracing-opentelemetry" +version = "0.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6e5658463dd88089aba75c7791e1d3120633b1bfde22478b28f625a9bb1b8e" +dependencies = [ + "js-sys", + "opentelemetry 0.31.0", + "opentelemetry_sdk 0.31.0", + "rustversion", + "smallvec", + "thiserror 2.0.17", + "tracing", + "tracing-core", + "tracing-log", + "tracing-subscriber", + "web-time", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f30143827ddab0d256fd843b7a66d164e9f271cfa0dde49142c5ca0ca291f1e" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex-automata", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "typenum" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" + +[[package]] +name = "uncased" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1b88fcfe09e89d3866a5c11019378088af2d24c3fbd4f0543f96b479ec90697" +dependencies = [ + "version_check", +] + +[[package]] +name = "unicase" +version = "2.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b844d17643ee918803943289730bec8aac480150456169e647ed0b576ba539" + +[[package]] +name = "unicode-ident" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5" + +[[package]] +name = "unicode-width" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" + +[[package]] +name = "unindent" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7264e107f553ccae879d21fbea1d6724ac785e8c3bfc762137959b5802826ef3" + +[[package]] +name = "untrusted" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "urlpattern" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f805818f843b548bacc19609eb3619dd2850e54746f5cada37927393c2ef4ec" +dependencies = [ + "icu_properties", + "regex", + "serde", + "url", +] + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "uuid" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2e054861b4bd027cd373e18e8d8d8e6548085000e41290d95ce0c373a654b4a" +dependencies = [ + "getrandom 0.3.4", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[package]] +name = "value-bag" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ba6f5989077681266825251a52748b8c1d8a4ad098cc37e440103d0ea717fc0" + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasip2" +version = "1.0.1+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d759f433fa64a2d763d1340820e46e111a7a5ab75f993d1852d70b03dbb80fd" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "836d9622d604feee9e5de25ac10e3ea5f2d65b41eac0d9ce72eb5deae707ce7c" +dependencies = [ + "cfg-if", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48cb0d2638f8baedbc542ed444afc0644a29166f1595371af4fecf8ce1e7eeb3" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cefb59d5cd5f92d9dcf80e4683949f15ca4b511f4ac0a6e14d4e1ac60c6ecd40" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 2.0.111", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbc538057e648b67f72a982e708d485b2efa771e1ac05fec311f9f63e5800db4" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-streams" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "web-sys" +version = "0.3.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b32828d774c412041098d182a8b38b16ea816958e07cf40eec2bc080ae137ac" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webbrowser" +version = "0.8.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db67ae75a9405634f5882791678772c94ff5f16a66535aae186e26aa0841fc8b" +dependencies = [ + "core-foundation 0.9.4", + "home", + "jni", + "log", + "ndk-context", + "objc", + "raw-window-handle", + "url", + "web-sys", +] + +[[package]] +name = "webpki" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed63aea5ce73d0ff405984102c42de94fc55a6b75765d621c65262469b3c9b53" +dependencies = [ + "ring", + "untrusted 0.9.0", +] + +[[package]] +name = "webpki-roots" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2878ef029c47c6e8cf779119f20fcf52bde7ad42a731b2a304bc221df17571e" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "winapi-util" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-registry" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720" +dependencies = [ + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.5", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +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", +] + +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + +[[package]] +name = "winnow" +version = "0.7.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" +dependencies = [ + "memchr", +] + +[[package]] +name = "wit-bindgen" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" + +[[package]] +name = "writeable" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" + +[[package]] +name = "yansi" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" + +[[package]] +name = "yoke" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.8.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd74ec98b9250adb3ca554bdde269adf631549f51d8a8f8f0a10b50f1cb298c3" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8a8d209fdf45cf5138cbb5a506f6b52522a25afccc534d1475dad8e31105c6a" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" + +[[package]] +name = "zerotrie" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] diff --git a/Cargo.toml b/Cargo.toml index 166726c..96646c7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -92,10 +92,11 @@ [workspace.dependencies.qcs-api-client-common] path = 'qcs-api-client-common' - version = '0.12.12' + version = '0.13.0-kstrand.2' [workspace.dependencies.qcs-api-client-grpc] path = 'qcs-api-client-grpc' + version = '0.13.0-kstrand.2' [workspace.dependencies.qcs-api-client-grpc-internal] path = 'qcs-api-client-grpc-internal' diff --git a/qcs-api-client-common/CHANGELOG-py.md b/qcs-api-client-common/CHANGELOG-py.md index 0e3c2bc..fc4f06f 100644 --- a/qcs-api-client-common/CHANGELOG-py.md +++ b/qcs-api-client-common/CHANGELOG-py.md @@ -1,4 +1,4 @@ -## 0.13.0-kstrand.1 (2025-12-18) +## 0.13.0-kstrand.2 (2025-12-18) ### Breaking Changes diff --git a/qcs-api-client-common/CHANGELOG.md b/qcs-api-client-common/CHANGELOG.md index e12335c..8404ae1 100644 --- a/qcs-api-client-common/CHANGELOG.md +++ b/qcs-api-client-common/CHANGELOG.md @@ -1,4 +1,4 @@ -## 0.13.0-kstrand.1 (2025-12-18) +## 0.13.0-kstrand.2 (2025-12-18) ### Breaking Changes diff --git a/qcs-api-client-common/Cargo.toml b/qcs-api-client-common/Cargo.toml index 9fe877e..a4ff033 100644 --- a/qcs-api-client-common/Cargo.toml +++ b/qcs-api-client-common/Cargo.toml @@ -200,7 +200,7 @@ publish = true readme = 'README.md' repository = 'https://github.com/rigetti/qcs-api-client-rust' - version = '0.13.0-kstrand.1' + version = '0.13.0-kstrand.2' [package.metadata] [package.metadata.docs] diff --git a/qcs-api-client-common/pyproject.toml b/qcs-api-client-common/pyproject.toml index d38fe3e..4df528c 100644 --- a/qcs-api-client-common/pyproject.toml +++ b/qcs-api-client-common/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "qcs-api-client-common" -version = "0.13.0-kstrand.1kstrand.1" +version = "0.13.0-kstrand.2kstrand.2" description = "Contains core QCS client functionality and middleware implementations." readme = "README-py.md" license = { text = "Apache-2.0" } diff --git a/qcs-api-client-grpc/CHANGELOG.md b/qcs-api-client-grpc/CHANGELOG.md index 4a0ef75..eedf2eb 100644 --- a/qcs-api-client-grpc/CHANGELOG.md +++ b/qcs-api-client-grpc/CHANGELOG.md @@ -1,4 +1,4 @@ -## 0.13.0-kstrand.1 (2025-12-18) +## 0.13.0-kstrand.2 (2025-12-18) ### Breaking Changes diff --git a/qcs-api-client-grpc/Cargo.toml b/qcs-api-client-grpc/Cargo.toml index 3b9a266..480c43f 100644 --- a/qcs-api-client-grpc/Cargo.toml +++ b/qcs-api-client-grpc/Cargo.toml @@ -65,7 +65,6 @@ workspace = true [dependencies.qcs-api-client-common] - version = '0.13.0-kstrand.1' workspace = true [dependencies.serde] @@ -172,4 +171,4 @@ publish = true readme = 'README.md' repository = 'https://github.com/rigetti/qcs-api-client-rust' - version = '0.13.0-kstrand.1' + version = '0.13.0-kstrand.2' diff --git a/qcs-api-client-openapi/CHANGELOG.md b/qcs-api-client-openapi/CHANGELOG.md index a211a43..0033d96 100644 --- a/qcs-api-client-openapi/CHANGELOG.md +++ b/qcs-api-client-openapi/CHANGELOG.md @@ -1,4 +1,4 @@ -## 0.14.0-kstrand.1 (2025-12-18) +## 0.14.0-kstrand.2 (2025-12-18) ### Breaking Changes diff --git a/qcs-api-client-openapi/Cargo.toml b/qcs-api-client-openapi/Cargo.toml index 96834ed..348ccbe 100644 --- a/qcs-api-client-openapi/Cargo.toml +++ b/qcs-api-client-openapi/Cargo.toml @@ -7,7 +7,6 @@ workspace = true [dependencies.qcs-api-client-common] - version = '0.13.0-kstrand.1' workspace = true [dependencies.reqwest] @@ -72,4 +71,4 @@ name = 'qcs-api-client-openapi' publish = true repository = 'https://github.com/rigetti/qcs-api-client-rust' - version = '0.14.0-kstrand.1' + version = '0.14.0-kstrand.2'