mirror of
https://github.com/microsoft/regorus.git
synced 2026-08-05 02:16:11 +00:00
Compare commits
13 Commits
copilot/fi
...
regorus-v0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f98865fc98 | ||
|
|
6ef5e74eb2 | ||
|
|
9a486c79bf | ||
|
|
9838b25fb7 | ||
|
|
f0acc64195 | ||
|
|
166ea727b8 | ||
|
|
4c45ebfb61 | ||
|
|
41e1303213 | ||
|
|
9b42239327 | ||
|
|
9b6ad0bdac | ||
|
|
c394725e41 | ||
|
|
4b8874be9c | ||
|
|
096c693155 |
29
CHANGELOG.md
29
CHANGELOG.md
@@ -6,6 +6,35 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||
|
||||
## [Unreleased]
|
||||
|
||||
## [0.11.0](https://github.com/microsoft/regorus/compare/regorus-v0.10.1...regorus-v0.11.0) - 2026-07-21
|
||||
|
||||
### Added
|
||||
|
||||
- *(compiler)* support registered host-await builtins for natural function call syntax ([#667](https://github.com/microsoft/regorus/pull/667))
|
||||
- *(value)* introduce Set storage abstraction ([#740](https://github.com/microsoft/regorus/pull/740))
|
||||
|
||||
### Fixed
|
||||
|
||||
- *(rvm)* assert every-quantifier results so failing cases don't pass ([#765](https://github.com/microsoft/regorus/pull/765))
|
||||
- `Engine::add_data` now deep-merges nested data documents instead of only merging top-level keys. Adding `{ "a": { "x": 1 } }` followed by `{ "a": { "y": 2 } }` now yields `{ "a": { "x": 1, "y": 2 } }` (matching OPA's data-document merge). Nested sets under a shared key are unioned. Only genuine leaf conflicts (the same path holding two different values) are reported as errors. ([#760](https://github.com/microsoft/regorus/pull/760))
|
||||
- A zero-arg function producing two different complete values (e.g. `f() := { "a": 1 }` and `f() := { "b": 2 }`) is now reported as a conflict, matching OPA's complete-rule semantics, instead of silently combining the outputs.
|
||||
|
||||
### Security
|
||||
|
||||
- `Engine::add_data` now rejects data nested beyond 128 levels instead of risking a stack overflow on adversarially deep input.
|
||||
|
||||
### Other
|
||||
|
||||
- *(deps)* bump the rust-dependencies group across 5 directories with 11 updates ([#764](https://github.com/microsoft/regorus/pull/764))
|
||||
- Expand keyword-in-ref coverage for complex parser edge cases (interpreter + RVM) ([#744](https://github.com/microsoft/regorus/pull/744))
|
||||
- *(deps)* bump the rust-dependencies group across 5 directories with 4 updates ([#754](https://github.com/microsoft/regorus/pull/754))
|
||||
- *(deps)* bump the rust-dependencies group across 5 directories with 6 updates ([#750](https://github.com/microsoft/regorus/pull/750))
|
||||
- *(value)* migrate Value::Object to Object storage abstraction ([#736](https://github.com/microsoft/regorus/pull/736))
|
||||
- normalize path separators in folder filter on Windows ([#742](https://github.com/microsoft/regorus/pull/742))
|
||||
- Introduce Object storage abstraction ([#735](https://github.com/microsoft/regorus/pull/735))
|
||||
- *(rvm)* add debug-mode invariant assertions ([#737](https://github.com/microsoft/regorus/pull/737))
|
||||
- *(deps)* bump the rust-dependencies group across 5 directories with 5 updates ([#734](https://github.com/microsoft/regorus/pull/734))
|
||||
|
||||
## [0.10.1](https://github.com/microsoft/regorus/compare/regorus-v0.10.0...regorus-v0.10.1) - 2026-05-22
|
||||
|
||||
### Fixed
|
||||
|
||||
488
Cargo.lock
generated
488
Cargo.lock
generated
@@ -113,9 +113,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "anyhow"
|
||||
version = "1.0.102"
|
||||
version = "1.0.103"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c"
|
||||
checksum = "2a4385e2e34eb35d6b3efe798b9eb88096925d87726c0798709bf56d9ed84af3"
|
||||
|
||||
[[package]]
|
||||
name = "autocfg"
|
||||
@@ -140,9 +140,9 @@ checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7"
|
||||
|
||||
[[package]]
|
||||
name = "bitflags"
|
||||
version = "2.11.1"
|
||||
version = "2.13.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3"
|
||||
checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da"
|
||||
|
||||
[[package]]
|
||||
name = "borrow-or-share"
|
||||
@@ -152,12 +152,12 @@ checksum = "dc0b364ead1874514c8c2855ab558056ebfeb775653e7ae45ff72f28f8f3166c"
|
||||
|
||||
[[package]]
|
||||
name = "bstr"
|
||||
version = "1.12.1"
|
||||
version = "1.13.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "63044e1ae8e69f3b5a92c736ca6269b8d12fa7efe39bf34ddb06d102cf0e2cab"
|
||||
checksum = "1f7dc094d718f2e1c1559ad110e27eeaae14a5465d3d56dd6dbd793079fbd530"
|
||||
dependencies = [
|
||||
"memchr",
|
||||
"serde",
|
||||
"serde_core",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -180,9 +180,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5"
|
||||
|
||||
[[package]]
|
||||
name = "cc"
|
||||
version = "1.2.62"
|
||||
version = "1.2.67"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a1dce859f0832a7d088c4f1119888ab94ef4b5d6795d1ce05afb7fe159d79f98"
|
||||
checksum = "e17dd265a7d0f31ef544e1b20e03add05d3b45b491b633b10d67145d2acc1a38"
|
||||
dependencies = [
|
||||
"find-msvc-tools",
|
||||
"shlex",
|
||||
@@ -196,9 +196,9 @@ checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
|
||||
|
||||
[[package]]
|
||||
name = "chacha20"
|
||||
version = "0.10.0"
|
||||
version = "0.10.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6f8d983286843e49675a4b7a2d174efe136dc93a18d69130dd18198a6c167601"
|
||||
checksum = "d524456ba66e72eb8b115ff89e01e497f8e6d11d78b70b1aa13c0fbd97540a81"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"cpufeatures",
|
||||
@@ -207,9 +207,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "chrono"
|
||||
version = "0.4.44"
|
||||
version = "0.4.45"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0"
|
||||
checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327"
|
||||
dependencies = [
|
||||
"iana-time-zone",
|
||||
"js-sys",
|
||||
@@ -257,9 +257,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "clap"
|
||||
version = "4.6.1"
|
||||
version = "4.6.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51"
|
||||
checksum = "dd059f9da4f5c36b3787f65d38ccaab1cc315f07b01f89abc8359ee6a8205011"
|
||||
dependencies = [
|
||||
"clap_builder",
|
||||
"clap_derive",
|
||||
@@ -267,9 +267,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "clap_builder"
|
||||
version = "4.6.0"
|
||||
version = "4.6.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f"
|
||||
checksum = "f09628afdcc538b57f3c6341e9c8e9970f18e4a481690a64974d7023bd33548b"
|
||||
dependencies = [
|
||||
"anstream",
|
||||
"anstyle",
|
||||
@@ -285,8 +285,8 @@ checksum = "f2ce8604710f6733aa641a2b3731eaa1e8b3d9973d5e3565da11800813f997a9"
|
||||
dependencies = [
|
||||
"heck",
|
||||
"proc-macro2 1.0.106",
|
||||
"quote 1.0.45",
|
||||
"syn 2.0.117",
|
||||
"quote 1.0.46",
|
||||
"syn 2.0.119",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -371,9 +371,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "crossbeam-deque"
|
||||
version = "0.8.6"
|
||||
version = "0.8.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51"
|
||||
checksum = "5181e0de7b61eb03a81e347d6dd8797bae9da5146707b51077e2d71a54ec0ceb"
|
||||
dependencies = [
|
||||
"crossbeam-epoch",
|
||||
"crossbeam-utils",
|
||||
@@ -381,18 +381,18 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "crossbeam-epoch"
|
||||
version = "0.9.18"
|
||||
version = "0.9.20"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e"
|
||||
checksum = "2d6914041f254d6e9176c01941b21115dcfb7089e55135a35411081bd106ef3f"
|
||||
dependencies = [
|
||||
"crossbeam-utils",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crossbeam-utils"
|
||||
version = "0.8.21"
|
||||
version = "0.8.22"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
|
||||
checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17"
|
||||
|
||||
[[package]]
|
||||
name = "crunchy"
|
||||
@@ -427,8 +427,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1ac70aa55017e108007fbaf5aa0f54b021c98f92ff8af59d42eda9da96e3dd4f"
|
||||
dependencies = [
|
||||
"proc-macro2 1.0.106",
|
||||
"quote 1.0.45",
|
||||
"syn 2.0.117",
|
||||
"quote 1.0.46",
|
||||
"syn 2.0.119",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -510,12 +510,6 @@ dependencies = [
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "foldhash"
|
||||
version = "0.1.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2"
|
||||
|
||||
[[package]]
|
||||
name = "foldhash"
|
||||
version = "0.2.0"
|
||||
@@ -581,16 +575,14 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "getrandom"
|
||||
version = "0.4.2"
|
||||
version = "0.4.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555"
|
||||
checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"libc",
|
||||
"r-efi 6.0.0",
|
||||
"rand_core",
|
||||
"wasip2",
|
||||
"wasip3",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -601,9 +593,9 @@ checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280"
|
||||
|
||||
[[package]]
|
||||
name = "globset"
|
||||
version = "0.4.18"
|
||||
version = "0.4.19"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "52dfc19153a48bde0cbd630453615c8151bce3a5adfac7a0aebfbf0a1e1f57e3"
|
||||
checksum = "e47d37d2ae4464254884b60ab7071be2b876a9c35b696bd018ddcc76847309cd"
|
||||
dependencies = [
|
||||
"aho-corasick",
|
||||
"bstr",
|
||||
@@ -628,33 +620,15 @@ version = "0.14.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
|
||||
|
||||
[[package]]
|
||||
name = "hashbrown"
|
||||
version = "0.15.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1"
|
||||
dependencies = [
|
||||
"foldhash 0.1.5",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "hashbrown"
|
||||
version = "0.16.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100"
|
||||
dependencies = [
|
||||
"allocator-api2",
|
||||
"equivalent",
|
||||
"foldhash 0.2.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "hashbrown"
|
||||
version = "0.17.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a"
|
||||
dependencies = [
|
||||
"foldhash 0.2.0",
|
||||
"allocator-api2",
|
||||
"equivalent",
|
||||
"foldhash",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -801,12 +775,6 @@ dependencies = [
|
||||
"zerovec",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "id-arena"
|
||||
version = "2.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954"
|
||||
|
||||
[[package]]
|
||||
name = "idna"
|
||||
version = "1.1.0"
|
||||
@@ -869,21 +837,20 @@ checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682"
|
||||
|
||||
[[package]]
|
||||
name = "js-sys"
|
||||
version = "0.3.99"
|
||||
version = "0.3.103"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "142bc4740e452c1e57ade0cbc129f139c9093e354346f0872ef985f4f5cf5f11"
|
||||
checksum = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"futures-util",
|
||||
"once_cell",
|
||||
"wasm-bindgen",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "jsonschema"
|
||||
version = "0.46.5"
|
||||
version = "0.47.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6a5fe5206f06e589caf25e79fc05ccdf91fca745685fe9fe1a13bbdfb479a631"
|
||||
checksum = "281c43ff06dcb331e9356d30e38853d559ce3d0a3f693e0b0e102667dec14fb1"
|
||||
dependencies = [
|
||||
"ahash",
|
||||
"bytecount",
|
||||
@@ -894,33 +861,36 @@ dependencies = [
|
||||
"getrandom 0.3.4",
|
||||
"idna",
|
||||
"itoa",
|
||||
"jsonschema-regex",
|
||||
"num-cmp",
|
||||
"num-traits",
|
||||
"percent-encoding",
|
||||
"referencing",
|
||||
"regex",
|
||||
"regex-syntax",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"unicode-general-category",
|
||||
"uuid-simd",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "jsonschema-regex"
|
||||
version = "0.47.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ee0b351864e7ffbc5db9273daf7fa1b4d5177b0946713d667ca571b83c0b4045"
|
||||
dependencies = [
|
||||
"regex-syntax",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "lazy_static"
|
||||
version = "1.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
|
||||
dependencies = [
|
||||
"spin 0.9.8",
|
||||
"spin 0.9.9",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "leb128fmt"
|
||||
version = "0.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2"
|
||||
|
||||
[[package]]
|
||||
name = "libc"
|
||||
version = "0.2.186"
|
||||
@@ -944,21 +914,21 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "log"
|
||||
version = "0.4.30"
|
||||
version = "0.4.33"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "616ec5685824bcc94416c6d4a7a446eea774a31efd7062c8480ba6fd06d7a6e5"
|
||||
checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad"
|
||||
|
||||
[[package]]
|
||||
name = "lru"
|
||||
version = "0.18.0"
|
||||
version = "0.18.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8a860605968fce16869fd239cf4237a82f3ac470723415db603b0e8b6c8d4fb9"
|
||||
checksum = "0b6180140927ee907000b0aa540091f6ea512ead4447c92b8fc35bc72788a5a6"
|
||||
|
||||
[[package]]
|
||||
name = "memchr"
|
||||
version = "2.8.1"
|
||||
version = "2.8.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6b947ae49db0d222b1dbc6b113ce7248a3fc3a6ca21b696717bfc000ba4484d8"
|
||||
checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98"
|
||||
|
||||
[[package]]
|
||||
name = "micromap"
|
||||
@@ -991,7 +961,7 @@ version = "0.4.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23"
|
||||
dependencies = [
|
||||
"num-bigint",
|
||||
"num-bigint 0.4.8",
|
||||
"num-complex",
|
||||
"num-integer",
|
||||
"num-iter",
|
||||
@@ -1001,9 +971,19 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "num-bigint"
|
||||
version = "0.4.6"
|
||||
version = "0.4.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9"
|
||||
checksum = "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367"
|
||||
dependencies = [
|
||||
"num-integer",
|
||||
"num-traits",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "num-bigint"
|
||||
version = "0.5.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "93e7820bc0a80a0238e650327316f929ba18d5be054b647490a3a6a339f3e7c0"
|
||||
dependencies = [
|
||||
"num-integer",
|
||||
"num-traits",
|
||||
@@ -1035,11 +1015,10 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "num-iter"
|
||||
version = "0.1.45"
|
||||
version = "0.1.46"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf"
|
||||
checksum = "c92800bd69a1eac91786bcfe9da64a897eb72911b8dc3095decbd07429e8048b"
|
||||
dependencies = [
|
||||
"autocfg",
|
||||
"num-integer",
|
||||
"num-traits",
|
||||
]
|
||||
@@ -1050,7 +1029,7 @@ version = "0.4.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824"
|
||||
dependencies = [
|
||||
"num-bigint",
|
||||
"num-bigint 0.4.8",
|
||||
"num-integer",
|
||||
"num-traits",
|
||||
]
|
||||
@@ -1227,23 +1206,13 @@ dependencies = [
|
||||
"owo-colors",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "prettyplease"
|
||||
version = "0.2.37"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b"
|
||||
dependencies = [
|
||||
"proc-macro2 1.0.106",
|
||||
"syn 2.0.117",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro2"
|
||||
version = "0.4.30"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cf3d2011ab5c909338f7887f4fc896d35932e29146c12c8d01da6b22a80ba759"
|
||||
dependencies = [
|
||||
"unicode-xid 0.1.0",
|
||||
"unicode-xid",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -1266,9 +1235,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "quote"
|
||||
version = "1.0.45"
|
||||
version = "1.0.46"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924"
|
||||
checksum = "dfbc457d0c7a0759a614551b11a6409e5951f6c7537be1f1b7682b9ae9230368"
|
||||
dependencies = [
|
||||
"proc-macro2 1.0.106",
|
||||
]
|
||||
@@ -1287,12 +1256,12 @@ checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf"
|
||||
|
||||
[[package]]
|
||||
name = "rand"
|
||||
version = "0.10.1"
|
||||
version = "0.10.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d2e8e8bcc7961af1fdac401278c6a831614941f6164ee3bf4ce61b7edb162207"
|
||||
checksum = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80"
|
||||
dependencies = [
|
||||
"chacha20",
|
||||
"getrandom 0.4.2",
|
||||
"getrandom 0.4.3",
|
||||
"rand_core",
|
||||
]
|
||||
|
||||
@@ -1347,20 +1316,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da"
|
||||
dependencies = [
|
||||
"proc-macro2 1.0.106",
|
||||
"quote 1.0.45",
|
||||
"syn 2.0.117",
|
||||
"quote 1.0.46",
|
||||
"syn 2.0.119",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "referencing"
|
||||
version = "0.46.5"
|
||||
version = "0.47.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "69e4e17ef386c5383591d07623d3de49cbc601156e7582973e6db98d66a57de2"
|
||||
checksum = "348e860aeb0b7bd035778fd11dd9cd5290d32e4aed3b8f2274a00287a9fd362b"
|
||||
dependencies = [
|
||||
"ahash",
|
||||
"fluent-uri",
|
||||
"getrandom 0.3.4",
|
||||
"hashbrown 0.16.1",
|
||||
"hashbrown 0.17.1",
|
||||
"itoa",
|
||||
"micromap",
|
||||
"parking_lot",
|
||||
@@ -1370,9 +1339,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "regex"
|
||||
version = "1.12.3"
|
||||
version = "1.13.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276"
|
||||
checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d"
|
||||
dependencies = [
|
||||
"aho-corasick",
|
||||
"memchr",
|
||||
@@ -1382,9 +1351,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "regex-automata"
|
||||
version = "0.4.14"
|
||||
version = "0.4.16"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f"
|
||||
checksum = "8fcfdb36bda0c880c5931cdc7a2bcdc8ba4556847b9d912bca70bc94708711ad"
|
||||
dependencies = [
|
||||
"aho-corasick",
|
||||
"memchr",
|
||||
@@ -1393,13 +1362,13 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "regex-syntax"
|
||||
version = "0.8.10"
|
||||
version = "0.8.11"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a"
|
||||
checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4"
|
||||
|
||||
[[package]]
|
||||
name = "regorus"
|
||||
version = "0.10.1"
|
||||
version = "0.11.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"cfg-if",
|
||||
@@ -1418,7 +1387,7 @@ dependencies = [
|
||||
"lazy_static",
|
||||
"lru",
|
||||
"msvc_spectre_libs",
|
||||
"num-bigint",
|
||||
"num-bigint 0.5.1",
|
||||
"num-traits",
|
||||
"num_cpus",
|
||||
"parking_lot",
|
||||
@@ -1431,7 +1400,7 @@ dependencies = [
|
||||
"serde",
|
||||
"serde_json",
|
||||
"serde_yaml",
|
||||
"spin 0.12.0",
|
||||
"spin 0.12.2",
|
||||
"test-generator",
|
||||
"thiserror",
|
||||
"url",
|
||||
@@ -1455,9 +1424,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "rustversion"
|
||||
version = "1.0.22"
|
||||
version = "1.0.23"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
|
||||
checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f"
|
||||
|
||||
[[package]]
|
||||
name = "ryu"
|
||||
@@ -1512,8 +1481,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
|
||||
dependencies = [
|
||||
"proc-macro2 1.0.106",
|
||||
"quote 1.0.45",
|
||||
"syn 2.0.117",
|
||||
"quote 1.0.46",
|
||||
"syn 2.0.119",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -1544,15 +1513,15 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "shlex"
|
||||
version = "1.3.0"
|
||||
version = "2.0.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
|
||||
checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba"
|
||||
|
||||
[[package]]
|
||||
name = "simd-adler32"
|
||||
version = "0.3.9"
|
||||
version = "0.3.10"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "703d5c7ef118737c72f1af64ad2f6f8c5e1921f818cdcb97b8fe6fc69bf66214"
|
||||
checksum = "3a219298ac11a56ea9a6d2120044824d6f01aeb034955e7af7bc16858527deea"
|
||||
|
||||
[[package]]
|
||||
name = "siphasher"
|
||||
@@ -1568,21 +1537,21 @@ checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5"
|
||||
|
||||
[[package]]
|
||||
name = "smallvec"
|
||||
version = "1.15.1"
|
||||
version = "1.15.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
|
||||
checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90"
|
||||
|
||||
[[package]]
|
||||
name = "spin"
|
||||
version = "0.9.8"
|
||||
version = "0.9.9"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67"
|
||||
checksum = "3763264f6b73151db08c50ff20d7d8a0b8796e021cdea7ceedad07b80155fa0e"
|
||||
|
||||
[[package]]
|
||||
name = "spin"
|
||||
version = "0.12.0"
|
||||
version = "0.12.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1527984ca054dfca79333baec451042863f485fbee01b7bf6d911de915cac865"
|
||||
checksum = "8abadc99fd9c7bbb7d0ca2b31d72a067d0c0dcd7aad25ab8cac71ba91417694b"
|
||||
|
||||
[[package]]
|
||||
name = "stable_deref_trait"
|
||||
@@ -1604,17 +1573,17 @@ checksum = "9ca4b3b69a77cbe1ffc9e198781b7acb0c7365a883670e8f1c1bc66fba79a5c5"
|
||||
dependencies = [
|
||||
"proc-macro2 0.4.30",
|
||||
"quote 0.6.13",
|
||||
"unicode-xid 0.1.0",
|
||||
"unicode-xid",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "2.0.117"
|
||||
version = "2.0.119"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99"
|
||||
checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297"
|
||||
dependencies = [
|
||||
"proc-macro2 1.0.106",
|
||||
"quote 1.0.45",
|
||||
"quote 1.0.46",
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
@@ -1625,8 +1594,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2"
|
||||
dependencies = [
|
||||
"proc-macro2 1.0.106",
|
||||
"quote 1.0.45",
|
||||
"syn 2.0.117",
|
||||
"quote 1.0.46",
|
||||
"syn 2.0.119",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -1657,8 +1626,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5"
|
||||
dependencies = [
|
||||
"proc-macro2 1.0.106",
|
||||
"quote 1.0.45",
|
||||
"syn 2.0.117",
|
||||
"quote 1.0.46",
|
||||
"syn 2.0.119",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -1693,9 +1662,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "toml_edit"
|
||||
version = "0.25.12+spec-1.1.0"
|
||||
version = "0.25.13+spec-1.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d2153edc6955a6c354fad8f5efd38b6a8769bdccf9fe50f8e1329f81b0baa5d7"
|
||||
checksum = "6975367e4d2ef766d86af01ffad14b622fecc8d4357a998fbc4deb6e9bacaf9b"
|
||||
dependencies = [
|
||||
"indexmap",
|
||||
"toml_datetime",
|
||||
@@ -1715,9 +1684,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "toml_writer"
|
||||
version = "1.1.1+spec-1.1.0"
|
||||
version = "1.1.2+spec-1.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "756daf9b1013ebe47a8776667b466417e2d4c5679d441c26230efd9ef78692db"
|
||||
checksum = "7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2"
|
||||
|
||||
[[package]]
|
||||
name = "typed-path"
|
||||
@@ -1743,12 +1712,6 @@ version = "0.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc"
|
||||
|
||||
[[package]]
|
||||
name = "unicode-xid"
|
||||
version = "0.2.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853"
|
||||
|
||||
[[package]]
|
||||
name = "unsafe-libyaml"
|
||||
version = "0.2.11"
|
||||
@@ -1781,11 +1744,11 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
|
||||
|
||||
[[package]]
|
||||
name = "uuid"
|
||||
version = "1.23.1"
|
||||
version = "1.24.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ddd74a9687298c6858e9b88ec8935ec45d22e8fd5e6394fa1bd4e99a87789c76"
|
||||
checksum = "bf3923a6f5c4c6382e0b653c4117f48d631ea17f38ed86e2a828e6f7412f5239"
|
||||
dependencies = [
|
||||
"getrandom 0.4.2",
|
||||
"getrandom 0.4.3",
|
||||
"rand",
|
||||
]
|
||||
|
||||
@@ -1823,27 +1786,18 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "wasip2"
|
||||
version = "1.0.3+wasi-0.2.9"
|
||||
version = "1.0.4+wasi-0.2.12"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6"
|
||||
checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487"
|
||||
dependencies = [
|
||||
"wit-bindgen 0.57.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasip3"
|
||||
version = "0.4.0+wasi-0.3.0-rc-2026-01-06"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5"
|
||||
dependencies = [
|
||||
"wit-bindgen 0.51.0",
|
||||
"wit-bindgen",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen"
|
||||
version = "0.2.122"
|
||||
version = "0.2.126"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3ed04576f974d2b2fba0f38c51dbc5518011e38c36bf1143164be765528fd409"
|
||||
checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"once_cell",
|
||||
@@ -1854,75 +1808,41 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen-macro"
|
||||
version = "0.2.122"
|
||||
version = "0.2.126"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "916151b09da36bd82f6615cbf3a419e2f0ba23a03c6160e8e92eb6bd4aa1dec6"
|
||||
checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1"
|
||||
dependencies = [
|
||||
"quote 1.0.45",
|
||||
"quote 1.0.46",
|
||||
"wasm-bindgen-macro-support",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen-macro-support"
|
||||
version = "0.2.122"
|
||||
version = "0.2.126"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "299047362ccbfce148b67ab7e73349f77748e00c8296f9542adfad2ad82c5c5e"
|
||||
checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e"
|
||||
dependencies = [
|
||||
"bumpalo",
|
||||
"proc-macro2 1.0.106",
|
||||
"quote 1.0.45",
|
||||
"syn 2.0.117",
|
||||
"quote 1.0.46",
|
||||
"syn 2.0.119",
|
||||
"wasm-bindgen-shared",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen-shared"
|
||||
version = "0.2.122"
|
||||
version = "0.2.126"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9a929b2c61f11ba3e9bc35b50c1f25cb38e0e892c0c231ae2b8cf78d5dad4437"
|
||||
checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24"
|
||||
dependencies = [
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasm-encoder"
|
||||
version = "0.244.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319"
|
||||
dependencies = [
|
||||
"leb128fmt",
|
||||
"wasmparser",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasm-metadata"
|
||||
version = "0.244.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"indexmap",
|
||||
"wasm-encoder",
|
||||
"wasmparser",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasmparser"
|
||||
version = "0.244.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
"hashbrown 0.15.5",
|
||||
"indexmap",
|
||||
"semver",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "web-sys"
|
||||
version = "0.3.99"
|
||||
version = "0.3.103"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6d621441cfc37b84979402712047321980c178f299193a3589d05b99e8763436"
|
||||
checksum = "8622dcb61c0bcc9fffa6938bed81210af2da9a7e4a1a834b2e37a59b6dfb6141"
|
||||
dependencies = [
|
||||
"js-sys",
|
||||
"wasm-bindgen",
|
||||
@@ -1979,8 +1899,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf"
|
||||
dependencies = [
|
||||
"proc-macro2 1.0.106",
|
||||
"quote 1.0.45",
|
||||
"syn 2.0.117",
|
||||
"quote 1.0.46",
|
||||
"syn 2.0.119",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -1990,8 +1910,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358"
|
||||
dependencies = [
|
||||
"proc-macro2 1.0.106",
|
||||
"quote 1.0.45",
|
||||
"syn 2.0.117",
|
||||
"quote 1.0.46",
|
||||
"syn 2.0.119",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -2029,107 +1949,19 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "winnow"
|
||||
version = "1.0.3"
|
||||
version = "1.0.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0592e1c9d151f854e6fd382574c3a0855250e1d9b2f99d9281c6e6391af352f1"
|
||||
checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81"
|
||||
dependencies = [
|
||||
"memchr",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wit-bindgen"
|
||||
version = "0.51.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5"
|
||||
dependencies = [
|
||||
"wit-bindgen-rust-macro",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wit-bindgen"
|
||||
version = "0.57.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e"
|
||||
|
||||
[[package]]
|
||||
name = "wit-bindgen-core"
|
||||
version = "0.51.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"heck",
|
||||
"wit-parser",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wit-bindgen-rust"
|
||||
version = "0.51.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"heck",
|
||||
"indexmap",
|
||||
"prettyplease",
|
||||
"syn 2.0.117",
|
||||
"wasm-metadata",
|
||||
"wit-bindgen-core",
|
||||
"wit-component",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wit-bindgen-rust-macro"
|
||||
version = "0.51.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"prettyplease",
|
||||
"proc-macro2 1.0.106",
|
||||
"quote 1.0.45",
|
||||
"syn 2.0.117",
|
||||
"wit-bindgen-core",
|
||||
"wit-bindgen-rust",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wit-component"
|
||||
version = "0.244.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"bitflags",
|
||||
"indexmap",
|
||||
"log",
|
||||
"serde",
|
||||
"serde_derive",
|
||||
"serde_json",
|
||||
"wasm-encoder",
|
||||
"wasm-metadata",
|
||||
"wasmparser",
|
||||
"wit-parser",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wit-parser"
|
||||
version = "0.244.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"id-arena",
|
||||
"indexmap",
|
||||
"log",
|
||||
"semver",
|
||||
"serde",
|
||||
"serde_derive",
|
||||
"serde_json",
|
||||
"unicode-xid 0.2.6",
|
||||
"wasmparser",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "writeable"
|
||||
version = "0.6.3"
|
||||
@@ -2150,9 +1982,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "yoke"
|
||||
version = "0.8.2"
|
||||
version = "0.8.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca"
|
||||
checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5"
|
||||
dependencies = [
|
||||
"stable_deref_trait",
|
||||
"yoke-derive",
|
||||
@@ -2166,29 +1998,29 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e"
|
||||
dependencies = [
|
||||
"proc-macro2 1.0.106",
|
||||
"quote 1.0.45",
|
||||
"syn 2.0.117",
|
||||
"quote 1.0.46",
|
||||
"syn 2.0.119",
|
||||
"synstructure",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "zerocopy"
|
||||
version = "0.8.49"
|
||||
version = "0.8.54"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bce33a6288fa3f072a8c2c7d0f2fdbb90e28298f0135c1f99b96c3db2efcc60b"
|
||||
checksum = "b7cbbc0a705a0fd05cc3676525980d2bf5a9bc4adac6d6475209a7887cf59d19"
|
||||
dependencies = [
|
||||
"zerocopy-derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "zerocopy-derive"
|
||||
version = "0.8.49"
|
||||
version = "0.8.54"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8fd425244944f4ab65ccff928e7323354c5a018c75838362fdce749dfad2ee1e"
|
||||
checksum = "e2e817b7b52d0c7358d3246da9d69935ebb18116b2b102b4230dac079b4862f5"
|
||||
dependencies = [
|
||||
"proc-macro2 1.0.106",
|
||||
"quote 1.0.45",
|
||||
"syn 2.0.117",
|
||||
"quote 1.0.46",
|
||||
"syn 2.0.119",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -2207,8 +2039,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1"
|
||||
dependencies = [
|
||||
"proc-macro2 1.0.106",
|
||||
"quote 1.0.45",
|
||||
"syn 2.0.117",
|
||||
"quote 1.0.46",
|
||||
"syn 2.0.119",
|
||||
"synstructure",
|
||||
]
|
||||
|
||||
@@ -2243,8 +2075,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555"
|
||||
dependencies = [
|
||||
"proc-macro2 1.0.106",
|
||||
"quote 1.0.45",
|
||||
"syn 2.0.117",
|
||||
"quote 1.0.46",
|
||||
"syn 2.0.119",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -2263,15 +2095,15 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "zlib-rs"
|
||||
version = "0.6.3"
|
||||
version = "0.6.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3be3d40e40a133f9c916ee3f9f4fa2d9d63435b5fbe1bfc6d9dae0aa0ada1513"
|
||||
checksum = "b142a20ec14a91d5bc708c1dc21b080c550113d8aa77afa29635673a65dd02c5"
|
||||
|
||||
[[package]]
|
||||
name = "zmij"
|
||||
version = "1.0.21"
|
||||
version = "1.0.23"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa"
|
||||
checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b"
|
||||
|
||||
[[package]]
|
||||
name = "zopfli"
|
||||
|
||||
@@ -8,7 +8,7 @@ members = [
|
||||
[package]
|
||||
name = "regorus"
|
||||
description = "A fast, lightweight Rego (OPA policy language) interpreter"
|
||||
version = "0.10.1"
|
||||
version = "0.11.0"
|
||||
edition = "2021"
|
||||
license = "MIT AND Apache-2.0 AND BSD-3-Clause"
|
||||
repository = "https://github.com/microsoft/regorus"
|
||||
@@ -104,7 +104,7 @@ lazy_static = { version = "1.4.0", default-features = false }
|
||||
thiserror = { version = "2.0", default-features = false }
|
||||
|
||||
data-encoding = { version = "2.8.0", optional = true, default-features=false, features = ["alloc"] }
|
||||
num-bigint = { version = "0.4", default-features = false }
|
||||
num-bigint = { version = "0.5", default-features = false }
|
||||
num-traits = { version = "0.2", default-features = false }
|
||||
parking_lot = { version = "0.12", optional = true }
|
||||
spin = { version = "0.12.0", default-features = false, features = ["mutex", "spin_mutex"] }
|
||||
@@ -114,7 +114,7 @@ regex = {version = "1.12.3", optional = true, default-features = false }
|
||||
semver = {version = "1.0.28", optional = true, default-features = false }
|
||||
url = { version = "2.5.4", optional = true }
|
||||
uuid = { version = "1.22.0", default-features = false, features = ["v4", "fast-rng"], optional = true }
|
||||
jsonschema = { version = "0.46.5", default-features = false, optional = true }
|
||||
jsonschema = { version = "0.47.0", default-features = false, optional = true }
|
||||
chrono = { version = "0.4.44", optional = true }
|
||||
chrono-tz = { version = "0.10.1", optional = true }
|
||||
ipnet = { version = "2.12.0", optional = true, default-features = false }
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<Project>
|
||||
<PropertyGroup>
|
||||
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
|
||||
<RegorusPackageVersion>0.10.1</RegorusPackageVersion>
|
||||
<RegorusPackageVersion>0.11.0</RegorusPackageVersion>
|
||||
<RegorusPackageVersionSuffix Condition="'$(VersionSuffix)' != ''">-$(VersionSuffix)</RegorusPackageVersionSuffix>
|
||||
</PropertyGroup>
|
||||
|
||||
|
||||
406
bindings/ffi/Cargo.lock
generated
406
bindings/ffi/Cargo.lock
generated
@@ -92,9 +92,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "anyhow"
|
||||
version = "1.0.102"
|
||||
version = "1.0.103"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c"
|
||||
checksum = "2a4385e2e34eb35d6b3efe798b9eb88096925d87726c0798709bf56d9ed84af3"
|
||||
|
||||
[[package]]
|
||||
name = "autocfg"
|
||||
@@ -119,9 +119,9 @@ checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7"
|
||||
|
||||
[[package]]
|
||||
name = "bitflags"
|
||||
version = "2.11.1"
|
||||
version = "2.13.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3"
|
||||
checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da"
|
||||
|
||||
[[package]]
|
||||
name = "borrow-or-share"
|
||||
@@ -131,12 +131,12 @@ checksum = "dc0b364ead1874514c8c2855ab558056ebfeb775653e7ae45ff72f28f8f3166c"
|
||||
|
||||
[[package]]
|
||||
name = "bstr"
|
||||
version = "1.12.1"
|
||||
version = "1.13.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "63044e1ae8e69f3b5a92c736ca6269b8d12fa7efe39bf34ddb06d102cf0e2cab"
|
||||
checksum = "1f7dc094d718f2e1c1559ad110e27eeaae14a5465d3d56dd6dbd793079fbd530"
|
||||
dependencies = [
|
||||
"memchr",
|
||||
"serde",
|
||||
"serde_core",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -153,9 +153,9 @@ checksum = "175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e"
|
||||
|
||||
[[package]]
|
||||
name = "cbindgen"
|
||||
version = "0.29.3"
|
||||
version = "0.29.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c95537b45400390270fae69ac098d057c8f5399001cde9d04f700c105ddfff2d"
|
||||
checksum = "2ecb53484c9c167ba674026b656d8a27d7657a58e6066aa902bfb1a4aa00ae20"
|
||||
dependencies = [
|
||||
"clap",
|
||||
"heck",
|
||||
@@ -172,9 +172,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "cc"
|
||||
version = "1.2.62"
|
||||
version = "1.2.67"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a1dce859f0832a7d088c4f1119888ab94ef4b5d6795d1ce05afb7fe159d79f98"
|
||||
checksum = "e17dd265a7d0f31ef544e1b20e03add05d3b45b491b633b10d67145d2acc1a38"
|
||||
dependencies = [
|
||||
"find-msvc-tools",
|
||||
"shlex",
|
||||
@@ -188,9 +188,9 @@ checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
|
||||
|
||||
[[package]]
|
||||
name = "chacha20"
|
||||
version = "0.10.0"
|
||||
version = "0.10.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6f8d983286843e49675a4b7a2d174efe136dc93a18d69130dd18198a6c167601"
|
||||
checksum = "d524456ba66e72eb8b115ff89e01e497f8e6d11d78b70b1aa13c0fbd97540a81"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"cpufeatures",
|
||||
@@ -199,9 +199,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "chrono"
|
||||
version = "0.4.44"
|
||||
version = "0.4.45"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0"
|
||||
checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327"
|
||||
dependencies = [
|
||||
"iana-time-zone",
|
||||
"js-sys",
|
||||
@@ -222,18 +222,18 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "clap"
|
||||
version = "4.6.1"
|
||||
version = "4.6.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51"
|
||||
checksum = "dd059f9da4f5c36b3787f65d38ccaab1cc315f07b01f89abc8359ee6a8205011"
|
||||
dependencies = [
|
||||
"clap_builder",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "clap_builder"
|
||||
version = "4.6.0"
|
||||
version = "4.6.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "714a53001bf66416adb0e2ef5ac857140e7dc3a0c48fb28b2f10762fc4b5069f"
|
||||
checksum = "f09628afdcc538b57f3c6341e9c8e9970f18e4a481690a64974d7023bd33548b"
|
||||
dependencies = [
|
||||
"anstream",
|
||||
"anstyle",
|
||||
@@ -279,9 +279,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "crossbeam-utils"
|
||||
version = "0.8.21"
|
||||
version = "0.8.22"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28"
|
||||
checksum = "61803da095bee82a81bb1a452ecc25d3b2f1416d1897eb86430c6159ef717c17"
|
||||
|
||||
[[package]]
|
||||
name = "dashmap"
|
||||
@@ -385,12 +385,6 @@ dependencies = [
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "foldhash"
|
||||
version = "0.1.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2"
|
||||
|
||||
[[package]]
|
||||
name = "foldhash"
|
||||
version = "0.2.0"
|
||||
@@ -456,23 +450,21 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "getrandom"
|
||||
version = "0.4.2"
|
||||
version = "0.4.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555"
|
||||
checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"libc",
|
||||
"r-efi 6.0.0",
|
||||
"rand_core",
|
||||
"wasip2",
|
||||
"wasip3",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "globset"
|
||||
version = "0.4.18"
|
||||
version = "0.4.19"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "52dfc19153a48bde0cbd630453615c8151bce3a5adfac7a0aebfbf0a1e1f57e3"
|
||||
checksum = "e47d37d2ae4464254884b60ab7071be2b876a9c35b696bd018ddcc76847309cd"
|
||||
dependencies = [
|
||||
"aho-corasick",
|
||||
"bstr",
|
||||
@@ -486,33 +478,15 @@ version = "0.14.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
|
||||
|
||||
[[package]]
|
||||
name = "hashbrown"
|
||||
version = "0.15.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1"
|
||||
dependencies = [
|
||||
"foldhash 0.1.5",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "hashbrown"
|
||||
version = "0.16.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100"
|
||||
dependencies = [
|
||||
"allocator-api2",
|
||||
"equivalent",
|
||||
"foldhash 0.2.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "hashbrown"
|
||||
version = "0.17.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a"
|
||||
dependencies = [
|
||||
"foldhash 0.2.0",
|
||||
"allocator-api2",
|
||||
"equivalent",
|
||||
"foldhash",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -653,12 +627,6 @@ dependencies = [
|
||||
"zerovec",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "id-arena"
|
||||
version = "2.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954"
|
||||
|
||||
[[package]]
|
||||
name = "idna"
|
||||
version = "1.1.0"
|
||||
@@ -712,21 +680,20 @@ checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682"
|
||||
|
||||
[[package]]
|
||||
name = "js-sys"
|
||||
version = "0.3.99"
|
||||
version = "0.3.103"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "142bc4740e452c1e57ade0cbc129f139c9093e354346f0872ef985f4f5cf5f11"
|
||||
checksum = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"futures-util",
|
||||
"once_cell",
|
||||
"wasm-bindgen",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "jsonschema"
|
||||
version = "0.46.5"
|
||||
version = "0.47.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6a5fe5206f06e589caf25e79fc05ccdf91fca745685fe9fe1a13bbdfb479a631"
|
||||
checksum = "281c43ff06dcb331e9356d30e38853d559ce3d0a3f693e0b0e102667dec14fb1"
|
||||
dependencies = [
|
||||
"ahash",
|
||||
"bytecount",
|
||||
@@ -737,30 +704,33 @@ dependencies = [
|
||||
"getrandom 0.3.4",
|
||||
"idna",
|
||||
"itoa",
|
||||
"jsonschema-regex",
|
||||
"num-cmp",
|
||||
"num-traits",
|
||||
"percent-encoding",
|
||||
"referencing",
|
||||
"regex",
|
||||
"regex-syntax",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"unicode-general-category",
|
||||
"uuid-simd",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "jsonschema-regex"
|
||||
version = "0.47.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ee0b351864e7ffbc5db9273daf7fa1b4d5177b0946713d667ca571b83c0b4045"
|
||||
dependencies = [
|
||||
"regex-syntax",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "lazy_static"
|
||||
version = "1.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
|
||||
|
||||
[[package]]
|
||||
name = "leb128fmt"
|
||||
version = "0.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2"
|
||||
|
||||
[[package]]
|
||||
name = "libc"
|
||||
version = "0.2.186"
|
||||
@@ -790,21 +760,21 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "log"
|
||||
version = "0.4.30"
|
||||
version = "0.4.33"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "616ec5685824bcc94416c6d4a7a446eea774a31efd7062c8480ba6fd06d7a6e5"
|
||||
checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad"
|
||||
|
||||
[[package]]
|
||||
name = "lru"
|
||||
version = "0.18.0"
|
||||
version = "0.18.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8a860605968fce16869fd239cf4237a82f3ac470723415db603b0e8b6c8d4fb9"
|
||||
checksum = "0b6180140927ee907000b0aa540091f6ea512ead4447c92b8fc35bc72788a5a6"
|
||||
|
||||
[[package]]
|
||||
name = "memchr"
|
||||
version = "2.8.1"
|
||||
version = "2.8.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6b947ae49db0d222b1dbc6b113ce7248a3fc3a6ca21b696717bfc000ba4484d8"
|
||||
checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98"
|
||||
|
||||
[[package]]
|
||||
name = "micromap"
|
||||
@@ -827,7 +797,7 @@ version = "0.4.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23"
|
||||
dependencies = [
|
||||
"num-bigint",
|
||||
"num-bigint 0.4.8",
|
||||
"num-complex",
|
||||
"num-integer",
|
||||
"num-iter",
|
||||
@@ -837,9 +807,19 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "num-bigint"
|
||||
version = "0.4.6"
|
||||
version = "0.4.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9"
|
||||
checksum = "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367"
|
||||
dependencies = [
|
||||
"num-integer",
|
||||
"num-traits",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "num-bigint"
|
||||
version = "0.5.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "93e7820bc0a80a0238e650327316f929ba18d5be054b647490a3a6a339f3e7c0"
|
||||
dependencies = [
|
||||
"num-integer",
|
||||
"num-traits",
|
||||
@@ -871,11 +851,10 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "num-iter"
|
||||
version = "0.1.45"
|
||||
version = "0.1.46"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf"
|
||||
checksum = "c92800bd69a1eac91786bcfe9da64a897eb72911b8dc3095decbd07429e8048b"
|
||||
dependencies = [
|
||||
"autocfg",
|
||||
"num-integer",
|
||||
"num-traits",
|
||||
]
|
||||
@@ -886,7 +865,7 @@ version = "0.4.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824"
|
||||
dependencies = [
|
||||
"num-bigint",
|
||||
"num-bigint 0.4.8",
|
||||
"num-integer",
|
||||
"num-traits",
|
||||
]
|
||||
@@ -994,16 +973,6 @@ dependencies = [
|
||||
"zerovec",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "prettyplease"
|
||||
version = "0.2.37"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro2"
|
||||
version = "1.0.106"
|
||||
@@ -1015,9 +984,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "quote"
|
||||
version = "1.0.45"
|
||||
version = "1.0.46"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924"
|
||||
checksum = "dfbc457d0c7a0759a614551b11a6409e5951f6c7537be1f1b7682b9ae9230368"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
]
|
||||
@@ -1036,12 +1005,12 @@ checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf"
|
||||
|
||||
[[package]]
|
||||
name = "rand"
|
||||
version = "0.10.1"
|
||||
version = "0.10.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d2e8e8bcc7961af1fdac401278c6a831614941f6164ee3bf4ce61b7edb162207"
|
||||
checksum = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80"
|
||||
dependencies = [
|
||||
"chacha20",
|
||||
"getrandom 0.4.2",
|
||||
"getrandom 0.4.3",
|
||||
"rand_core",
|
||||
]
|
||||
|
||||
@@ -1082,14 +1051,14 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "referencing"
|
||||
version = "0.46.5"
|
||||
version = "0.47.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "69e4e17ef386c5383591d07623d3de49cbc601156e7582973e6db98d66a57de2"
|
||||
checksum = "348e860aeb0b7bd035778fd11dd9cd5290d32e4aed3b8f2274a00287a9fd362b"
|
||||
dependencies = [
|
||||
"ahash",
|
||||
"fluent-uri",
|
||||
"getrandom 0.3.4",
|
||||
"hashbrown 0.16.1",
|
||||
"hashbrown 0.17.1",
|
||||
"itoa",
|
||||
"micromap",
|
||||
"parking_lot",
|
||||
@@ -1099,9 +1068,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "regex"
|
||||
version = "1.12.3"
|
||||
version = "1.13.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276"
|
||||
checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d"
|
||||
dependencies = [
|
||||
"aho-corasick",
|
||||
"memchr",
|
||||
@@ -1111,9 +1080,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "regex-automata"
|
||||
version = "0.4.14"
|
||||
version = "0.4.16"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f"
|
||||
checksum = "8fcfdb36bda0c880c5931cdc7a2bcdc8ba4556847b9d912bca70bc94708711ad"
|
||||
dependencies = [
|
||||
"aho-corasick",
|
||||
"memchr",
|
||||
@@ -1122,13 +1091,13 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "regex-syntax"
|
||||
version = "0.8.10"
|
||||
version = "0.8.11"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a"
|
||||
checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4"
|
||||
|
||||
[[package]]
|
||||
name = "regorus"
|
||||
version = "0.10.1"
|
||||
version = "0.11.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"chrono",
|
||||
@@ -1144,7 +1113,7 @@ dependencies = [
|
||||
"lazy_static",
|
||||
"lru",
|
||||
"msvc_spectre_libs",
|
||||
"num-bigint",
|
||||
"num-bigint 0.5.1",
|
||||
"num-traits",
|
||||
"parking_lot",
|
||||
"postcard",
|
||||
@@ -1163,7 +1132,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "regorus-ffi"
|
||||
version = "0.10.1"
|
||||
version = "0.11.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"cbindgen",
|
||||
@@ -1201,9 +1170,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "rustversion"
|
||||
version = "1.0.22"
|
||||
version = "1.0.23"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
|
||||
checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f"
|
||||
|
||||
[[package]]
|
||||
name = "ryu"
|
||||
@@ -1290,9 +1259,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "shlex"
|
||||
version = "1.3.0"
|
||||
version = "2.0.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
|
||||
checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba"
|
||||
|
||||
[[package]]
|
||||
name = "siphasher"
|
||||
@@ -1308,15 +1277,15 @@ checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5"
|
||||
|
||||
[[package]]
|
||||
name = "smallvec"
|
||||
version = "1.15.1"
|
||||
version = "1.15.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
|
||||
checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90"
|
||||
|
||||
[[package]]
|
||||
name = "spin"
|
||||
version = "0.12.0"
|
||||
version = "0.12.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1527984ca054dfca79333baec451042863f485fbee01b7bf6d911de915cac865"
|
||||
checksum = "8abadc99fd9c7bbb7d0ca2b31d72a067d0c0dcd7aad25ab8cac71ba91417694b"
|
||||
|
||||
[[package]]
|
||||
name = "stable_deref_trait"
|
||||
@@ -1332,9 +1301,9 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
|
||||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "2.0.117"
|
||||
version = "2.0.119"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99"
|
||||
checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
@@ -1359,7 +1328,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd"
|
||||
dependencies = [
|
||||
"fastrand",
|
||||
"getrandom 0.4.2",
|
||||
"getrandom 0.4.3",
|
||||
"once_cell",
|
||||
"rustix",
|
||||
"windows-sys",
|
||||
@@ -1426,14 +1395,14 @@ version = "1.1.2+spec-1.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526"
|
||||
dependencies = [
|
||||
"winnow 1.0.3",
|
||||
"winnow 1.0.4",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "toml_writer"
|
||||
version = "1.1.1+spec-1.1.0"
|
||||
version = "1.1.2+spec-1.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "756daf9b1013ebe47a8776667b466417e2d4c5679d441c26230efd9ef78692db"
|
||||
checksum = "7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2"
|
||||
|
||||
[[package]]
|
||||
name = "unicode-general-category"
|
||||
@@ -1447,12 +1416,6 @@ version = "1.0.24"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
|
||||
|
||||
[[package]]
|
||||
name = "unicode-xid"
|
||||
version = "0.2.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853"
|
||||
|
||||
[[package]]
|
||||
name = "unsafe-libyaml"
|
||||
version = "0.2.11"
|
||||
@@ -1485,11 +1448,11 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
|
||||
|
||||
[[package]]
|
||||
name = "uuid"
|
||||
version = "1.23.1"
|
||||
version = "1.24.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ddd74a9687298c6858e9b88ec8935ec45d22e8fd5e6394fa1bd4e99a87789c76"
|
||||
checksum = "bf3923a6f5c4c6382e0b653c4117f48d631ea17f38ed86e2a828e6f7412f5239"
|
||||
dependencies = [
|
||||
"getrandom 0.4.2",
|
||||
"getrandom 0.4.3",
|
||||
"rand",
|
||||
]
|
||||
|
||||
@@ -1517,27 +1480,18 @@ checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64"
|
||||
|
||||
[[package]]
|
||||
name = "wasip2"
|
||||
version = "1.0.3+wasi-0.2.9"
|
||||
version = "1.0.4+wasi-0.2.12"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6"
|
||||
checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487"
|
||||
dependencies = [
|
||||
"wit-bindgen 0.57.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasip3"
|
||||
version = "0.4.0+wasi-0.3.0-rc-2026-01-06"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5"
|
||||
dependencies = [
|
||||
"wit-bindgen 0.51.0",
|
||||
"wit-bindgen",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen"
|
||||
version = "0.2.122"
|
||||
version = "0.2.126"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3ed04576f974d2b2fba0f38c51dbc5518011e38c36bf1143164be765528fd409"
|
||||
checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"once_cell",
|
||||
@@ -1548,9 +1502,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen-macro"
|
||||
version = "0.2.122"
|
||||
version = "0.2.126"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "916151b09da36bd82f6615cbf3a419e2f0ba23a03c6160e8e92eb6bd4aa1dec6"
|
||||
checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1"
|
||||
dependencies = [
|
||||
"quote",
|
||||
"wasm-bindgen-macro-support",
|
||||
@@ -1558,9 +1512,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen-macro-support"
|
||||
version = "0.2.122"
|
||||
version = "0.2.126"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "299047362ccbfce148b67ab7e73349f77748e00c8296f9542adfad2ad82c5c5e"
|
||||
checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e"
|
||||
dependencies = [
|
||||
"bumpalo",
|
||||
"proc-macro2",
|
||||
@@ -1571,47 +1525,13 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen-shared"
|
||||
version = "0.2.122"
|
||||
version = "0.2.126"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9a929b2c61f11ba3e9bc35b50c1f25cb38e0e892c0c231ae2b8cf78d5dad4437"
|
||||
checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24"
|
||||
dependencies = [
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasm-encoder"
|
||||
version = "0.244.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319"
|
||||
dependencies = [
|
||||
"leb128fmt",
|
||||
"wasmparser",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasm-metadata"
|
||||
version = "0.244.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"indexmap",
|
||||
"wasm-encoder",
|
||||
"wasmparser",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasmparser"
|
||||
version = "0.244.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
"hashbrown 0.15.5",
|
||||
"indexmap",
|
||||
"semver",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-core"
|
||||
version = "0.62.2"
|
||||
@@ -1688,18 +1608,9 @@ checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945"
|
||||
|
||||
[[package]]
|
||||
name = "winnow"
|
||||
version = "1.0.3"
|
||||
version = "1.0.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0592e1c9d151f854e6fd382574c3a0855250e1d9b2f99d9281c6e6391af352f1"
|
||||
|
||||
[[package]]
|
||||
name = "wit-bindgen"
|
||||
version = "0.51.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5"
|
||||
dependencies = [
|
||||
"wit-bindgen-rust-macro",
|
||||
]
|
||||
checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81"
|
||||
|
||||
[[package]]
|
||||
name = "wit-bindgen"
|
||||
@@ -1707,85 +1618,6 @@ version = "0.57.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e"
|
||||
|
||||
[[package]]
|
||||
name = "wit-bindgen-core"
|
||||
version = "0.51.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"heck",
|
||||
"wit-parser",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wit-bindgen-rust"
|
||||
version = "0.51.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"heck",
|
||||
"indexmap",
|
||||
"prettyplease",
|
||||
"syn",
|
||||
"wasm-metadata",
|
||||
"wit-bindgen-core",
|
||||
"wit-component",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wit-bindgen-rust-macro"
|
||||
version = "0.51.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"prettyplease",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
"wit-bindgen-core",
|
||||
"wit-bindgen-rust",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wit-component"
|
||||
version = "0.244.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"bitflags",
|
||||
"indexmap",
|
||||
"log",
|
||||
"serde",
|
||||
"serde_derive",
|
||||
"serde_json",
|
||||
"wasm-encoder",
|
||||
"wasm-metadata",
|
||||
"wasmparser",
|
||||
"wit-parser",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wit-parser"
|
||||
version = "0.244.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"id-arena",
|
||||
"indexmap",
|
||||
"log",
|
||||
"semver",
|
||||
"serde",
|
||||
"serde_derive",
|
||||
"serde_json",
|
||||
"unicode-xid",
|
||||
"wasmparser",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "writeable"
|
||||
version = "0.6.3"
|
||||
@@ -1794,9 +1626,9 @@ checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4"
|
||||
|
||||
[[package]]
|
||||
name = "yoke"
|
||||
version = "0.8.2"
|
||||
version = "0.8.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca"
|
||||
checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5"
|
||||
dependencies = [
|
||||
"stable_deref_trait",
|
||||
"yoke-derive",
|
||||
@@ -1817,18 +1649,18 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "zerocopy"
|
||||
version = "0.8.49"
|
||||
version = "0.8.54"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bce33a6288fa3f072a8c2c7d0f2fdbb90e28298f0135c1f99b96c3db2efcc60b"
|
||||
checksum = "b7cbbc0a705a0fd05cc3676525980d2bf5a9bc4adac6d6475209a7887cf59d19"
|
||||
dependencies = [
|
||||
"zerocopy-derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "zerocopy-derive"
|
||||
version = "0.8.49"
|
||||
version = "0.8.54"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8fd425244944f4ab65ccff928e7323354c5a018c75838362fdce749dfad2ee1e"
|
||||
checksum = "e2e817b7b52d0c7358d3246da9d69935ebb18116b2b102b4230dac079b4862f5"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
@@ -1893,6 +1725,6 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "zmij"
|
||||
version = "1.0.21"
|
||||
version = "1.0.23"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa"
|
||||
checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b"
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
[package]
|
||||
name = "regorus-ffi"
|
||||
version = "0.10.1"
|
||||
version = "0.11.0"
|
||||
edition = "2021"
|
||||
license = "MIT AND Apache-2.0 AND BSD-3-Clause"
|
||||
|
||||
|
||||
395
bindings/java/Cargo.lock
generated
395
bindings/java/Cargo.lock
generated
@@ -42,9 +42,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "anyhow"
|
||||
version = "1.0.102"
|
||||
version = "1.0.103"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c"
|
||||
checksum = "2a4385e2e34eb35d6b3efe798b9eb88096925d87726c0798709bf56d9ed84af3"
|
||||
|
||||
[[package]]
|
||||
name = "autocfg"
|
||||
@@ -69,9 +69,9 @@ checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7"
|
||||
|
||||
[[package]]
|
||||
name = "bitflags"
|
||||
version = "2.11.1"
|
||||
version = "2.13.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3"
|
||||
checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da"
|
||||
|
||||
[[package]]
|
||||
name = "borrow-or-share"
|
||||
@@ -81,12 +81,12 @@ checksum = "dc0b364ead1874514c8c2855ab558056ebfeb775653e7ae45ff72f28f8f3166c"
|
||||
|
||||
[[package]]
|
||||
name = "bstr"
|
||||
version = "1.12.1"
|
||||
version = "1.13.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "63044e1ae8e69f3b5a92c736ca6269b8d12fa7efe39bf34ddb06d102cf0e2cab"
|
||||
checksum = "1f7dc094d718f2e1c1559ad110e27eeaae14a5465d3d56dd6dbd793079fbd530"
|
||||
dependencies = [
|
||||
"memchr",
|
||||
"serde",
|
||||
"serde_core",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -103,15 +103,15 @@ checksum = "175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e"
|
||||
|
||||
[[package]]
|
||||
name = "bytes"
|
||||
version = "1.11.1"
|
||||
version = "1.12.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33"
|
||||
checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04"
|
||||
|
||||
[[package]]
|
||||
name = "cc"
|
||||
version = "1.2.62"
|
||||
version = "1.2.67"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a1dce859f0832a7d088c4f1119888ab94ef4b5d6795d1ce05afb7fe159d79f98"
|
||||
checksum = "e17dd265a7d0f31ef544e1b20e03add05d3b45b491b633b10d67145d2acc1a38"
|
||||
dependencies = [
|
||||
"find-msvc-tools",
|
||||
"shlex",
|
||||
@@ -125,9 +125,9 @@ checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
|
||||
|
||||
[[package]]
|
||||
name = "chacha20"
|
||||
version = "0.10.0"
|
||||
version = "0.10.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6f8d983286843e49675a4b7a2d174efe136dc93a18d69130dd18198a6c167601"
|
||||
checksum = "d524456ba66e72eb8b115ff89e01e497f8e6d11d78b70b1aa13c0fbd97540a81"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"cpufeatures",
|
||||
@@ -136,9 +136,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "chrono"
|
||||
version = "0.4.44"
|
||||
version = "0.4.45"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0"
|
||||
checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327"
|
||||
dependencies = [
|
||||
"iana-time-zone",
|
||||
"js-sys",
|
||||
@@ -263,12 +263,6 @@ dependencies = [
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "foldhash"
|
||||
version = "0.1.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2"
|
||||
|
||||
[[package]]
|
||||
name = "foldhash"
|
||||
version = "0.2.0"
|
||||
@@ -334,23 +328,21 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "getrandom"
|
||||
version = "0.4.2"
|
||||
version = "0.4.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555"
|
||||
checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"libc",
|
||||
"r-efi 6.0.0",
|
||||
"rand_core",
|
||||
"wasip2",
|
||||
"wasip3",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "globset"
|
||||
version = "0.4.18"
|
||||
version = "0.4.19"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "52dfc19153a48bde0cbd630453615c8151bce3a5adfac7a0aebfbf0a1e1f57e3"
|
||||
checksum = "e47d37d2ae4464254884b60ab7071be2b876a9c35b696bd018ddcc76847309cd"
|
||||
dependencies = [
|
||||
"aho-corasick",
|
||||
"bstr",
|
||||
@@ -358,37 +350,16 @@ dependencies = [
|
||||
"regex-syntax",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "hashbrown"
|
||||
version = "0.15.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1"
|
||||
dependencies = [
|
||||
"foldhash 0.1.5",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "hashbrown"
|
||||
version = "0.16.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100"
|
||||
dependencies = [
|
||||
"allocator-api2",
|
||||
"equivalent",
|
||||
"foldhash 0.2.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "hashbrown"
|
||||
version = "0.17.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a"
|
||||
|
||||
[[package]]
|
||||
name = "heck"
|
||||
version = "0.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
|
||||
dependencies = [
|
||||
"allocator-api2",
|
||||
"equivalent",
|
||||
"foldhash",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "iana-time-zone"
|
||||
@@ -496,12 +467,6 @@ dependencies = [
|
||||
"zerovec",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "id-arena"
|
||||
version = "2.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954"
|
||||
|
||||
[[package]]
|
||||
name = "idna"
|
||||
version = "1.1.0"
|
||||
@@ -530,7 +495,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9"
|
||||
dependencies = [
|
||||
"equivalent",
|
||||
"hashbrown 0.17.1",
|
||||
"hashbrown",
|
||||
"serde",
|
||||
"serde_core",
|
||||
]
|
||||
@@ -598,21 +563,20 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "js-sys"
|
||||
version = "0.3.99"
|
||||
version = "0.3.103"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "142bc4740e452c1e57ade0cbc129f139c9093e354346f0872ef985f4f5cf5f11"
|
||||
checksum = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"futures-util",
|
||||
"once_cell",
|
||||
"wasm-bindgen",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "jsonschema"
|
||||
version = "0.46.5"
|
||||
version = "0.47.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6a5fe5206f06e589caf25e79fc05ccdf91fca745685fe9fe1a13bbdfb479a631"
|
||||
checksum = "281c43ff06dcb331e9356d30e38853d559ce3d0a3f693e0b0e102667dec14fb1"
|
||||
dependencies = [
|
||||
"ahash",
|
||||
"bytecount",
|
||||
@@ -623,30 +587,33 @@ dependencies = [
|
||||
"getrandom 0.3.4",
|
||||
"idna",
|
||||
"itoa",
|
||||
"jsonschema-regex",
|
||||
"num-cmp",
|
||||
"num-traits",
|
||||
"percent-encoding",
|
||||
"referencing",
|
||||
"regex",
|
||||
"regex-syntax",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"unicode-general-category",
|
||||
"uuid-simd",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "jsonschema-regex"
|
||||
version = "0.47.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ee0b351864e7ffbc5db9273daf7fa1b4d5177b0946713d667ca571b83c0b4045"
|
||||
dependencies = [
|
||||
"regex-syntax",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "lazy_static"
|
||||
version = "1.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
|
||||
|
||||
[[package]]
|
||||
name = "leb128fmt"
|
||||
version = "0.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2"
|
||||
|
||||
[[package]]
|
||||
name = "libc"
|
||||
version = "0.2.186"
|
||||
@@ -670,21 +637,21 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "log"
|
||||
version = "0.4.30"
|
||||
version = "0.4.33"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "616ec5685824bcc94416c6d4a7a446eea774a31efd7062c8480ba6fd06d7a6e5"
|
||||
checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad"
|
||||
|
||||
[[package]]
|
||||
name = "lru"
|
||||
version = "0.18.0"
|
||||
version = "0.18.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8a860605968fce16869fd239cf4237a82f3ac470723415db603b0e8b6c8d4fb9"
|
||||
checksum = "0b6180140927ee907000b0aa540091f6ea512ead4447c92b8fc35bc72788a5a6"
|
||||
|
||||
[[package]]
|
||||
name = "memchr"
|
||||
version = "2.8.1"
|
||||
version = "2.8.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6b947ae49db0d222b1dbc6b113ce7248a3fc3a6ca21b696717bfc000ba4484d8"
|
||||
checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98"
|
||||
|
||||
[[package]]
|
||||
name = "micromap"
|
||||
@@ -707,7 +674,7 @@ version = "0.4.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23"
|
||||
dependencies = [
|
||||
"num-bigint",
|
||||
"num-bigint 0.4.8",
|
||||
"num-complex",
|
||||
"num-integer",
|
||||
"num-iter",
|
||||
@@ -717,9 +684,19 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "num-bigint"
|
||||
version = "0.4.6"
|
||||
version = "0.4.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9"
|
||||
checksum = "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367"
|
||||
dependencies = [
|
||||
"num-integer",
|
||||
"num-traits",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "num-bigint"
|
||||
version = "0.5.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "93e7820bc0a80a0238e650327316f929ba18d5be054b647490a3a6a339f3e7c0"
|
||||
dependencies = [
|
||||
"num-integer",
|
||||
"num-traits",
|
||||
@@ -751,11 +728,10 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "num-iter"
|
||||
version = "0.1.45"
|
||||
version = "0.1.46"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf"
|
||||
checksum = "c92800bd69a1eac91786bcfe9da64a897eb72911b8dc3095decbd07429e8048b"
|
||||
dependencies = [
|
||||
"autocfg",
|
||||
"num-integer",
|
||||
"num-traits",
|
||||
]
|
||||
@@ -766,7 +742,7 @@ version = "0.4.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824"
|
||||
dependencies = [
|
||||
"num-bigint",
|
||||
"num-bigint 0.4.8",
|
||||
"num-integer",
|
||||
"num-traits",
|
||||
]
|
||||
@@ -866,16 +842,6 @@ dependencies = [
|
||||
"zerovec",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "prettyplease"
|
||||
version = "0.2.37"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro2"
|
||||
version = "1.0.106"
|
||||
@@ -887,9 +853,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "quote"
|
||||
version = "1.0.45"
|
||||
version = "1.0.46"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924"
|
||||
checksum = "dfbc457d0c7a0759a614551b11a6409e5951f6c7537be1f1b7682b9ae9230368"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
]
|
||||
@@ -908,12 +874,12 @@ checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf"
|
||||
|
||||
[[package]]
|
||||
name = "rand"
|
||||
version = "0.10.1"
|
||||
version = "0.10.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d2e8e8bcc7961af1fdac401278c6a831614941f6164ee3bf4ce61b7edb162207"
|
||||
checksum = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80"
|
||||
dependencies = [
|
||||
"chacha20",
|
||||
"getrandom 0.4.2",
|
||||
"getrandom 0.4.3",
|
||||
"rand_core",
|
||||
]
|
||||
|
||||
@@ -954,14 +920,14 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "referencing"
|
||||
version = "0.46.5"
|
||||
version = "0.47.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "69e4e17ef386c5383591d07623d3de49cbc601156e7582973e6db98d66a57de2"
|
||||
checksum = "348e860aeb0b7bd035778fd11dd9cd5290d32e4aed3b8f2274a00287a9fd362b"
|
||||
dependencies = [
|
||||
"ahash",
|
||||
"fluent-uri",
|
||||
"getrandom 0.3.4",
|
||||
"hashbrown 0.16.1",
|
||||
"hashbrown",
|
||||
"itoa",
|
||||
"micromap",
|
||||
"parking_lot",
|
||||
@@ -971,9 +937,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "regex"
|
||||
version = "1.12.3"
|
||||
version = "1.13.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276"
|
||||
checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d"
|
||||
dependencies = [
|
||||
"aho-corasick",
|
||||
"memchr",
|
||||
@@ -983,9 +949,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "regex-automata"
|
||||
version = "0.4.14"
|
||||
version = "0.4.16"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f"
|
||||
checksum = "8fcfdb36bda0c880c5931cdc7a2bcdc8ba4556847b9d912bca70bc94708711ad"
|
||||
dependencies = [
|
||||
"aho-corasick",
|
||||
"memchr",
|
||||
@@ -994,13 +960,13 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "regex-syntax"
|
||||
version = "0.8.10"
|
||||
version = "0.8.11"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a"
|
||||
checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4"
|
||||
|
||||
[[package]]
|
||||
name = "regorus"
|
||||
version = "0.10.1"
|
||||
version = "0.11.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"chrono",
|
||||
@@ -1013,7 +979,7 @@ dependencies = [
|
||||
"lazy_static",
|
||||
"lru",
|
||||
"msvc_spectre_libs",
|
||||
"num-bigint",
|
||||
"num-bigint 0.5.1",
|
||||
"num-traits",
|
||||
"parking_lot",
|
||||
"postcard",
|
||||
@@ -1032,7 +998,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "regorus-java"
|
||||
version = "0.10.1"
|
||||
version = "0.11.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"jni",
|
||||
@@ -1065,9 +1031,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "rustversion"
|
||||
version = "1.0.22"
|
||||
version = "1.0.23"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
|
||||
checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f"
|
||||
|
||||
[[package]]
|
||||
name = "ryu"
|
||||
@@ -1154,15 +1120,15 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "shlex"
|
||||
version = "1.3.0"
|
||||
version = "2.0.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
|
||||
checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba"
|
||||
|
||||
[[package]]
|
||||
name = "simd_cesu8"
|
||||
version = "1.1.1"
|
||||
version = "1.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "94f90157bb87cddf702797c5dadfa0be7d266cdf49e22da2fcaa32eff75b2c33"
|
||||
checksum = "11031e251abf8611c80f460e19dbdeb54a66db918e49c65a7065b46ac7aec520"
|
||||
dependencies = [
|
||||
"rustc_version",
|
||||
"simdutf8",
|
||||
@@ -1188,15 +1154,15 @@ checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5"
|
||||
|
||||
[[package]]
|
||||
name = "smallvec"
|
||||
version = "1.15.1"
|
||||
version = "1.15.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
|
||||
checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90"
|
||||
|
||||
[[package]]
|
||||
name = "spin"
|
||||
version = "0.12.0"
|
||||
version = "0.12.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1527984ca054dfca79333baec451042863f485fbee01b7bf6d911de915cac865"
|
||||
checksum = "8abadc99fd9c7bbb7d0ca2b31d72a067d0c0dcd7aad25ab8cac71ba91417694b"
|
||||
|
||||
[[package]]
|
||||
name = "stable_deref_trait"
|
||||
@@ -1206,9 +1172,9 @@ checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596"
|
||||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "2.0.117"
|
||||
version = "2.0.119"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99"
|
||||
checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
@@ -1268,12 +1234,6 @@ version = "1.0.24"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
|
||||
|
||||
[[package]]
|
||||
name = "unicode-xid"
|
||||
version = "0.2.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853"
|
||||
|
||||
[[package]]
|
||||
name = "unsafe-libyaml"
|
||||
version = "0.2.11"
|
||||
@@ -1300,11 +1260,11 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
|
||||
|
||||
[[package]]
|
||||
name = "uuid"
|
||||
version = "1.23.1"
|
||||
version = "1.24.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ddd74a9687298c6858e9b88ec8935ec45d22e8fd5e6394fa1bd4e99a87789c76"
|
||||
checksum = "bf3923a6f5c4c6382e0b653c4117f48d631ea17f38ed86e2a828e6f7412f5239"
|
||||
dependencies = [
|
||||
"getrandom 0.4.2",
|
||||
"getrandom 0.4.3",
|
||||
"rand",
|
||||
]
|
||||
|
||||
@@ -1342,27 +1302,18 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "wasip2"
|
||||
version = "1.0.3+wasi-0.2.9"
|
||||
version = "1.0.4+wasi-0.2.12"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6"
|
||||
checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487"
|
||||
dependencies = [
|
||||
"wit-bindgen 0.57.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasip3"
|
||||
version = "0.4.0+wasi-0.3.0-rc-2026-01-06"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5"
|
||||
dependencies = [
|
||||
"wit-bindgen 0.51.0",
|
||||
"wit-bindgen",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen"
|
||||
version = "0.2.122"
|
||||
version = "0.2.126"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3ed04576f974d2b2fba0f38c51dbc5518011e38c36bf1143164be765528fd409"
|
||||
checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"once_cell",
|
||||
@@ -1373,9 +1324,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen-macro"
|
||||
version = "0.2.122"
|
||||
version = "0.2.126"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "916151b09da36bd82f6615cbf3a419e2f0ba23a03c6160e8e92eb6bd4aa1dec6"
|
||||
checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1"
|
||||
dependencies = [
|
||||
"quote",
|
||||
"wasm-bindgen-macro-support",
|
||||
@@ -1383,9 +1334,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen-macro-support"
|
||||
version = "0.2.122"
|
||||
version = "0.2.126"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "299047362ccbfce148b67ab7e73349f77748e00c8296f9542adfad2ad82c5c5e"
|
||||
checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e"
|
||||
dependencies = [
|
||||
"bumpalo",
|
||||
"proc-macro2",
|
||||
@@ -1396,47 +1347,13 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen-shared"
|
||||
version = "0.2.122"
|
||||
version = "0.2.126"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9a929b2c61f11ba3e9bc35b50c1f25cb38e0e892c0c231ae2b8cf78d5dad4437"
|
||||
checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24"
|
||||
dependencies = [
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasm-encoder"
|
||||
version = "0.244.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319"
|
||||
dependencies = [
|
||||
"leb128fmt",
|
||||
"wasmparser",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasm-metadata"
|
||||
version = "0.244.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"indexmap",
|
||||
"wasm-encoder",
|
||||
"wasmparser",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasmparser"
|
||||
version = "0.244.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
"hashbrown 0.15.5",
|
||||
"indexmap",
|
||||
"semver",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "winapi-util"
|
||||
version = "0.1.11"
|
||||
@@ -1514,100 +1431,12 @@ dependencies = [
|
||||
"windows-link",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wit-bindgen"
|
||||
version = "0.51.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5"
|
||||
dependencies = [
|
||||
"wit-bindgen-rust-macro",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wit-bindgen"
|
||||
version = "0.57.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e"
|
||||
|
||||
[[package]]
|
||||
name = "wit-bindgen-core"
|
||||
version = "0.51.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"heck",
|
||||
"wit-parser",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wit-bindgen-rust"
|
||||
version = "0.51.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"heck",
|
||||
"indexmap",
|
||||
"prettyplease",
|
||||
"syn",
|
||||
"wasm-metadata",
|
||||
"wit-bindgen-core",
|
||||
"wit-component",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wit-bindgen-rust-macro"
|
||||
version = "0.51.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"prettyplease",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
"wit-bindgen-core",
|
||||
"wit-bindgen-rust",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wit-component"
|
||||
version = "0.244.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"bitflags",
|
||||
"indexmap",
|
||||
"log",
|
||||
"serde",
|
||||
"serde_derive",
|
||||
"serde_json",
|
||||
"wasm-encoder",
|
||||
"wasm-metadata",
|
||||
"wasmparser",
|
||||
"wit-parser",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wit-parser"
|
||||
version = "0.244.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"id-arena",
|
||||
"indexmap",
|
||||
"log",
|
||||
"semver",
|
||||
"serde",
|
||||
"serde_derive",
|
||||
"serde_json",
|
||||
"unicode-xid",
|
||||
"wasmparser",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "writeable"
|
||||
version = "0.6.3"
|
||||
@@ -1616,9 +1445,9 @@ checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4"
|
||||
|
||||
[[package]]
|
||||
name = "yoke"
|
||||
version = "0.8.2"
|
||||
version = "0.8.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca"
|
||||
checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5"
|
||||
dependencies = [
|
||||
"stable_deref_trait",
|
||||
"yoke-derive",
|
||||
@@ -1639,18 +1468,18 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "zerocopy"
|
||||
version = "0.8.49"
|
||||
version = "0.8.54"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bce33a6288fa3f072a8c2c7d0f2fdbb90e28298f0135c1f99b96c3db2efcc60b"
|
||||
checksum = "b7cbbc0a705a0fd05cc3676525980d2bf5a9bc4adac6d6475209a7887cf59d19"
|
||||
dependencies = [
|
||||
"zerocopy-derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "zerocopy-derive"
|
||||
version = "0.8.49"
|
||||
version = "0.8.54"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8fd425244944f4ab65ccff928e7323354c5a018c75838362fdce749dfad2ee1e"
|
||||
checksum = "e2e817b7b52d0c7358d3246da9d69935ebb18116b2b102b4230dac079b4862f5"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
@@ -1713,6 +1542,6 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "zmij"
|
||||
version = "1.0.21"
|
||||
version = "1.0.23"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa"
|
||||
checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b"
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
[package]
|
||||
name = "regorus-java"
|
||||
version = "0.10.1"
|
||||
version = "0.11.0"
|
||||
edition = "2021"
|
||||
repository = "https://github.com/microsoft/regorus/bindings/java"
|
||||
description = "Java bindings for Regorus - a fast, lightweight Rego interpreter written in Rust"
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
|
||||
<groupId>com.microsoft.regorus</groupId>
|
||||
<artifactId>regorus-java</artifactId>
|
||||
<version>0.10.1</version>
|
||||
<version>0.11.0</version>
|
||||
|
||||
<name>Regorus Java</name>
|
||||
<description>Java bindings for Regorus - a fast, lightweight Rego interpreter written in Rust</description>
|
||||
@@ -97,7 +97,7 @@
|
||||
|
||||
<plugin>
|
||||
<artifactId>maven-surefire-plugin</artifactId>
|
||||
<version>3.5.5</version>
|
||||
<version>3.5.6</version>
|
||||
<configuration>
|
||||
<!-- Add debug build to Java path, so it's discoverable by JVM. This is only for tests. -->
|
||||
<argLine>-Djava.library.path=${project.basedir}/target/debug:${java.library.path}</argLine>
|
||||
|
||||
402
bindings/python/Cargo.lock
generated
402
bindings/python/Cargo.lock
generated
@@ -42,9 +42,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "anyhow"
|
||||
version = "1.0.102"
|
||||
version = "1.0.103"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c"
|
||||
checksum = "2a4385e2e34eb35d6b3efe798b9eb88096925d87726c0798709bf56d9ed84af3"
|
||||
|
||||
[[package]]
|
||||
name = "autocfg"
|
||||
@@ -69,9 +69,9 @@ checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7"
|
||||
|
||||
[[package]]
|
||||
name = "bitflags"
|
||||
version = "2.11.1"
|
||||
version = "2.13.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3"
|
||||
checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da"
|
||||
|
||||
[[package]]
|
||||
name = "borrow-or-share"
|
||||
@@ -81,12 +81,12 @@ checksum = "dc0b364ead1874514c8c2855ab558056ebfeb775653e7ae45ff72f28f8f3166c"
|
||||
|
||||
[[package]]
|
||||
name = "bstr"
|
||||
version = "1.12.1"
|
||||
version = "1.13.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "63044e1ae8e69f3b5a92c736ca6269b8d12fa7efe39bf34ddb06d102cf0e2cab"
|
||||
checksum = "1f7dc094d718f2e1c1559ad110e27eeaae14a5465d3d56dd6dbd793079fbd530"
|
||||
dependencies = [
|
||||
"memchr",
|
||||
"serde",
|
||||
"serde_core",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -103,9 +103,9 @@ checksum = "175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e"
|
||||
|
||||
[[package]]
|
||||
name = "cc"
|
||||
version = "1.2.62"
|
||||
version = "1.2.67"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a1dce859f0832a7d088c4f1119888ab94ef4b5d6795d1ce05afb7fe159d79f98"
|
||||
checksum = "e17dd265a7d0f31ef544e1b20e03add05d3b45b491b633b10d67145d2acc1a38"
|
||||
dependencies = [
|
||||
"find-msvc-tools",
|
||||
"shlex",
|
||||
@@ -119,9 +119,9 @@ checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
|
||||
|
||||
[[package]]
|
||||
name = "chacha20"
|
||||
version = "0.10.0"
|
||||
version = "0.10.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6f8d983286843e49675a4b7a2d174efe136dc93a18d69130dd18198a6c167601"
|
||||
checksum = "d524456ba66e72eb8b115ff89e01e497f8e6d11d78b70b1aa13c0fbd97540a81"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"cpufeatures",
|
||||
@@ -130,9 +130,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "chrono"
|
||||
version = "0.4.44"
|
||||
version = "0.4.45"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0"
|
||||
checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327"
|
||||
dependencies = [
|
||||
"iana-time-zone",
|
||||
"js-sys",
|
||||
@@ -247,12 +247,6 @@ dependencies = [
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "foldhash"
|
||||
version = "0.1.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2"
|
||||
|
||||
[[package]]
|
||||
name = "foldhash"
|
||||
version = "0.2.0"
|
||||
@@ -318,23 +312,21 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "getrandom"
|
||||
version = "0.4.2"
|
||||
version = "0.4.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555"
|
||||
checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"libc",
|
||||
"r-efi 6.0.0",
|
||||
"rand_core",
|
||||
"wasip2",
|
||||
"wasip3",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "globset"
|
||||
version = "0.4.18"
|
||||
version = "0.4.19"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "52dfc19153a48bde0cbd630453615c8151bce3a5adfac7a0aebfbf0a1e1f57e3"
|
||||
checksum = "e47d37d2ae4464254884b60ab7071be2b876a9c35b696bd018ddcc76847309cd"
|
||||
dependencies = [
|
||||
"aho-corasick",
|
||||
"bstr",
|
||||
@@ -342,31 +334,16 @@ dependencies = [
|
||||
"regex-syntax",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "hashbrown"
|
||||
version = "0.15.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1"
|
||||
dependencies = [
|
||||
"foldhash 0.1.5",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "hashbrown"
|
||||
version = "0.16.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100"
|
||||
dependencies = [
|
||||
"allocator-api2",
|
||||
"equivalent",
|
||||
"foldhash 0.2.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "hashbrown"
|
||||
version = "0.17.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a"
|
||||
dependencies = [
|
||||
"allocator-api2",
|
||||
"equivalent",
|
||||
"foldhash",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "heck"
|
||||
@@ -480,12 +457,6 @@ dependencies = [
|
||||
"zerovec",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "id-arena"
|
||||
version = "2.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954"
|
||||
|
||||
[[package]]
|
||||
name = "idna"
|
||||
version = "1.1.0"
|
||||
@@ -514,7 +485,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9"
|
||||
dependencies = [
|
||||
"equivalent",
|
||||
"hashbrown 0.17.1",
|
||||
"hashbrown",
|
||||
"serde",
|
||||
"serde_core",
|
||||
]
|
||||
@@ -533,21 +504,20 @@ checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682"
|
||||
|
||||
[[package]]
|
||||
name = "js-sys"
|
||||
version = "0.3.99"
|
||||
version = "0.3.103"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "142bc4740e452c1e57ade0cbc129f139c9093e354346f0872ef985f4f5cf5f11"
|
||||
checksum = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"futures-util",
|
||||
"once_cell",
|
||||
"wasm-bindgen",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "jsonschema"
|
||||
version = "0.46.5"
|
||||
version = "0.47.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6a5fe5206f06e589caf25e79fc05ccdf91fca745685fe9fe1a13bbdfb479a631"
|
||||
checksum = "281c43ff06dcb331e9356d30e38853d559ce3d0a3f693e0b0e102667dec14fb1"
|
||||
dependencies = [
|
||||
"ahash",
|
||||
"bytecount",
|
||||
@@ -558,30 +528,33 @@ dependencies = [
|
||||
"getrandom 0.3.4",
|
||||
"idna",
|
||||
"itoa",
|
||||
"jsonschema-regex",
|
||||
"num-cmp",
|
||||
"num-traits",
|
||||
"percent-encoding",
|
||||
"referencing",
|
||||
"regex",
|
||||
"regex-syntax",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"unicode-general-category",
|
||||
"uuid-simd",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "jsonschema-regex"
|
||||
version = "0.47.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ee0b351864e7ffbc5db9273daf7fa1b4d5177b0946713d667ca571b83c0b4045"
|
||||
dependencies = [
|
||||
"regex-syntax",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "lazy_static"
|
||||
version = "1.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
|
||||
|
||||
[[package]]
|
||||
name = "leb128fmt"
|
||||
version = "0.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2"
|
||||
|
||||
[[package]]
|
||||
name = "libc"
|
||||
version = "0.2.186"
|
||||
@@ -605,21 +578,21 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "log"
|
||||
version = "0.4.30"
|
||||
version = "0.4.33"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "616ec5685824bcc94416c6d4a7a446eea774a31efd7062c8480ba6fd06d7a6e5"
|
||||
checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad"
|
||||
|
||||
[[package]]
|
||||
name = "lru"
|
||||
version = "0.18.0"
|
||||
version = "0.18.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8a860605968fce16869fd239cf4237a82f3ac470723415db603b0e8b6c8d4fb9"
|
||||
checksum = "0b6180140927ee907000b0aa540091f6ea512ead4447c92b8fc35bc72788a5a6"
|
||||
|
||||
[[package]]
|
||||
name = "memchr"
|
||||
version = "2.8.1"
|
||||
version = "2.8.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6b947ae49db0d222b1dbc6b113ce7248a3fc3a6ca21b696717bfc000ba4484d8"
|
||||
checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98"
|
||||
|
||||
[[package]]
|
||||
name = "micromap"
|
||||
@@ -642,7 +615,7 @@ version = "0.4.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23"
|
||||
dependencies = [
|
||||
"num-bigint",
|
||||
"num-bigint 0.4.8",
|
||||
"num-complex",
|
||||
"num-integer",
|
||||
"num-iter",
|
||||
@@ -652,9 +625,19 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "num-bigint"
|
||||
version = "0.4.6"
|
||||
version = "0.4.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9"
|
||||
checksum = "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367"
|
||||
dependencies = [
|
||||
"num-integer",
|
||||
"num-traits",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "num-bigint"
|
||||
version = "0.5.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "93e7820bc0a80a0238e650327316f929ba18d5be054b647490a3a6a339f3e7c0"
|
||||
dependencies = [
|
||||
"num-integer",
|
||||
"num-traits",
|
||||
@@ -686,11 +669,10 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "num-iter"
|
||||
version = "0.1.45"
|
||||
version = "0.1.46"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf"
|
||||
checksum = "c92800bd69a1eac91786bcfe9da64a897eb72911b8dc3095decbd07429e8048b"
|
||||
dependencies = [
|
||||
"autocfg",
|
||||
"num-integer",
|
||||
"num-traits",
|
||||
]
|
||||
@@ -701,7 +683,7 @@ version = "0.4.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824"
|
||||
dependencies = [
|
||||
"num-bigint",
|
||||
"num-bigint 0.4.8",
|
||||
"num-integer",
|
||||
"num-traits",
|
||||
]
|
||||
@@ -816,16 +798,6 @@ dependencies = [
|
||||
"zerovec",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "prettyplease"
|
||||
version = "0.2.37"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro2"
|
||||
version = "1.0.106"
|
||||
@@ -837,9 +809,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "pyo3"
|
||||
version = "0.28.3"
|
||||
version = "0.29.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "91fd8e38a3b50ed1167fb981cd6fd60147e091784c427b8f7183a7ee32c31c12"
|
||||
checksum = "cd274650b21d4bfc26a0a47587962c1edb425f69287324355cd040c3ea66071c"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"libc",
|
||||
@@ -852,18 +824,18 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "pyo3-build-config"
|
||||
version = "0.28.3"
|
||||
version = "0.29.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e368e7ddfdeb98c9bca7f8383be1648fd84ab466bf2bc015e94008db6d35611e"
|
||||
checksum = "c5e2a7d2f0d013342f295c048ad19237add5154a55b1c5a254c0ec93d4109078"
|
||||
dependencies = [
|
||||
"target-lexicon",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "pyo3-ffi"
|
||||
version = "0.28.3"
|
||||
version = "0.29.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7f29e10af80b1f7ccaf7f69eace800a03ecd13e883acfacc1e5d0988605f651e"
|
||||
checksum = "ca85c467da1bbc8d866eea5deff9cf29ea5f7785054a17da36e65bda9c05845b"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"pyo3-build-config",
|
||||
@@ -871,9 +843,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "pyo3-macros"
|
||||
version = "0.28.3"
|
||||
version = "0.29.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "df6e520eff47c45997d2fc7dd8214b25dd1310918bbb2642156ef66a67f29813"
|
||||
checksum = "9ac53762fd065daa3194dd09337a38bd793a188100fd1a9304c4ab312d901771"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"pyo3-macros-backend",
|
||||
@@ -883,22 +855,21 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "pyo3-macros-backend"
|
||||
version = "0.28.3"
|
||||
version = "0.29.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c4cdc218d835738f81c2338f822078af45b4afdf8b2e33cbb5916f108b813acb"
|
||||
checksum = "4ca3a1557399783172dc5bf39cfca835157732532cba56b71d2292161e53b362"
|
||||
dependencies = [
|
||||
"heck",
|
||||
"proc-macro2",
|
||||
"pyo3-build-config",
|
||||
"quote",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "quote"
|
||||
version = "1.0.45"
|
||||
version = "1.0.46"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924"
|
||||
checksum = "dfbc457d0c7a0759a614551b11a6409e5951f6c7537be1f1b7682b9ae9230368"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
]
|
||||
@@ -917,12 +888,12 @@ checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf"
|
||||
|
||||
[[package]]
|
||||
name = "rand"
|
||||
version = "0.10.1"
|
||||
version = "0.10.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d2e8e8bcc7961af1fdac401278c6a831614941f6164ee3bf4ce61b7edb162207"
|
||||
checksum = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80"
|
||||
dependencies = [
|
||||
"chacha20",
|
||||
"getrandom 0.4.2",
|
||||
"getrandom 0.4.3",
|
||||
"rand_core",
|
||||
]
|
||||
|
||||
@@ -963,14 +934,14 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "referencing"
|
||||
version = "0.46.5"
|
||||
version = "0.47.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "69e4e17ef386c5383591d07623d3de49cbc601156e7582973e6db98d66a57de2"
|
||||
checksum = "348e860aeb0b7bd035778fd11dd9cd5290d32e4aed3b8f2274a00287a9fd362b"
|
||||
dependencies = [
|
||||
"ahash",
|
||||
"fluent-uri",
|
||||
"getrandom 0.3.4",
|
||||
"hashbrown 0.16.1",
|
||||
"hashbrown",
|
||||
"itoa",
|
||||
"micromap",
|
||||
"parking_lot",
|
||||
@@ -980,9 +951,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "regex"
|
||||
version = "1.12.3"
|
||||
version = "1.13.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276"
|
||||
checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d"
|
||||
dependencies = [
|
||||
"aho-corasick",
|
||||
"memchr",
|
||||
@@ -992,9 +963,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "regex-automata"
|
||||
version = "0.4.14"
|
||||
version = "0.4.16"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f"
|
||||
checksum = "8fcfdb36bda0c880c5931cdc7a2bcdc8ba4556847b9d912bca70bc94708711ad"
|
||||
dependencies = [
|
||||
"aho-corasick",
|
||||
"memchr",
|
||||
@@ -1003,13 +974,13 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "regex-syntax"
|
||||
version = "0.8.10"
|
||||
version = "0.8.11"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a"
|
||||
checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4"
|
||||
|
||||
[[package]]
|
||||
name = "regorus"
|
||||
version = "0.10.1"
|
||||
version = "0.11.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"chrono",
|
||||
@@ -1022,7 +993,7 @@ dependencies = [
|
||||
"lazy_static",
|
||||
"lru",
|
||||
"msvc_spectre_libs",
|
||||
"num-bigint",
|
||||
"num-bigint 0.5.1",
|
||||
"num-traits",
|
||||
"parking_lot",
|
||||
"postcard",
|
||||
@@ -1055,7 +1026,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "regoruspy"
|
||||
version = "0.10.1"
|
||||
version = "0.11.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"ordered-float",
|
||||
@@ -1066,9 +1037,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "rustversion"
|
||||
version = "1.0.22"
|
||||
version = "1.0.23"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
|
||||
checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f"
|
||||
|
||||
[[package]]
|
||||
name = "ryu"
|
||||
@@ -1146,9 +1117,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "shlex"
|
||||
version = "1.3.0"
|
||||
version = "2.0.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
|
||||
checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba"
|
||||
|
||||
[[package]]
|
||||
name = "siphasher"
|
||||
@@ -1164,15 +1135,15 @@ checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5"
|
||||
|
||||
[[package]]
|
||||
name = "smallvec"
|
||||
version = "1.15.1"
|
||||
version = "1.15.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
|
||||
checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90"
|
||||
|
||||
[[package]]
|
||||
name = "spin"
|
||||
version = "0.12.0"
|
||||
version = "0.12.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1527984ca054dfca79333baec451042863f485fbee01b7bf6d911de915cac865"
|
||||
checksum = "8abadc99fd9c7bbb7d0ca2b31d72a067d0c0dcd7aad25ab8cac71ba91417694b"
|
||||
|
||||
[[package]]
|
||||
name = "stable_deref_trait"
|
||||
@@ -1182,9 +1153,9 @@ checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596"
|
||||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "2.0.117"
|
||||
version = "2.0.119"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99"
|
||||
checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
@@ -1250,12 +1221,6 @@ version = "1.0.24"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
|
||||
|
||||
[[package]]
|
||||
name = "unicode-xid"
|
||||
version = "0.2.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853"
|
||||
|
||||
[[package]]
|
||||
name = "unsafe-libyaml"
|
||||
version = "0.2.11"
|
||||
@@ -1282,11 +1247,11 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
|
||||
|
||||
[[package]]
|
||||
name = "uuid"
|
||||
version = "1.23.1"
|
||||
version = "1.24.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ddd74a9687298c6858e9b88ec8935ec45d22e8fd5e6394fa1bd4e99a87789c76"
|
||||
checksum = "bf3923a6f5c4c6382e0b653c4117f48d631ea17f38ed86e2a828e6f7412f5239"
|
||||
dependencies = [
|
||||
"getrandom 0.4.2",
|
||||
"getrandom 0.4.3",
|
||||
"rand",
|
||||
]
|
||||
|
||||
@@ -1314,27 +1279,18 @@ checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64"
|
||||
|
||||
[[package]]
|
||||
name = "wasip2"
|
||||
version = "1.0.3+wasi-0.2.9"
|
||||
version = "1.0.4+wasi-0.2.12"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6"
|
||||
checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487"
|
||||
dependencies = [
|
||||
"wit-bindgen 0.57.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasip3"
|
||||
version = "0.4.0+wasi-0.3.0-rc-2026-01-06"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5"
|
||||
dependencies = [
|
||||
"wit-bindgen 0.51.0",
|
||||
"wit-bindgen",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen"
|
||||
version = "0.2.122"
|
||||
version = "0.2.126"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3ed04576f974d2b2fba0f38c51dbc5518011e38c36bf1143164be765528fd409"
|
||||
checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"once_cell",
|
||||
@@ -1345,9 +1301,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen-macro"
|
||||
version = "0.2.122"
|
||||
version = "0.2.126"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "916151b09da36bd82f6615cbf3a419e2f0ba23a03c6160e8e92eb6bd4aa1dec6"
|
||||
checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1"
|
||||
dependencies = [
|
||||
"quote",
|
||||
"wasm-bindgen-macro-support",
|
||||
@@ -1355,9 +1311,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen-macro-support"
|
||||
version = "0.2.122"
|
||||
version = "0.2.126"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "299047362ccbfce148b67ab7e73349f77748e00c8296f9542adfad2ad82c5c5e"
|
||||
checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e"
|
||||
dependencies = [
|
||||
"bumpalo",
|
||||
"proc-macro2",
|
||||
@@ -1368,47 +1324,13 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen-shared"
|
||||
version = "0.2.122"
|
||||
version = "0.2.126"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9a929b2c61f11ba3e9bc35b50c1f25cb38e0e892c0c231ae2b8cf78d5dad4437"
|
||||
checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24"
|
||||
dependencies = [
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasm-encoder"
|
||||
version = "0.244.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319"
|
||||
dependencies = [
|
||||
"leb128fmt",
|
||||
"wasmparser",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasm-metadata"
|
||||
version = "0.244.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"indexmap",
|
||||
"wasm-encoder",
|
||||
"wasmparser",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasmparser"
|
||||
version = "0.244.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
"hashbrown 0.15.5",
|
||||
"indexmap",
|
||||
"semver",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-core"
|
||||
version = "0.62.2"
|
||||
@@ -1468,100 +1390,12 @@ dependencies = [
|
||||
"windows-link",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wit-bindgen"
|
||||
version = "0.51.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5"
|
||||
dependencies = [
|
||||
"wit-bindgen-rust-macro",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wit-bindgen"
|
||||
version = "0.57.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e"
|
||||
|
||||
[[package]]
|
||||
name = "wit-bindgen-core"
|
||||
version = "0.51.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"heck",
|
||||
"wit-parser",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wit-bindgen-rust"
|
||||
version = "0.51.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"heck",
|
||||
"indexmap",
|
||||
"prettyplease",
|
||||
"syn",
|
||||
"wasm-metadata",
|
||||
"wit-bindgen-core",
|
||||
"wit-component",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wit-bindgen-rust-macro"
|
||||
version = "0.51.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"prettyplease",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
"wit-bindgen-core",
|
||||
"wit-bindgen-rust",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wit-component"
|
||||
version = "0.244.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"bitflags",
|
||||
"indexmap",
|
||||
"log",
|
||||
"serde",
|
||||
"serde_derive",
|
||||
"serde_json",
|
||||
"wasm-encoder",
|
||||
"wasm-metadata",
|
||||
"wasmparser",
|
||||
"wit-parser",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wit-parser"
|
||||
version = "0.244.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"id-arena",
|
||||
"indexmap",
|
||||
"log",
|
||||
"semver",
|
||||
"serde",
|
||||
"serde_derive",
|
||||
"serde_json",
|
||||
"unicode-xid",
|
||||
"wasmparser",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "writeable"
|
||||
version = "0.6.3"
|
||||
@@ -1570,9 +1404,9 @@ checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4"
|
||||
|
||||
[[package]]
|
||||
name = "yoke"
|
||||
version = "0.8.2"
|
||||
version = "0.8.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca"
|
||||
checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5"
|
||||
dependencies = [
|
||||
"stable_deref_trait",
|
||||
"yoke-derive",
|
||||
@@ -1593,18 +1427,18 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "zerocopy"
|
||||
version = "0.8.49"
|
||||
version = "0.8.54"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bce33a6288fa3f072a8c2c7d0f2fdbb90e28298f0135c1f99b96c3db2efcc60b"
|
||||
checksum = "b7cbbc0a705a0fd05cc3676525980d2bf5a9bc4adac6d6475209a7887cf59d19"
|
||||
dependencies = [
|
||||
"zerocopy-derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "zerocopy-derive"
|
||||
version = "0.8.49"
|
||||
version = "0.8.54"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8fd425244944f4ab65ccff928e7323354c5a018c75838362fdce749dfad2ee1e"
|
||||
checksum = "e2e817b7b52d0c7358d3246da9d69935ebb18116b2b102b4230dac079b4862f5"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
@@ -1667,6 +1501,6 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "zmij"
|
||||
version = "1.0.21"
|
||||
version = "1.0.23"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa"
|
||||
checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b"
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
[package]
|
||||
name = "regoruspy"
|
||||
version = "0.10.1"
|
||||
version = "0.11.0"
|
||||
edition = "2021"
|
||||
repository = "https://github.com/microsoft/regorus/bindings/python"
|
||||
description = "Python bindings for Regorus - a fast, lightweight Rego interpreter written in Rust"
|
||||
@@ -23,7 +23,7 @@ coverage = ["regorus/coverage"]
|
||||
[dependencies]
|
||||
anyhow = "1.0"
|
||||
ordered-float = "5.3.0"
|
||||
pyo3 = { version = "0.28.3", features = ["abi3-py310", "anyhow", "extension-module"] }
|
||||
pyo3 = { version = "0.29.0", features = ["abi3-py310", "anyhow", "extension-module"] }
|
||||
regorus = { path = "../..", default-features = false, features = ["arc", "rvm"] }
|
||||
serde_json = "1.0.150"
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
[build-system]
|
||||
requires = ["maturin>=1.4,<2.0"]
|
||||
requires = ["maturin>=1.14.1,<2.0"]
|
||||
build-backend = "maturin"
|
||||
|
||||
[project]
|
||||
|
||||
397
bindings/ruby/Cargo.lock
generated
397
bindings/ruby/Cargo.lock
generated
@@ -42,9 +42,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "anyhow"
|
||||
version = "1.0.102"
|
||||
version = "1.0.103"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c"
|
||||
checksum = "2a4385e2e34eb35d6b3efe798b9eb88096925d87726c0798709bf56d9ed84af3"
|
||||
|
||||
[[package]]
|
||||
name = "autocfg"
|
||||
@@ -66,7 +66,7 @@ dependencies = [
|
||||
"quote",
|
||||
"regex",
|
||||
"rustc-hash",
|
||||
"shlex",
|
||||
"shlex 1.3.0",
|
||||
"syn",
|
||||
]
|
||||
|
||||
@@ -87,9 +87,9 @@ checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7"
|
||||
|
||||
[[package]]
|
||||
name = "bitflags"
|
||||
version = "2.11.1"
|
||||
version = "2.13.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3"
|
||||
checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da"
|
||||
|
||||
[[package]]
|
||||
name = "borrow-or-share"
|
||||
@@ -99,12 +99,12 @@ checksum = "dc0b364ead1874514c8c2855ab558056ebfeb775653e7ae45ff72f28f8f3166c"
|
||||
|
||||
[[package]]
|
||||
name = "bstr"
|
||||
version = "1.12.1"
|
||||
version = "1.13.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "63044e1ae8e69f3b5a92c736ca6269b8d12fa7efe39bf34ddb06d102cf0e2cab"
|
||||
checksum = "1f7dc094d718f2e1c1559ad110e27eeaae14a5465d3d56dd6dbd793079fbd530"
|
||||
dependencies = [
|
||||
"memchr",
|
||||
"serde",
|
||||
"serde_core",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -121,12 +121,12 @@ checksum = "175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e"
|
||||
|
||||
[[package]]
|
||||
name = "cc"
|
||||
version = "1.2.62"
|
||||
version = "1.2.67"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a1dce859f0832a7d088c4f1119888ab94ef4b5d6795d1ce05afb7fe159d79f98"
|
||||
checksum = "e17dd265a7d0f31ef544e1b20e03add05d3b45b491b633b10d67145d2acc1a38"
|
||||
dependencies = [
|
||||
"find-msvc-tools",
|
||||
"shlex",
|
||||
"shlex 2.0.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -146,9 +146,9 @@ checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
|
||||
|
||||
[[package]]
|
||||
name = "chacha20"
|
||||
version = "0.10.0"
|
||||
version = "0.10.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6f8d983286843e49675a4b7a2d174efe136dc93a18d69130dd18198a6c167601"
|
||||
checksum = "d524456ba66e72eb8b115ff89e01e497f8e6d11d78b70b1aa13c0fbd97540a81"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"cpufeatures",
|
||||
@@ -157,9 +157,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "chrono"
|
||||
version = "0.4.44"
|
||||
version = "0.4.45"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0"
|
||||
checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327"
|
||||
dependencies = [
|
||||
"iana-time-zone",
|
||||
"js-sys",
|
||||
@@ -270,12 +270,6 @@ dependencies = [
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "foldhash"
|
||||
version = "0.1.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2"
|
||||
|
||||
[[package]]
|
||||
name = "foldhash"
|
||||
version = "0.2.0"
|
||||
@@ -341,16 +335,14 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "getrandom"
|
||||
version = "0.4.2"
|
||||
version = "0.4.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555"
|
||||
checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"libc",
|
||||
"r-efi 6.0.0",
|
||||
"rand_core",
|
||||
"wasip2",
|
||||
"wasip3",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -361,9 +353,9 @@ checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280"
|
||||
|
||||
[[package]]
|
||||
name = "globset"
|
||||
version = "0.4.18"
|
||||
version = "0.4.19"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "52dfc19153a48bde0cbd630453615c8151bce3a5adfac7a0aebfbf0a1e1f57e3"
|
||||
checksum = "e47d37d2ae4464254884b60ab7071be2b876a9c35b696bd018ddcc76847309cd"
|
||||
dependencies = [
|
||||
"aho-corasick",
|
||||
"bstr",
|
||||
@@ -371,37 +363,16 @@ dependencies = [
|
||||
"regex-syntax",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "hashbrown"
|
||||
version = "0.15.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1"
|
||||
dependencies = [
|
||||
"foldhash 0.1.5",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "hashbrown"
|
||||
version = "0.16.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100"
|
||||
dependencies = [
|
||||
"allocator-api2",
|
||||
"equivalent",
|
||||
"foldhash 0.2.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "hashbrown"
|
||||
version = "0.17.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a"
|
||||
|
||||
[[package]]
|
||||
name = "heck"
|
||||
version = "0.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
|
||||
dependencies = [
|
||||
"allocator-api2",
|
||||
"equivalent",
|
||||
"foldhash",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "iana-time-zone"
|
||||
@@ -509,12 +480,6 @@ dependencies = [
|
||||
"zerovec",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "id-arena"
|
||||
version = "2.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954"
|
||||
|
||||
[[package]]
|
||||
name = "idna"
|
||||
version = "1.1.0"
|
||||
@@ -543,7 +508,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9"
|
||||
dependencies = [
|
||||
"equivalent",
|
||||
"hashbrown 0.17.1",
|
||||
"hashbrown",
|
||||
"serde",
|
||||
"serde_core",
|
||||
]
|
||||
@@ -571,21 +536,20 @@ checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682"
|
||||
|
||||
[[package]]
|
||||
name = "js-sys"
|
||||
version = "0.3.99"
|
||||
version = "0.3.103"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "142bc4740e452c1e57ade0cbc129f139c9093e354346f0872ef985f4f5cf5f11"
|
||||
checksum = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"futures-util",
|
||||
"once_cell",
|
||||
"wasm-bindgen",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "jsonschema"
|
||||
version = "0.46.5"
|
||||
version = "0.47.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6a5fe5206f06e589caf25e79fc05ccdf91fca745685fe9fe1a13bbdfb479a631"
|
||||
checksum = "281c43ff06dcb331e9356d30e38853d559ce3d0a3f693e0b0e102667dec14fb1"
|
||||
dependencies = [
|
||||
"ahash",
|
||||
"bytecount",
|
||||
@@ -596,30 +560,33 @@ dependencies = [
|
||||
"getrandom 0.3.4",
|
||||
"idna",
|
||||
"itoa",
|
||||
"jsonschema-regex",
|
||||
"num-cmp",
|
||||
"num-traits",
|
||||
"percent-encoding",
|
||||
"referencing",
|
||||
"regex",
|
||||
"regex-syntax",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"unicode-general-category",
|
||||
"uuid-simd",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "jsonschema-regex"
|
||||
version = "0.47.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ee0b351864e7ffbc5db9273daf7fa1b4d5177b0946713d667ca571b83c0b4045"
|
||||
dependencies = [
|
||||
"regex-syntax",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "lazy_static"
|
||||
version = "1.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
|
||||
|
||||
[[package]]
|
||||
name = "leb128fmt"
|
||||
version = "0.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2"
|
||||
|
||||
[[package]]
|
||||
name = "libc"
|
||||
version = "0.2.186"
|
||||
@@ -653,15 +620,15 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "log"
|
||||
version = "0.4.30"
|
||||
version = "0.4.33"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "616ec5685824bcc94416c6d4a7a446eea774a31efd7062c8480ba6fd06d7a6e5"
|
||||
checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad"
|
||||
|
||||
[[package]]
|
||||
name = "lru"
|
||||
version = "0.18.0"
|
||||
version = "0.18.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8a860605968fce16869fd239cf4237a82f3ac470723415db603b0e8b6c8d4fb9"
|
||||
checksum = "0b6180140927ee907000b0aa540091f6ea512ead4447c92b8fc35bc72788a5a6"
|
||||
|
||||
[[package]]
|
||||
name = "magnus"
|
||||
@@ -688,9 +655,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "memchr"
|
||||
version = "2.8.1"
|
||||
version = "2.8.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6b947ae49db0d222b1dbc6b113ce7248a3fc3a6ca21b696717bfc000ba4484d8"
|
||||
checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98"
|
||||
|
||||
[[package]]
|
||||
name = "micromap"
|
||||
@@ -729,7 +696,7 @@ version = "0.4.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23"
|
||||
dependencies = [
|
||||
"num-bigint",
|
||||
"num-bigint 0.4.8",
|
||||
"num-complex",
|
||||
"num-integer",
|
||||
"num-iter",
|
||||
@@ -739,9 +706,19 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "num-bigint"
|
||||
version = "0.4.6"
|
||||
version = "0.4.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9"
|
||||
checksum = "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367"
|
||||
dependencies = [
|
||||
"num-integer",
|
||||
"num-traits",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "num-bigint"
|
||||
version = "0.5.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "93e7820bc0a80a0238e650327316f929ba18d5be054b647490a3a6a339f3e7c0"
|
||||
dependencies = [
|
||||
"num-integer",
|
||||
"num-traits",
|
||||
@@ -773,11 +750,10 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "num-iter"
|
||||
version = "0.1.45"
|
||||
version = "0.1.46"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf"
|
||||
checksum = "c92800bd69a1eac91786bcfe9da64a897eb72911b8dc3095decbd07429e8048b"
|
||||
dependencies = [
|
||||
"autocfg",
|
||||
"num-integer",
|
||||
"num-traits",
|
||||
]
|
||||
@@ -788,7 +764,7 @@ version = "0.4.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824"
|
||||
dependencies = [
|
||||
"num-bigint",
|
||||
"num-bigint 0.4.8",
|
||||
"num-integer",
|
||||
"num-traits",
|
||||
]
|
||||
@@ -876,16 +852,6 @@ dependencies = [
|
||||
"zerovec",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "prettyplease"
|
||||
version = "0.2.37"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro2"
|
||||
version = "1.0.106"
|
||||
@@ -897,9 +863,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "quote"
|
||||
version = "1.0.45"
|
||||
version = "1.0.46"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924"
|
||||
checksum = "dfbc457d0c7a0759a614551b11a6409e5951f6c7537be1f1b7682b9ae9230368"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
]
|
||||
@@ -918,12 +884,12 @@ checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf"
|
||||
|
||||
[[package]]
|
||||
name = "rand"
|
||||
version = "0.10.1"
|
||||
version = "0.10.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d2e8e8bcc7961af1fdac401278c6a831614941f6164ee3bf4ce61b7edb162207"
|
||||
checksum = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80"
|
||||
dependencies = [
|
||||
"chacha20",
|
||||
"getrandom 0.4.2",
|
||||
"getrandom 0.4.3",
|
||||
"rand_core",
|
||||
]
|
||||
|
||||
@@ -994,14 +960,14 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "referencing"
|
||||
version = "0.46.5"
|
||||
version = "0.47.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "69e4e17ef386c5383591d07623d3de49cbc601156e7582973e6db98d66a57de2"
|
||||
checksum = "348e860aeb0b7bd035778fd11dd9cd5290d32e4aed3b8f2274a00287a9fd362b"
|
||||
dependencies = [
|
||||
"ahash",
|
||||
"fluent-uri",
|
||||
"getrandom 0.3.4",
|
||||
"hashbrown 0.16.1",
|
||||
"hashbrown",
|
||||
"itoa",
|
||||
"micromap",
|
||||
"parking_lot",
|
||||
@@ -1011,9 +977,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "regex"
|
||||
version = "1.12.3"
|
||||
version = "1.13.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276"
|
||||
checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d"
|
||||
dependencies = [
|
||||
"aho-corasick",
|
||||
"memchr",
|
||||
@@ -1023,9 +989,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "regex-automata"
|
||||
version = "0.4.14"
|
||||
version = "0.4.16"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f"
|
||||
checksum = "8fcfdb36bda0c880c5931cdc7a2bcdc8ba4556847b9d912bca70bc94708711ad"
|
||||
dependencies = [
|
||||
"aho-corasick",
|
||||
"memchr",
|
||||
@@ -1034,13 +1000,13 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "regex-syntax"
|
||||
version = "0.8.10"
|
||||
version = "0.8.11"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a"
|
||||
checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4"
|
||||
|
||||
[[package]]
|
||||
name = "regorus"
|
||||
version = "0.10.1"
|
||||
version = "0.11.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"chrono",
|
||||
@@ -1053,7 +1019,7 @@ dependencies = [
|
||||
"lazy_static",
|
||||
"lru",
|
||||
"msvc_spectre_libs",
|
||||
"num-bigint",
|
||||
"num-bigint 0.5.1",
|
||||
"num-traits",
|
||||
"parking_lot",
|
||||
"rand",
|
||||
@@ -1085,7 +1051,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "regorusrb"
|
||||
version = "0.10.1"
|
||||
version = "0.11.0"
|
||||
dependencies = [
|
||||
"magnus",
|
||||
"regorus",
|
||||
@@ -1096,15 +1062,15 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "rustc-hash"
|
||||
version = "2.1.2"
|
||||
version = "2.1.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe"
|
||||
checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d"
|
||||
|
||||
[[package]]
|
||||
name = "rustversion"
|
||||
version = "1.0.22"
|
||||
version = "1.0.23"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
|
||||
checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f"
|
||||
|
||||
[[package]]
|
||||
name = "ryu"
|
||||
@@ -1209,6 +1175,12 @@ version = "1.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
|
||||
|
||||
[[package]]
|
||||
name = "shlex"
|
||||
version = "2.0.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba"
|
||||
|
||||
[[package]]
|
||||
name = "siphasher"
|
||||
version = "1.0.3"
|
||||
@@ -1223,15 +1195,15 @@ checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5"
|
||||
|
||||
[[package]]
|
||||
name = "smallvec"
|
||||
version = "1.15.1"
|
||||
version = "1.15.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
|
||||
checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90"
|
||||
|
||||
[[package]]
|
||||
name = "spin"
|
||||
version = "0.12.0"
|
||||
version = "0.12.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1527984ca054dfca79333baec451042863f485fbee01b7bf6d911de915cac865"
|
||||
checksum = "8abadc99fd9c7bbb7d0ca2b31d72a067d0c0dcd7aad25ab8cac71ba91417694b"
|
||||
|
||||
[[package]]
|
||||
name = "stable_deref_trait"
|
||||
@@ -1241,9 +1213,9 @@ checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596"
|
||||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "2.0.117"
|
||||
version = "2.0.119"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99"
|
||||
checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
@@ -1309,12 +1281,6 @@ version = "1.0.24"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
|
||||
|
||||
[[package]]
|
||||
name = "unicode-xid"
|
||||
version = "0.2.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853"
|
||||
|
||||
[[package]]
|
||||
name = "unsafe-libyaml"
|
||||
version = "0.2.11"
|
||||
@@ -1341,11 +1307,11 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
|
||||
|
||||
[[package]]
|
||||
name = "uuid"
|
||||
version = "1.23.1"
|
||||
version = "1.24.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ddd74a9687298c6858e9b88ec8935ec45d22e8fd5e6394fa1bd4e99a87789c76"
|
||||
checksum = "bf3923a6f5c4c6382e0b653c4117f48d631ea17f38ed86e2a828e6f7412f5239"
|
||||
dependencies = [
|
||||
"getrandom 0.4.2",
|
||||
"getrandom 0.4.3",
|
||||
"rand",
|
||||
]
|
||||
|
||||
@@ -1373,27 +1339,18 @@ checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64"
|
||||
|
||||
[[package]]
|
||||
name = "wasip2"
|
||||
version = "1.0.3+wasi-0.2.9"
|
||||
version = "1.0.4+wasi-0.2.12"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6"
|
||||
checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487"
|
||||
dependencies = [
|
||||
"wit-bindgen 0.57.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasip3"
|
||||
version = "0.4.0+wasi-0.3.0-rc-2026-01-06"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5"
|
||||
dependencies = [
|
||||
"wit-bindgen 0.51.0",
|
||||
"wit-bindgen",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen"
|
||||
version = "0.2.122"
|
||||
version = "0.2.126"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3ed04576f974d2b2fba0f38c51dbc5518011e38c36bf1143164be765528fd409"
|
||||
checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"once_cell",
|
||||
@@ -1404,9 +1361,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen-macro"
|
||||
version = "0.2.122"
|
||||
version = "0.2.126"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "916151b09da36bd82f6615cbf3a419e2f0ba23a03c6160e8e92eb6bd4aa1dec6"
|
||||
checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1"
|
||||
dependencies = [
|
||||
"quote",
|
||||
"wasm-bindgen-macro-support",
|
||||
@@ -1414,9 +1371,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen-macro-support"
|
||||
version = "0.2.122"
|
||||
version = "0.2.126"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "299047362ccbfce148b67ab7e73349f77748e00c8296f9542adfad2ad82c5c5e"
|
||||
checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e"
|
||||
dependencies = [
|
||||
"bumpalo",
|
||||
"proc-macro2",
|
||||
@@ -1427,47 +1384,13 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen-shared"
|
||||
version = "0.2.122"
|
||||
version = "0.2.126"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9a929b2c61f11ba3e9bc35b50c1f25cb38e0e892c0c231ae2b8cf78d5dad4437"
|
||||
checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24"
|
||||
dependencies = [
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasm-encoder"
|
||||
version = "0.244.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319"
|
||||
dependencies = [
|
||||
"leb128fmt",
|
||||
"wasmparser",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasm-metadata"
|
||||
version = "0.244.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"indexmap",
|
||||
"wasm-encoder",
|
||||
"wasmparser",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasmparser"
|
||||
version = "0.244.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
"hashbrown 0.15.5",
|
||||
"indexmap",
|
||||
"semver",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "windows-core"
|
||||
version = "0.62.2"
|
||||
@@ -1527,100 +1450,12 @@ dependencies = [
|
||||
"windows-link",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wit-bindgen"
|
||||
version = "0.51.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5"
|
||||
dependencies = [
|
||||
"wit-bindgen-rust-macro",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wit-bindgen"
|
||||
version = "0.57.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e"
|
||||
|
||||
[[package]]
|
||||
name = "wit-bindgen-core"
|
||||
version = "0.51.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"heck",
|
||||
"wit-parser",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wit-bindgen-rust"
|
||||
version = "0.51.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"heck",
|
||||
"indexmap",
|
||||
"prettyplease",
|
||||
"syn",
|
||||
"wasm-metadata",
|
||||
"wit-bindgen-core",
|
||||
"wit-component",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wit-bindgen-rust-macro"
|
||||
version = "0.51.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"prettyplease",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
"wit-bindgen-core",
|
||||
"wit-bindgen-rust",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wit-component"
|
||||
version = "0.244.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"bitflags",
|
||||
"indexmap",
|
||||
"log",
|
||||
"serde",
|
||||
"serde_derive",
|
||||
"serde_json",
|
||||
"wasm-encoder",
|
||||
"wasm-metadata",
|
||||
"wasmparser",
|
||||
"wit-parser",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wit-parser"
|
||||
version = "0.244.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"id-arena",
|
||||
"indexmap",
|
||||
"log",
|
||||
"semver",
|
||||
"serde",
|
||||
"serde_derive",
|
||||
"serde_json",
|
||||
"unicode-xid",
|
||||
"wasmparser",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "writeable"
|
||||
version = "0.6.3"
|
||||
@@ -1629,9 +1464,9 @@ checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4"
|
||||
|
||||
[[package]]
|
||||
name = "yoke"
|
||||
version = "0.8.2"
|
||||
version = "0.8.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca"
|
||||
checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5"
|
||||
dependencies = [
|
||||
"stable_deref_trait",
|
||||
"yoke-derive",
|
||||
@@ -1652,18 +1487,18 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "zerocopy"
|
||||
version = "0.8.49"
|
||||
version = "0.8.54"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bce33a6288fa3f072a8c2c7d0f2fdbb90e28298f0135c1f99b96c3db2efcc60b"
|
||||
checksum = "b7cbbc0a705a0fd05cc3676525980d2bf5a9bc4adac6d6475209a7887cf59d19"
|
||||
dependencies = [
|
||||
"zerocopy-derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "zerocopy-derive"
|
||||
version = "0.8.49"
|
||||
version = "0.8.54"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8fd425244944f4ab65ccff928e7323354c5a018c75838362fdce749dfad2ee1e"
|
||||
checksum = "e2e817b7b52d0c7358d3246da9d69935ebb18116b2b102b4230dac079b4862f5"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
@@ -1726,6 +1561,6 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "zmij"
|
||||
version = "1.0.21"
|
||||
version = "1.0.23"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa"
|
||||
checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b"
|
||||
|
||||
@@ -11,6 +11,6 @@ gem "minitest", "~> 6.0"
|
||||
gem "rake", "~> 13.4"
|
||||
gem "rake-compiler", "~> 1.3"
|
||||
gem "rake-compiler-dock", "~> 1.12"
|
||||
gem "rubocop", "~> 1.86", require: false
|
||||
gem "rubocop", "~> 1.88", require: false
|
||||
gem "rubocop-minitest", "~> 0.39.1", require: false
|
||||
gem "rubocop-rake", "~> 0.7.1", require: false
|
||||
|
||||
@@ -9,10 +9,10 @@ GEM
|
||||
specs:
|
||||
ast (2.4.3)
|
||||
drb (2.2.3)
|
||||
json (2.19.4)
|
||||
json (2.20.0)
|
||||
language_server-protocol (3.17.0.5)
|
||||
lint_roller (1.1.0)
|
||||
minitest (6.0.5)
|
||||
minitest (6.0.6)
|
||||
drb (~> 2.0)
|
||||
prism (~> 1.5)
|
||||
parallel (2.1.0)
|
||||
@@ -26,10 +26,10 @@ GEM
|
||||
rake-compiler (1.3.1)
|
||||
rake
|
||||
rake-compiler-dock (1.12.0)
|
||||
rb_sys (0.9.127)
|
||||
rb_sys (0.9.128)
|
||||
rake-compiler-dock (= 1.12.0)
|
||||
regexp_parser (2.12.0)
|
||||
rubocop (1.86.1)
|
||||
rubocop (1.88.0)
|
||||
json (~> 2.3)
|
||||
language_server-protocol (~> 3.17.0.2)
|
||||
lint_roller (~> 1.1.0)
|
||||
@@ -65,7 +65,7 @@ DEPENDENCIES
|
||||
rake-compiler (~> 1.3)
|
||||
rake-compiler-dock (~> 1.12)
|
||||
regorusrb!
|
||||
rubocop (~> 1.86)
|
||||
rubocop (~> 1.88)
|
||||
rubocop-minitest (~> 0.39.1)
|
||||
rubocop-rake (~> 0.7.1)
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "regorusrb"
|
||||
version = "0.10.1"
|
||||
version = "0.11.0"
|
||||
edition = "2024"
|
||||
description = "Ruby bindings for Regorus - a fast, lightweight Rego interpreter written in Rust"
|
||||
license = "MIT AND Apache-2.0 AND BSD-3-Clause"
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module Regorus
|
||||
VERSION = "0.10.1"
|
||||
VERSION = "0.11.0"
|
||||
end
|
||||
|
||||
405
bindings/wasm/Cargo.lock
generated
405
bindings/wasm/Cargo.lock
generated
@@ -42,9 +42,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "anyhow"
|
||||
version = "1.0.102"
|
||||
version = "1.0.103"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c"
|
||||
checksum = "2a4385e2e34eb35d6b3efe798b9eb88096925d87726c0798709bf56d9ed84af3"
|
||||
|
||||
[[package]]
|
||||
name = "async-trait"
|
||||
@@ -80,9 +80,9 @@ checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7"
|
||||
|
||||
[[package]]
|
||||
name = "bitflags"
|
||||
version = "2.11.1"
|
||||
version = "2.13.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3"
|
||||
checksum = "b588b76d00fde79687d7646a9b5bdf3cc0f655e0bbd080335a95d7e96f3587da"
|
||||
|
||||
[[package]]
|
||||
name = "borrow-or-share"
|
||||
@@ -92,12 +92,12 @@ checksum = "dc0b364ead1874514c8c2855ab558056ebfeb775653e7ae45ff72f28f8f3166c"
|
||||
|
||||
[[package]]
|
||||
name = "bstr"
|
||||
version = "1.12.1"
|
||||
version = "1.13.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "63044e1ae8e69f3b5a92c736ca6269b8d12fa7efe39bf34ddb06d102cf0e2cab"
|
||||
checksum = "1f7dc094d718f2e1c1559ad110e27eeaae14a5465d3d56dd6dbd793079fbd530"
|
||||
dependencies = [
|
||||
"memchr",
|
||||
"serde",
|
||||
"serde_core",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -120,9 +120,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5"
|
||||
|
||||
[[package]]
|
||||
name = "cc"
|
||||
version = "1.2.62"
|
||||
version = "1.2.67"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a1dce859f0832a7d088c4f1119888ab94ef4b5d6795d1ce05afb7fe159d79f98"
|
||||
checksum = "e17dd265a7d0f31ef544e1b20e03add05d3b45b491b633b10d67145d2acc1a38"
|
||||
dependencies = [
|
||||
"find-msvc-tools",
|
||||
"shlex",
|
||||
@@ -136,9 +136,9 @@ checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
|
||||
|
||||
[[package]]
|
||||
name = "chacha20"
|
||||
version = "0.10.0"
|
||||
version = "0.10.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6f8d983286843e49675a4b7a2d174efe136dc93a18d69130dd18198a6c167601"
|
||||
checksum = "d524456ba66e72eb8b115ff89e01e497f8e6d11d78b70b1aa13c0fbd97540a81"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"cpufeatures",
|
||||
@@ -147,9 +147,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "chrono"
|
||||
version = "0.4.44"
|
||||
version = "0.4.45"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0"
|
||||
checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327"
|
||||
dependencies = [
|
||||
"iana-time-zone",
|
||||
"js-sys",
|
||||
@@ -264,12 +264,6 @@ dependencies = [
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "foldhash"
|
||||
version = "0.1.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2"
|
||||
|
||||
[[package]]
|
||||
name = "foldhash"
|
||||
version = "0.2.0"
|
||||
@@ -348,25 +342,23 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "getrandom"
|
||||
version = "0.4.2"
|
||||
version = "0.4.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555"
|
||||
checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"js-sys",
|
||||
"libc",
|
||||
"r-efi 6.0.0",
|
||||
"rand_core",
|
||||
"wasip2",
|
||||
"wasip3",
|
||||
"wasm-bindgen",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "globset"
|
||||
version = "0.4.18"
|
||||
version = "0.4.19"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "52dfc19153a48bde0cbd630453615c8151bce3a5adfac7a0aebfbf0a1e1f57e3"
|
||||
checksum = "e47d37d2ae4464254884b60ab7071be2b876a9c35b696bd018ddcc76847309cd"
|
||||
dependencies = [
|
||||
"aho-corasick",
|
||||
"bstr",
|
||||
@@ -374,37 +366,16 @@ dependencies = [
|
||||
"regex-syntax",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "hashbrown"
|
||||
version = "0.15.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1"
|
||||
dependencies = [
|
||||
"foldhash 0.1.5",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "hashbrown"
|
||||
version = "0.16.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100"
|
||||
dependencies = [
|
||||
"allocator-api2",
|
||||
"equivalent",
|
||||
"foldhash 0.2.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "hashbrown"
|
||||
version = "0.17.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a"
|
||||
|
||||
[[package]]
|
||||
name = "heck"
|
||||
version = "0.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
|
||||
dependencies = [
|
||||
"allocator-api2",
|
||||
"equivalent",
|
||||
"foldhash",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "iana-time-zone"
|
||||
@@ -512,12 +483,6 @@ dependencies = [
|
||||
"zerovec",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "id-arena"
|
||||
version = "2.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954"
|
||||
|
||||
[[package]]
|
||||
name = "idna"
|
||||
version = "1.1.0"
|
||||
@@ -546,7 +511,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9"
|
||||
dependencies = [
|
||||
"equivalent",
|
||||
"hashbrown 0.17.1",
|
||||
"hashbrown",
|
||||
"serde",
|
||||
"serde_core",
|
||||
]
|
||||
@@ -565,21 +530,20 @@ checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682"
|
||||
|
||||
[[package]]
|
||||
name = "js-sys"
|
||||
version = "0.3.99"
|
||||
version = "0.3.103"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "142bc4740e452c1e57ade0cbc129f139c9093e354346f0872ef985f4f5cf5f11"
|
||||
checksum = "53b44bfcdb3f8d5837a46dae1ca9660a837176eee74a28b229bc626816589102"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"futures-util",
|
||||
"once_cell",
|
||||
"wasm-bindgen",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "jsonschema"
|
||||
version = "0.46.5"
|
||||
version = "0.47.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6a5fe5206f06e589caf25e79fc05ccdf91fca745685fe9fe1a13bbdfb479a631"
|
||||
checksum = "281c43ff06dcb331e9356d30e38853d559ce3d0a3f693e0b0e102667dec14fb1"
|
||||
dependencies = [
|
||||
"ahash",
|
||||
"bytecount",
|
||||
@@ -590,30 +554,33 @@ dependencies = [
|
||||
"getrandom 0.3.4",
|
||||
"idna",
|
||||
"itoa",
|
||||
"jsonschema-regex",
|
||||
"num-cmp",
|
||||
"num-traits",
|
||||
"percent-encoding",
|
||||
"referencing",
|
||||
"regex",
|
||||
"regex-syntax",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"unicode-general-category",
|
||||
"uuid-simd",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "jsonschema-regex"
|
||||
version = "0.47.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ee0b351864e7ffbc5db9273daf7fa1b4d5177b0946713d667ca571b83c0b4045"
|
||||
dependencies = [
|
||||
"regex-syntax",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "lazy_static"
|
||||
version = "1.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
|
||||
|
||||
[[package]]
|
||||
name = "leb128fmt"
|
||||
version = "0.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2"
|
||||
|
||||
[[package]]
|
||||
name = "libc"
|
||||
version = "0.2.186"
|
||||
@@ -643,21 +610,21 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "log"
|
||||
version = "0.4.30"
|
||||
version = "0.4.33"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "616ec5685824bcc94416c6d4a7a446eea774a31efd7062c8480ba6fd06d7a6e5"
|
||||
checksum = "0ceec5bc11778974d1bcb055b18002eba7f4b3518b6a0081b3af5f21666da9ad"
|
||||
|
||||
[[package]]
|
||||
name = "lru"
|
||||
version = "0.18.0"
|
||||
version = "0.18.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8a860605968fce16869fd239cf4237a82f3ac470723415db603b0e8b6c8d4fb9"
|
||||
checksum = "0b6180140927ee907000b0aa540091f6ea512ead4447c92b8fc35bc72788a5a6"
|
||||
|
||||
[[package]]
|
||||
name = "memchr"
|
||||
version = "2.8.1"
|
||||
version = "2.8.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6b947ae49db0d222b1dbc6b113ce7248a3fc3a6ca21b696717bfc000ba4484d8"
|
||||
checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98"
|
||||
|
||||
[[package]]
|
||||
name = "micromap"
|
||||
@@ -699,7 +666,7 @@ version = "0.4.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23"
|
||||
dependencies = [
|
||||
"num-bigint",
|
||||
"num-bigint 0.4.8",
|
||||
"num-complex",
|
||||
"num-integer",
|
||||
"num-iter",
|
||||
@@ -709,9 +676,19 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "num-bigint"
|
||||
version = "0.4.6"
|
||||
version = "0.4.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9"
|
||||
checksum = "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367"
|
||||
dependencies = [
|
||||
"num-integer",
|
||||
"num-traits",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "num-bigint"
|
||||
version = "0.5.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "93e7820bc0a80a0238e650327316f929ba18d5be054b647490a3a6a339f3e7c0"
|
||||
dependencies = [
|
||||
"num-integer",
|
||||
"num-traits",
|
||||
@@ -743,11 +720,10 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "num-iter"
|
||||
version = "0.1.45"
|
||||
version = "0.1.46"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf"
|
||||
checksum = "c92800bd69a1eac91786bcfe9da64a897eb72911b8dc3095decbd07429e8048b"
|
||||
dependencies = [
|
||||
"autocfg",
|
||||
"num-integer",
|
||||
"num-traits",
|
||||
]
|
||||
@@ -758,7 +734,7 @@ version = "0.4.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824"
|
||||
dependencies = [
|
||||
"num-bigint",
|
||||
"num-bigint 0.4.8",
|
||||
"num-integer",
|
||||
"num-traits",
|
||||
]
|
||||
@@ -865,16 +841,6 @@ dependencies = [
|
||||
"zerovec",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "prettyplease"
|
||||
version = "0.2.37"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro2"
|
||||
version = "1.0.106"
|
||||
@@ -886,9 +852,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "quote"
|
||||
version = "1.0.45"
|
||||
version = "1.0.46"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924"
|
||||
checksum = "dfbc457d0c7a0759a614551b11a6409e5951f6c7537be1f1b7682b9ae9230368"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
]
|
||||
@@ -907,12 +873,12 @@ checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf"
|
||||
|
||||
[[package]]
|
||||
name = "rand"
|
||||
version = "0.10.1"
|
||||
version = "0.10.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d2e8e8bcc7961af1fdac401278c6a831614941f6164ee3bf4ce61b7edb162207"
|
||||
checksum = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80"
|
||||
dependencies = [
|
||||
"chacha20",
|
||||
"getrandom 0.4.2",
|
||||
"getrandom 0.4.3",
|
||||
"rand_core",
|
||||
]
|
||||
|
||||
@@ -953,14 +919,14 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "referencing"
|
||||
version = "0.46.5"
|
||||
version = "0.47.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "69e4e17ef386c5383591d07623d3de49cbc601156e7582973e6db98d66a57de2"
|
||||
checksum = "348e860aeb0b7bd035778fd11dd9cd5290d32e4aed3b8f2274a00287a9fd362b"
|
||||
dependencies = [
|
||||
"ahash",
|
||||
"fluent-uri",
|
||||
"getrandom 0.3.4",
|
||||
"hashbrown 0.16.1",
|
||||
"hashbrown",
|
||||
"itoa",
|
||||
"micromap",
|
||||
"parking_lot",
|
||||
@@ -970,9 +936,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "regex"
|
||||
version = "1.12.3"
|
||||
version = "1.13.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276"
|
||||
checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d"
|
||||
dependencies = [
|
||||
"aho-corasick",
|
||||
"memchr",
|
||||
@@ -982,9 +948,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "regex-automata"
|
||||
version = "0.4.14"
|
||||
version = "0.4.16"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f"
|
||||
checksum = "8fcfdb36bda0c880c5931cdc7a2bcdc8ba4556847b9d912bca70bc94708711ad"
|
||||
dependencies = [
|
||||
"aho-corasick",
|
||||
"memchr",
|
||||
@@ -993,13 +959,13 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "regex-syntax"
|
||||
version = "0.8.10"
|
||||
version = "0.8.11"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a"
|
||||
checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4"
|
||||
|
||||
[[package]]
|
||||
name = "regorus"
|
||||
version = "0.10.1"
|
||||
version = "0.11.0"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"chrono",
|
||||
@@ -1012,7 +978,7 @@ dependencies = [
|
||||
"lazy_static",
|
||||
"lru",
|
||||
"msvc_spectre_libs",
|
||||
"num-bigint",
|
||||
"num-bigint 0.5.1",
|
||||
"num-traits",
|
||||
"parking_lot",
|
||||
"postcard",
|
||||
@@ -1030,11 +996,11 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "regorusjs"
|
||||
version = "0.10.1"
|
||||
version = "0.11.0"
|
||||
dependencies = [
|
||||
"getrandom 0.2.17",
|
||||
"getrandom 0.3.4",
|
||||
"getrandom 0.4.2",
|
||||
"getrandom 0.4.3",
|
||||
"regorus",
|
||||
"serde",
|
||||
"serde-wasm-bindgen",
|
||||
@@ -1046,9 +1012,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "rustversion"
|
||||
version = "1.0.22"
|
||||
version = "1.0.23"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
|
||||
checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f"
|
||||
|
||||
[[package]]
|
||||
name = "ryu"
|
||||
@@ -1146,9 +1112,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "shlex"
|
||||
version = "1.3.0"
|
||||
version = "2.0.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
|
||||
checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba"
|
||||
|
||||
[[package]]
|
||||
name = "siphasher"
|
||||
@@ -1164,15 +1130,15 @@ checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5"
|
||||
|
||||
[[package]]
|
||||
name = "smallvec"
|
||||
version = "1.15.1"
|
||||
version = "1.15.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
|
||||
checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90"
|
||||
|
||||
[[package]]
|
||||
name = "spin"
|
||||
version = "0.12.0"
|
||||
version = "0.12.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1527984ca054dfca79333baec451042863f485fbee01b7bf6d911de915cac865"
|
||||
checksum = "8abadc99fd9c7bbb7d0ca2b31d72a067d0c0dcd7aad25ab8cac71ba91417694b"
|
||||
|
||||
[[package]]
|
||||
name = "stable_deref_trait"
|
||||
@@ -1182,9 +1148,9 @@ checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596"
|
||||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "2.0.117"
|
||||
version = "2.0.119"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99"
|
||||
checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
@@ -1244,12 +1210,6 @@ version = "1.0.24"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75"
|
||||
|
||||
[[package]]
|
||||
name = "unicode-xid"
|
||||
version = "0.2.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853"
|
||||
|
||||
[[package]]
|
||||
name = "unsafe-libyaml"
|
||||
version = "0.2.11"
|
||||
@@ -1276,11 +1236,11 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
|
||||
|
||||
[[package]]
|
||||
name = "uuid"
|
||||
version = "1.23.1"
|
||||
version = "1.24.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ddd74a9687298c6858e9b88ec8935ec45d22e8fd5e6394fa1bd4e99a87789c76"
|
||||
checksum = "bf3923a6f5c4c6382e0b653c4117f48d631ea17f38ed86e2a828e6f7412f5239"
|
||||
dependencies = [
|
||||
"getrandom 0.4.2",
|
||||
"getrandom 0.4.3",
|
||||
"js-sys",
|
||||
"rand",
|
||||
"wasm-bindgen",
|
||||
@@ -1326,27 +1286,18 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
|
||||
|
||||
[[package]]
|
||||
name = "wasip2"
|
||||
version = "1.0.3+wasi-0.2.9"
|
||||
version = "1.0.4+wasi-0.2.12"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6"
|
||||
checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487"
|
||||
dependencies = [
|
||||
"wit-bindgen 0.57.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasip3"
|
||||
version = "0.4.0+wasi-0.3.0-rc-2026-01-06"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5"
|
||||
dependencies = [
|
||||
"wit-bindgen 0.51.0",
|
||||
"wit-bindgen",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen"
|
||||
version = "0.2.122"
|
||||
version = "0.2.126"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3ed04576f974d2b2fba0f38c51dbc5518011e38c36bf1143164be765528fd409"
|
||||
checksum = "4b067c0c11094aef6b7a801c1e34a26affafdf3d051dba08456b868789aaf9a4"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"once_cell",
|
||||
@@ -1357,9 +1308,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen-futures"
|
||||
version = "0.4.72"
|
||||
version = "0.4.76"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9473dbd2991ae90b6291c3c32c30c6187ac49aa32f9905d1cce280ec1e110b0f"
|
||||
checksum = "c62df1340f32221cb9c54d6a27b030e3dba64361d4a95bed55f9aacb44da291d"
|
||||
dependencies = [
|
||||
"js-sys",
|
||||
"wasm-bindgen",
|
||||
@@ -1367,9 +1318,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen-macro"
|
||||
version = "0.2.122"
|
||||
version = "0.2.126"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "916151b09da36bd82f6615cbf3a419e2f0ba23a03c6160e8e92eb6bd4aa1dec6"
|
||||
checksum = "167ce5e579f6bcf889c4f7175a8a5a585de84e8ff93976ce393efa5f2837aab1"
|
||||
dependencies = [
|
||||
"quote",
|
||||
"wasm-bindgen-macro-support",
|
||||
@@ -1377,9 +1328,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen-macro-support"
|
||||
version = "0.2.122"
|
||||
version = "0.2.126"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "299047362ccbfce148b67ab7e73349f77748e00c8296f9542adfad2ad82c5c5e"
|
||||
checksum = "f3997c7839262f4ef12cf90b818d6340c18e80f263f1a94bf157d0ec4420380e"
|
||||
dependencies = [
|
||||
"bumpalo",
|
||||
"proc-macro2",
|
||||
@@ -1390,18 +1341,18 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen-shared"
|
||||
version = "0.2.122"
|
||||
version = "0.2.126"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9a929b2c61f11ba3e9bc35b50c1f25cb38e0e892c0c231ae2b8cf78d5dad4437"
|
||||
checksum = "dc1b4cb0cc549fcf58d7dfc081778139b3d283a081644e833e84682ad71cea24"
|
||||
dependencies = [
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen-test"
|
||||
version = "0.3.72"
|
||||
version = "0.3.76"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "74fde991ccdc895cb7fbaa14b137d62af74d9011be67b71c694bfc40edd3119c"
|
||||
checksum = "2a0d555ca874445df8d314f94f5c948a4e74e5418f332c89f660a3d8310a96f4"
|
||||
dependencies = [
|
||||
"async-trait",
|
||||
"cast",
|
||||
@@ -1421,9 +1372,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen-test-macro"
|
||||
version = "0.3.72"
|
||||
version = "0.3.76"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e925354648d2a4d1bf205412e36d520a800280622eef4719678d268e5d40e978"
|
||||
checksum = "94eb68555b95bcea5e8cf4abe280b529049479fa995bfc23734af96a6aedc120"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
@@ -1432,43 +1383,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "wasm-bindgen-test-shared"
|
||||
version = "0.2.122"
|
||||
version = "0.2.126"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "684365b586a9a6256c1cc3544eee8680de48d6041142f581776ec7b139622ae9"
|
||||
|
||||
[[package]]
|
||||
name = "wasm-encoder"
|
||||
version = "0.244.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319"
|
||||
dependencies = [
|
||||
"leb128fmt",
|
||||
"wasmparser",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasm-metadata"
|
||||
version = "0.244.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"indexmap",
|
||||
"wasm-encoder",
|
||||
"wasmparser",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasmparser"
|
||||
version = "0.244.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe"
|
||||
dependencies = [
|
||||
"bitflags",
|
||||
"hashbrown 0.15.5",
|
||||
"indexmap",
|
||||
"semver",
|
||||
]
|
||||
checksum = "c31d56021e873866c968588ed85ccdf56db5c426e44afdb4618c39895104b920"
|
||||
|
||||
[[package]]
|
||||
name = "winapi-util"
|
||||
@@ -1547,100 +1464,12 @@ dependencies = [
|
||||
"windows-link",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wit-bindgen"
|
||||
version = "0.51.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5"
|
||||
dependencies = [
|
||||
"wit-bindgen-rust-macro",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wit-bindgen"
|
||||
version = "0.57.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e"
|
||||
|
||||
[[package]]
|
||||
name = "wit-bindgen-core"
|
||||
version = "0.51.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ea61de684c3ea68cb082b7a88508a8b27fcc8b797d738bfc99a82facf1d752dc"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"heck",
|
||||
"wit-parser",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wit-bindgen-rust"
|
||||
version = "0.51.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"heck",
|
||||
"indexmap",
|
||||
"prettyplease",
|
||||
"syn",
|
||||
"wasm-metadata",
|
||||
"wit-bindgen-core",
|
||||
"wit-component",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wit-bindgen-rust-macro"
|
||||
version = "0.51.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0c0f9bfd77e6a48eccf51359e3ae77140a7f50b1e2ebfe62422d8afdaffab17a"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"prettyplease",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
"wit-bindgen-core",
|
||||
"wit-bindgen-rust",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wit-component"
|
||||
version = "0.244.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"bitflags",
|
||||
"indexmap",
|
||||
"log",
|
||||
"serde",
|
||||
"serde_derive",
|
||||
"serde_json",
|
||||
"wasm-encoder",
|
||||
"wasm-metadata",
|
||||
"wasmparser",
|
||||
"wit-parser",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wit-parser"
|
||||
version = "0.244.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"id-arena",
|
||||
"indexmap",
|
||||
"log",
|
||||
"semver",
|
||||
"serde",
|
||||
"serde_derive",
|
||||
"serde_json",
|
||||
"unicode-xid",
|
||||
"wasmparser",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "writeable"
|
||||
version = "0.6.3"
|
||||
@@ -1649,9 +1478,9 @@ checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4"
|
||||
|
||||
[[package]]
|
||||
name = "yoke"
|
||||
version = "0.8.2"
|
||||
version = "0.8.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca"
|
||||
checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5"
|
||||
dependencies = [
|
||||
"stable_deref_trait",
|
||||
"yoke-derive",
|
||||
@@ -1672,18 +1501,18 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "zerocopy"
|
||||
version = "0.8.49"
|
||||
version = "0.8.54"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bce33a6288fa3f072a8c2c7d0f2fdbb90e28298f0135c1f99b96c3db2efcc60b"
|
||||
checksum = "b7cbbc0a705a0fd05cc3676525980d2bf5a9bc4adac6d6475209a7887cf59d19"
|
||||
dependencies = [
|
||||
"zerocopy-derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "zerocopy-derive"
|
||||
version = "0.8.49"
|
||||
version = "0.8.54"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8fd425244944f4ab65ccff928e7323354c5a018c75838362fdce749dfad2ee1e"
|
||||
checksum = "e2e817b7b52d0c7358d3246da9d69935ebb18116b2b102b4230dac079b4862f5"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
@@ -1746,6 +1575,6 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "zmij"
|
||||
version = "1.0.21"
|
||||
version = "1.0.23"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa"
|
||||
checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b"
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
[package]
|
||||
name = "regorusjs"
|
||||
version = "0.10.1"
|
||||
version = "0.11.0"
|
||||
edition = "2021"
|
||||
repository = "https://github.com/microsoft/regorus/bindings/wasm"
|
||||
description = "WASM bindings for Regorus - a fast, lightweight Rego interpreter written in Rust"
|
||||
|
||||
@@ -254,7 +254,13 @@ include formatted state snapshots where possible.
|
||||
7. **Host await**: In run-to-completion mode, `HostAwait` consumes a response
|
||||
from `host_await_responses`. Suspendable mode yields control with a
|
||||
`SuspendReason::HostAwait { dest, argument, identifier }` that the host must
|
||||
service.
|
||||
service. The compiler supports two ways to emit `HostAwait`:
|
||||
- **Explicit**: `__builtin_host_await(payload, identifier)` — raw 2-argument
|
||||
form.
|
||||
- **Registered**: `compile_from_policy_with_host_await` accepts a list of
|
||||
`(name, arg_count)` pairs. Calls to registered names are compiled as
|
||||
`HostAwait` with the function name as the identifier literal. Registered
|
||||
names take precedence over user-defined functions and standard builtins.
|
||||
8. **Completion**: `Return` wraps the selected register value into
|
||||
`InstructionOutcome::Return`, unwinding frames until the entry frame is
|
||||
cleared. `RuleReturn` is a specialised variant used by rule execution
|
||||
|
||||
@@ -177,6 +177,75 @@ Parameter tables:
|
||||
- Suspendable: emits `InstructionOutcome::Suspend` with `SuspendReason::HostAwait`.
|
||||
The host must resume with a value that will be written into `dest`.
|
||||
|
||||
### Registered host-await builtins
|
||||
|
||||
The compiler can be configured with a list of function names that map directly
|
||||
to `HostAwait` instructions. This allows policy authors to write natural
|
||||
function calls (e.g. `lookup(input.account_id)`) instead of the raw
|
||||
`__builtin_host_await(payload, identifier)` builtin.
|
||||
|
||||
Registration is done at compile time via `Compiler::compile_from_policy_with_host_await`:
|
||||
|
||||
```rust
|
||||
let builtins = [("lookup", 1), ("persist", 1)];
|
||||
let program = Compiler::compile_from_policy_with_host_await(
|
||||
&compiled_policy, &entry_points, &builtins,
|
||||
)?;
|
||||
```
|
||||
|
||||
Each registered name is a `(name, arg_count)` pair. When the compiler
|
||||
encounters a call to a registered name, it emits a `HostAwait` instruction
|
||||
with:
|
||||
- `arg` = the first argument register
|
||||
- `id` = a register loaded with a string literal containing the function name
|
||||
|
||||
Both the explicit `__builtin_host_await(arg, id)` call and a registered
|
||||
builtin call produce the **same `HostAwait` bytecode instruction**. The only
|
||||
difference is how the `id` register is populated: explicit calls take it from
|
||||
the second user-supplied argument, while registered calls auto-generate a
|
||||
`Load` instruction for the function name string. The VM cannot distinguish
|
||||
between the two at runtime.
|
||||
|
||||
**Resolution order** in `determine_call_target()`:
|
||||
1. `__builtin_host_await` (magic 2-argument form)
|
||||
2. Registered host-await builtins (matched by **bare** function name only)
|
||||
3. User-defined functions (matched by package-qualified path)
|
||||
4. Standard builtins (matched by bare function name)
|
||||
|
||||
Registered names shadow both user-defined functions and standard builtins.
|
||||
This means `time.parse_duration_ns` can be overridden to route through the
|
||||
host instead of the built-in Rust implementation.
|
||||
|
||||
**Only unqualified calls are intercepted.** Registration matches a call by
|
||||
the name *as written in the policy*. A bare call — `lookup(x)` — is
|
||||
intercepted and compiled to a `HostAwait`. A package-qualified call —
|
||||
`data.pkg.lookup(x)` — is **not** intercepted; it is resolved normally, as
|
||||
if the name were never registered.
|
||||
|
||||
```rego
|
||||
# "lookup" is registered as a host-await builtin.
|
||||
|
||||
package other
|
||||
import rego.v1
|
||||
lookup(k) := k # an ordinary rule that happens to share the name
|
||||
|
||||
package demo
|
||||
import rego.v1
|
||||
a := lookup(input.k) # intercepted -> HostAwait
|
||||
b := data.other.lookup(input.k) # NOT intercepted -> calls other.lookup
|
||||
```
|
||||
|
||||
The qualified form is resolved exactly as it would be without registration:
|
||||
if a rule exists at that path it is called, otherwise compilation fails with
|
||||
`Unknown function`. (A standard builtin like `count` has no qualified form at
|
||||
all, so `data.pkg.count(x)` is always an `Unknown function` error, registered
|
||||
or not.)
|
||||
|
||||
**Argument handling**: The `HostAwait` instruction carries a single `arg`
|
||||
register. Registered builtins must use `arg_count: 1`; the compiler rejects
|
||||
`arg_count > 1` at registration time. To pass multiple values, use object
|
||||
packing: `lookup({"user": x, "resource": y})`.
|
||||
|
||||
---
|
||||
|
||||
## Halt instruction
|
||||
|
||||
79
docs/value/set.md
Normal file
79
docs/value/set.md
Normal file
@@ -0,0 +1,79 @@
|
||||
# Set
|
||||
|
||||
Opaque container for `Value::Set`'s element storage, enabling alternative
|
||||
backends without call-site changes. Pairs with [`Object`](object.md) under
|
||||
a shared design philosophy.
|
||||
|
||||
## Design
|
||||
|
||||
`Set` wraps a `BTreeSet<Value>` today but exposes only a curated method
|
||||
surface (`contains`, `insert`, `remove`, `iter`, `iter_sorted`, `cursor`,
|
||||
`is_subset`, `intersection`, `union`, `difference`, serde). The inner set is
|
||||
private — callers cannot pattern-match it or hand out references to the
|
||||
backing store, so the backend can change without churn at the ~400 call
|
||||
sites that name `Set`.
|
||||
|
||||
Two iteration methods reflect a real distinction: `iter()` makes no
|
||||
ordering promise (lets future hash/lazy backends skip sorting work);
|
||||
`iter_sorted()` guarantees deterministic order (used by serialization and
|
||||
`Ord`). Cursor types support incremental traversal needed by the RVM
|
||||
iteration state without exposing iterator internals.
|
||||
|
||||
`Ord` is hand-written against `iter_sorted` rather than derived, so two
|
||||
backends that store elements differently still compare equal when their
|
||||
sorted contents match.
|
||||
|
||||
## Scenarios enabled
|
||||
|
||||
- **Hash-backed storage** — `FxHashSet`-backed inner turns O(log n)
|
||||
membership checks into O(1); swap in for policies where elements aren't
|
||||
compared ordinally.
|
||||
- **Lazy/streaming** — wrap a `LazySetProvider` (DB query, CBOR slice,
|
||||
REST endpoint) and materialize elements on demand.
|
||||
- **Arena allocation** — bumpalo-backed inner for eval-time temporaries;
|
||||
drop the whole arena at query end with zero per-element free cost.
|
||||
- **FFI-backed** — host-language collections (Python set, JS Set) without
|
||||
copying into Rust.
|
||||
- **Bloom-filter pre-check** — front a large backing set with a Bloom
|
||||
filter for fast negative-membership tests on read-mostly allowlists.
|
||||
|
||||
## Known use cases
|
||||
|
||||
- **Azure Policy allowed-values lists** — large allowlists (allowed
|
||||
regions, allowed SKUs, allowed image publishers) compared against
|
||||
single resource values. Hash-backed Set turns O(log n) membership
|
||||
checks into O(1).
|
||||
- **SARIF rule deduplication** — collapsing duplicate rule references
|
||||
across thousands of result records. Set-of-objects with structural
|
||||
hashing avoids the BTreeSet sort cost on every insert.
|
||||
- **RBAC role membership** — checking whether a principal belongs to any
|
||||
of dozens of role groups. Hash-backed Set scales to thousands of
|
||||
members with constant-time membership.
|
||||
- **Azure Policy denied-resource-type sets** — exclusion lists used by
|
||||
deny-effect policies; same hash-backed pattern as allowed-values.
|
||||
|
||||
## Precedents
|
||||
|
||||
- **`indexmap::IndexSet`** — opaque newtype that pairs hash lookup with
|
||||
insertion-order iteration; precedent for "Set with alternative
|
||||
ordering semantics behind a stable surface."
|
||||
- **`hashbrown::HashSet`** — backs Rust's `std::collections::HashSet`
|
||||
and demonstrates a fully swappable backend behind a stable API.
|
||||
- **`roaring::RoaringBitmap`** — bitmap-backed integer set. Not
|
||||
applicable to `Value` keys directly, but a precedent for the broader
|
||||
idea of "Set with alternative storage representations chosen by
|
||||
workload shape."
|
||||
- **`serde_json`** — note that `serde_json` has no Set equivalent: its
|
||||
Value enum collapses sets into arrays. Regorus's first-class Set with
|
||||
storage abstraction is therefore unusually well-positioned among JSON
|
||||
value libraries.
|
||||
|
||||
## Notes
|
||||
|
||||
Cursor types are `pub` (referenced by public `IterationState`) but not
|
||||
re-exported at the crate root. The crate-internal `Set`/`Map`/`MapEntry`
|
||||
aliases for `BTreeSet`/`BTreeMap` in `lib.rs` were renamed to
|
||||
`MapSet`/`Map`/`MapEntry` when this type landed, to free the `Set` name
|
||||
for the new public type. Future Array and String abstractions follow the
|
||||
same shape — see `docs/value/array.md` and `docs/value/string.md` when
|
||||
they land.
|
||||
@@ -217,7 +217,7 @@ pub(crate) struct CompiledPolicyData {
|
||||
pub(crate) default_rules: Map<String, Vec<DefaultRuleInfo>>,
|
||||
pub(crate) imports: BTreeMap<String, Ref<Expr>>,
|
||||
pub(crate) functions: FunctionTable,
|
||||
pub(crate) rule_paths: Set<String>,
|
||||
pub(crate) rule_paths: MapSet<String>,
|
||||
#[cfg(feature = "azure_policy")]
|
||||
pub(crate) target_info: Option<TargetInfo>,
|
||||
#[cfg(feature = "azure_policy")]
|
||||
|
||||
@@ -434,7 +434,13 @@ impl Engine {
|
||||
|
||||
/// Add data document.
|
||||
///
|
||||
/// The specified data document is merged into existing data document.
|
||||
/// The specified data document is deep-merged into the existing data document. Nested
|
||||
/// objects are merged recursively (matching OPA's data-document merge), so adding
|
||||
/// `{ "a": { "x": 1 } }` and then `{ "a": { "y": 2 } }` yields `{ "a": { "x": 1, "y": 2 } }`.
|
||||
/// A conflict — the same path holding two different values — is an error.
|
||||
///
|
||||
/// The merge is atomic: if any conflict is detected (including one deep in a nested
|
||||
/// document), the call fails and the existing data document is left unchanged.
|
||||
///
|
||||
/// ```
|
||||
/// # use regorus::*;
|
||||
@@ -453,9 +459,13 @@ impl Engine {
|
||||
/// // Merge { "z" : 3 }. Conflict error.
|
||||
/// assert!(engine.add_data(Value::from_json_str(r#"{ "z" : 3 }"#)?).is_err());
|
||||
///
|
||||
/// // Nested objects are deep-merged. Merge { "y" : { "a" : 10 } } then { "y" : { "b" : 20 } }.
|
||||
/// assert!(engine.add_data(Value::from_json_str(r#"{ "y" : { "a" : 10 } }"#)?).is_ok());
|
||||
/// assert!(engine.add_data(Value::from_json_str(r#"{ "y" : { "b" : 20 } }"#)?).is_ok());
|
||||
///
|
||||
/// assert_eq!(
|
||||
/// engine.eval_query("data".to_string(), false)?.result[0].expressions[0].value,
|
||||
/// Value::from_json_str(r#"{ "x": 1, "y": {}, "z": 2}"#)?
|
||||
/// Value::from_json_str(r#"{ "x": 1, "y": { "a": 10, "b": 20 }, "z": 2}"#)?
|
||||
/// );
|
||||
/// # Ok(())
|
||||
/// # }
|
||||
@@ -464,8 +474,29 @@ impl Engine {
|
||||
if data.as_object().is_err() {
|
||||
bail!("data must be object");
|
||||
}
|
||||
self.prepared = false;
|
||||
self.interpreter.get_init_data_mut().merge(data)
|
||||
|
||||
// add_data is all-or-nothing; the atomic strategy differs by build because the failure
|
||||
// modes do: a conflict (same path, differing values) is possible everywhere, an
|
||||
// allocator-limit failure mid-merge only under `allocator-memory-limits`.
|
||||
#[cfg(not(feature = "allocator-memory-limits"))]
|
||||
{
|
||||
// Conflict is the only failure mode; `check_mergeable` catches it up front without
|
||||
// allocating, so validate then deep-merge in place (zero-copy fast path).
|
||||
self.interpreter.get_init_data().check_mergeable(&data)?;
|
||||
self.prepared = false;
|
||||
self.interpreter.get_init_data_mut().deep_merge(data)
|
||||
}
|
||||
#[cfg(feature = "allocator-memory-limits")]
|
||||
{
|
||||
// A limit failure can strike mid-merge and can't be predicted, so merge into a
|
||||
// candidate and commit only on success. `Value` is copy-on-write, so only touched
|
||||
// subtrees are cloned.
|
||||
let mut candidate = self.interpreter.get_init_data().clone();
|
||||
candidate.deep_merge(data)?;
|
||||
*self.interpreter.get_init_data_mut() = candidate;
|
||||
self.prepared = false;
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
/// Get the data document.
|
||||
|
||||
@@ -60,6 +60,17 @@ enum FunctionModifier {
|
||||
Value(Value),
|
||||
}
|
||||
|
||||
/// How [`Interpreter::update_data`] merges a rule's value into the data document.
|
||||
#[derive(Debug, Clone, Copy)]
|
||||
enum RuleValueMerge {
|
||||
/// Shallow-merge keeping disjoint keys, so rules sharing a path prefix scaffold into one
|
||||
/// object (`a.foo` + `a.bar` → one `a`) instead of conflicting.
|
||||
Combine,
|
||||
/// Complete-rule semantics: existing value must be absent or exactly equal, else conflict.
|
||||
/// Used for zero-arg function outputs (`f() := …`), which OPA treats like complete rules.
|
||||
Strict,
|
||||
}
|
||||
|
||||
type RuleValues = BTreeMap<Vec<Value>, (Value, Ref<Expr>)>;
|
||||
|
||||
#[derive(Debug)]
|
||||
@@ -3408,6 +3419,23 @@ impl Interpreter {
|
||||
}
|
||||
}
|
||||
|
||||
/// Materialize a complete-rule value: the existing value must be absent or *exactly equal*
|
||||
/// to `new`, else it is a conflict.
|
||||
///
|
||||
/// Unlike the shallow [`Self::merge_rule_value`], differing outputs conflict instead of
|
||||
/// combining — `f() := {"a": 1}` and `f() := {"b": 2}` conflict — matching OPA's semantics
|
||||
/// for zero-arg functions.
|
||||
fn merge_rule_value_strict(span: &Span, value: &mut Value, new: Value) -> Result<()> {
|
||||
if *value == Value::Undefined {
|
||||
*value = new;
|
||||
Ok(())
|
||||
} else if *value == new {
|
||||
Ok(())
|
||||
} else {
|
||||
Err(span.error("rules should not produce multiple outputs."))
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_path_string(refr: &Expr, document: Option<&str>) -> Result<String> {
|
||||
let mut comps = vec![];
|
||||
let mut expr_opt = Some(refr);
|
||||
@@ -3663,6 +3691,7 @@ impl Interpreter {
|
||||
_refr: &Expr,
|
||||
path: &[&str],
|
||||
value: Value,
|
||||
merge: RuleValueMerge,
|
||||
) -> Result<()> {
|
||||
if value == Value::Undefined {
|
||||
return Ok(());
|
||||
@@ -3670,7 +3699,10 @@ impl Interpreter {
|
||||
// Ensure that path is created.
|
||||
let vref = Self::make_or_get_value_mut(&mut self.data, path)?;
|
||||
if Self::get_value_chained(self.init_data.clone(), path) == Value::Undefined {
|
||||
Self::merge_rule_value(span, vref, value)
|
||||
match merge {
|
||||
RuleValueMerge::Strict => Self::merge_rule_value_strict(span, vref, value),
|
||||
RuleValueMerge::Combine => Self::merge_rule_value(span, vref, value),
|
||||
}
|
||||
} else {
|
||||
// Retain specified value.
|
||||
Ok(())
|
||||
@@ -3778,7 +3810,13 @@ impl Interpreter {
|
||||
// `a` is created as an empty object.
|
||||
if let Some((_, prefix)) = path.split_last() {
|
||||
if !prefix.is_empty() {
|
||||
self.update_data(span, refr, prefix, Value::new_object())?;
|
||||
self.update_data(
|
||||
span,
|
||||
refr,
|
||||
prefix,
|
||||
Value::new_object(),
|
||||
RuleValueMerge::Combine,
|
||||
)?;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3790,7 +3828,13 @@ impl Interpreter {
|
||||
};
|
||||
|
||||
let value = self.eval_rule_bodies(ctx, span, rule_body)?;
|
||||
self.update_data(refr.span(), refr, &path[..], value)?;
|
||||
self.update_data(
|
||||
refr.span(),
|
||||
refr,
|
||||
&path[..],
|
||||
value,
|
||||
RuleValueMerge::Strict,
|
||||
)?;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4037,6 +4081,7 @@ impl Interpreter {
|
||||
rule_refr,
|
||||
&prefix_path,
|
||||
Value::new_object(),
|
||||
RuleValueMerge::Combine,
|
||||
)?;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,8 +17,20 @@ use crate::lexer::Span;
|
||||
use crate::rvm::instructions::{BuiltinCallParams, FunctionCallParams};
|
||||
use crate::rvm::Instruction;
|
||||
use crate::utils::get_path_string;
|
||||
use alloc::{format, string::ToString, vec::Vec};
|
||||
use crate::value::Value;
|
||||
use alloc::{
|
||||
format,
|
||||
string::{String, ToString},
|
||||
vec::Vec,
|
||||
};
|
||||
|
||||
/// Resolved destination of a Rego function-call expression. Produced by
|
||||
/// [`Compiler::determine_call_target`] and consumed by
|
||||
/// [`Compiler::compile_function_call`] to choose which instruction to emit.
|
||||
/// Carrying the discrimination in the type (rather than re-matching on a
|
||||
/// magic name at the emit site) keeps the host-await handling honest under
|
||||
/// future refactors — the compiler will refuse to build if a new variant is
|
||||
/// added without updating every match site.
|
||||
enum CallTarget {
|
||||
User {
|
||||
rule_index: u16,
|
||||
@@ -28,9 +40,14 @@ enum CallTarget {
|
||||
builtin_index: u16,
|
||||
expected_args: Option<usize>,
|
||||
},
|
||||
HostAwait {
|
||||
expected_args: Option<usize>,
|
||||
},
|
||||
/// Explicit `__builtin_host_await(arg, id)` call form (2 user args).
|
||||
/// The identifier is supplied by the policy author at runtime via the
|
||||
/// second argument register.
|
||||
ExplicitHostAwait,
|
||||
/// A registered host-awaitable builtin invoked by its registered name
|
||||
/// (1 user arg). The identifier is the registered name itself and is
|
||||
/// baked into the bytecode as a string literal at compile time.
|
||||
RegisteredHostAwait { identifier: String },
|
||||
}
|
||||
|
||||
impl<'a> Compiler<'a> {
|
||||
@@ -59,7 +76,11 @@ impl<'a> Compiler<'a> {
|
||||
let expected_args = match &call_target {
|
||||
CallTarget::User { expected_args, .. } => *expected_args,
|
||||
CallTarget::Builtin { expected_args, .. } => *expected_args,
|
||||
CallTarget::HostAwait { expected_args } => *expected_args,
|
||||
// Both host-await variants have a known fixed arity; carrying it
|
||||
// in the variant lets the rest of the compiler depend on the type
|
||||
// rather than re-matching on the magic name `__builtin_host_await`.
|
||||
CallTarget::ExplicitHostAwait => Some(2),
|
||||
CallTarget::RegisteredHostAwait { .. } => Some(1),
|
||||
};
|
||||
|
||||
if let Some(expected) = expected_args {
|
||||
@@ -126,7 +147,8 @@ impl<'a> Compiler<'a> {
|
||||
});
|
||||
self.emit_instruction(Instruction::BuiltinCall { params_index }, &span);
|
||||
}
|
||||
CallTarget::HostAwait { .. } => {
|
||||
CallTarget::ExplicitHostAwait => {
|
||||
// Explicit __builtin_host_await(arg, id) — 2 arguments
|
||||
if arg_regs.len() != 2 {
|
||||
return Err(CompilerError::General {
|
||||
message: format!(
|
||||
@@ -136,7 +158,6 @@ impl<'a> Compiler<'a> {
|
||||
}
|
||||
.at(&span));
|
||||
}
|
||||
|
||||
self.emit_instruction(
|
||||
Instruction::HostAwait {
|
||||
dest,
|
||||
@@ -146,6 +167,37 @@ impl<'a> Compiler<'a> {
|
||||
&span,
|
||||
);
|
||||
}
|
||||
CallTarget::RegisteredHostAwait { identifier } => {
|
||||
// Registered host-awaitable builtin — the identifier is the
|
||||
// registered name and is baked into the bytecode as a literal.
|
||||
if arg_regs.len() != 1 {
|
||||
return Err(CompilerError::General {
|
||||
message: format!(
|
||||
"host-awaitable builtin '{}' expects exactly 1 argument, got {}",
|
||||
identifier,
|
||||
arg_regs.len()
|
||||
),
|
||||
}
|
||||
.at(&span));
|
||||
}
|
||||
let id_reg = self.alloc_register();
|
||||
let literal_idx = self.add_literal(Value::String(identifier.into()));
|
||||
self.emit_instruction(
|
||||
Instruction::Load {
|
||||
dest: id_reg,
|
||||
literal_idx,
|
||||
},
|
||||
&span,
|
||||
);
|
||||
self.emit_instruction(
|
||||
Instruction::HostAwait {
|
||||
dest,
|
||||
arg: arg_regs[0],
|
||||
id: id_reg,
|
||||
},
|
||||
&span,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
if let Some((plan, plan_span)) = &out_param_plan {
|
||||
@@ -187,8 +239,26 @@ impl<'a> Compiler<'a> {
|
||||
span: &Span,
|
||||
) -> Result<CallTarget> {
|
||||
if original_fcn_path == "__builtin_host_await" {
|
||||
return Ok(CallTarget::HostAwait {
|
||||
expected_args: Some(2),
|
||||
return Ok(CallTarget::ExplicitHostAwait);
|
||||
}
|
||||
|
||||
// Check registered host-awaitable builtins. Registered builtins are
|
||||
// restricted to arg_count == 1 at registration time (see
|
||||
// `Compiler::register_host_await_builtin`), so the variant doesn't
|
||||
// need to carry an arity — it's fixed at 1.
|
||||
//
|
||||
// We deliberately match against `original_fcn_path` only, not
|
||||
// `full_fcn_path`. Registration intercepts the *unqualified* call
|
||||
// form (e.g. `lookup(x)` inside the policy's own package). A
|
||||
// package-qualified call like `data.other.lookup(x)` is left to
|
||||
// resolve through the normal user-defined / builtin path, so a
|
||||
// registered name does not leak into unrelated packages that
|
||||
// happen to expose a rule with the same identifier. This is
|
||||
// documented on `register_host_await_builtin`; the
|
||||
// `registered_host_await.yaml` suite pins the behavior.
|
||||
if self.host_await_builtins.contains_key(original_fcn_path) {
|
||||
return Ok(CallTarget::RegisteredHostAwait {
|
||||
identifier: original_fcn_path.to_string(),
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@ use crate::ast::{self, ExprRef, LiteralStmt, Query};
|
||||
use crate::compiler::destructuring_planner::plans::BindingPlan;
|
||||
use crate::compiler::hoist::{HoistedLoop, LoopType};
|
||||
use crate::lexer::Span;
|
||||
use crate::rvm::instructions::{LoopMode, LoopStartParams};
|
||||
use crate::rvm::instructions::{GuardMode, LoopMode, LoopStartParams};
|
||||
use crate::rvm::Instruction;
|
||||
use crate::Value;
|
||||
use alloc::format;
|
||||
@@ -197,6 +197,19 @@ impl<'a> Compiler<'a> {
|
||||
*end = loop_end;
|
||||
}
|
||||
|
||||
// The loop writes its overall pass/fail into `result_reg`
|
||||
// (`success_count == total_iterations` for `Every`). The enclosing query
|
||||
// must fail (evaluate to undefined) when the quantifier does not hold, so
|
||||
// guard on `result_reg` here. Without this the `every` result is computed
|
||||
// but discarded, leaving the surrounding rule to always succeed.
|
||||
self.emit_instruction(
|
||||
Instruction::Guard {
|
||||
register: result_reg,
|
||||
mode: GuardMode::Condition,
|
||||
},
|
||||
span,
|
||||
);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@@ -312,6 +325,25 @@ impl<'a> Compiler<'a> {
|
||||
*end = loop_end;
|
||||
}
|
||||
|
||||
// A hoisted index-iteration loop inside an `every` body acts as a
|
||||
// condition on the current iteration: if the indexed reference matches
|
||||
// nothing the iteration must fail. The `every` body emits no context
|
||||
// yield, so the loop result register is otherwise discarded (same
|
||||
// situation as `some ... in`). Guard on it so a non-matching indexed
|
||||
// reference fails the enclosing `every` iteration.
|
||||
if matches!(
|
||||
self.context_stack.last().map(|c| &c.context_type),
|
||||
Some(ContextType::Every)
|
||||
) {
|
||||
self.emit_instruction(
|
||||
Instruction::Guard {
|
||||
register: result_reg,
|
||||
mode: GuardMode::Condition,
|
||||
},
|
||||
collection.span(),
|
||||
);
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
|
||||
@@ -26,7 +26,9 @@ use crate::rvm::program::{Program, RuleType, SpanInfo};
|
||||
use crate::CompiledPolicy;
|
||||
use crate::Value;
|
||||
use alloc::collections::{BTreeMap, BTreeSet};
|
||||
use alloc::format;
|
||||
use alloc::string::String;
|
||||
use alloc::string::ToString as _;
|
||||
use alloc::vec;
|
||||
use alloc::vec::Vec;
|
||||
use indexmap::IndexMap;
|
||||
@@ -139,6 +141,10 @@ pub struct Compiler<'a> {
|
||||
current_call_stack: Vec<u16>,
|
||||
entry_points: IndexMap<String, usize>,
|
||||
soft_assert_mode: bool,
|
||||
/// Registered host-awaitable builtins: name → expected arg count.
|
||||
/// When the compiler encounters a call to one of these names, it emits a
|
||||
/// `HostAwait` instruction instead of a regular function or builtin call.
|
||||
host_await_builtins: BTreeMap<String, usize>,
|
||||
}
|
||||
|
||||
impl<'a> Compiler<'a> {
|
||||
@@ -173,9 +179,75 @@ impl<'a> Compiler<'a> {
|
||||
current_call_stack: Vec::new(),
|
||||
entry_points: IndexMap::new(),
|
||||
soft_assert_mode: false,
|
||||
host_await_builtins: BTreeMap::new(),
|
||||
}
|
||||
}
|
||||
|
||||
/// Register a function name as a host-awaitable builtin.
|
||||
///
|
||||
/// When the compiler encounters an **unqualified** call to `name(arg)`
|
||||
/// (i.e. `name(arg)` from inside the policy's own package, not
|
||||
/// `data.pkg.name(arg)` or any other package-qualified form), it will
|
||||
/// emit a `HostAwait` instruction with the argument and `name` as the
|
||||
/// identifier, instead of treating it as a user-defined or standard
|
||||
/// builtin function.
|
||||
///
|
||||
/// Package-qualified calls (e.g. `data.other.name(arg)`) are **not**
|
||||
/// intercepted by registration. Those resolve through the normal
|
||||
/// user-defined / builtin lookup against their fully-qualified path
|
||||
/// (`data.other.name`).
|
||||
///
|
||||
/// `arg_count` must be exactly 1. The `HostAwait` instruction carries a
|
||||
/// single argument register; use object packing to pass multiple values
|
||||
/// (e.g. `name({"key1": v1, "key2": v2})`).
|
||||
///
|
||||
/// Returns `Err` when:
|
||||
/// - `name` is the reserved identifier `__builtin_host_await`,
|
||||
/// - `name` is empty, only whitespace, or has leading/trailing
|
||||
/// whitespace (whitespace-padded names would never match the
|
||||
/// trimmed identifier produced by the Rego parser, creating dead
|
||||
/// registrations),
|
||||
/// - `name` is already registered (duplicate registration is rejected
|
||||
/// rather than silently overwritten),
|
||||
/// - `arg_count` is not exactly 1.
|
||||
pub fn register_host_await_builtin(&mut self, name: &str, arg_count: usize) -> Result<()> {
|
||||
if name == "__builtin_host_await" {
|
||||
return Err(CompilerError::General {
|
||||
message: "__builtin_host_await is a reserved name and cannot be registered as a host-await builtin"
|
||||
.to_string(),
|
||||
}
|
||||
.into());
|
||||
}
|
||||
if name.is_empty() || name != name.trim() {
|
||||
return Err(CompilerError::General {
|
||||
message: format!(
|
||||
"host-await builtin name {name:?} must not be empty or contain leading/trailing whitespace"
|
||||
),
|
||||
}
|
||||
.into());
|
||||
}
|
||||
if self.host_await_builtins.contains_key(name) {
|
||||
return Err(CompilerError::General {
|
||||
message: format!(
|
||||
"host-await builtin '{name}' is already registered; \
|
||||
duplicate registration is not allowed"
|
||||
),
|
||||
}
|
||||
.into());
|
||||
}
|
||||
if arg_count != 1 {
|
||||
return Err(CompilerError::General {
|
||||
message: format!(
|
||||
"registered host-await builtin '{name}' must have arg_count == 1, got {arg_count}. \
|
||||
Use object packing to pass multiple values."
|
||||
),
|
||||
}
|
||||
.into());
|
||||
}
|
||||
self.host_await_builtins.insert(name.to_string(), arg_count);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub(super) fn with_soft_assert_mode<F, R>(&mut self, enabled: bool, f: F) -> R
|
||||
where
|
||||
F: FnOnce(&mut Self) -> R,
|
||||
|
||||
@@ -70,12 +70,31 @@ impl<'a> Compiler<'a> {
|
||||
..
|
||||
} = &stmt.literal
|
||||
{
|
||||
self.compile_some_in_loop_with_remaining_statements(
|
||||
let some_result_reg = self.compile_some_in_loop_with_remaining_statements(
|
||||
key,
|
||||
value,
|
||||
collection,
|
||||
&stmts[idx..],
|
||||
)?;
|
||||
// Inside an `every` body a `some ... in` acts as a condition
|
||||
// on the current iteration: if it matches nothing the
|
||||
// iteration must fail. Unlike a top-level rule body (where
|
||||
// per-iteration context yields produce the results), the
|
||||
// `every` body has no yield, so the loop result register is
|
||||
// otherwise discarded. Guard on it so a `some` that matches
|
||||
// nothing fails the enclosing `every` iteration.
|
||||
if matches!(
|
||||
self.context_stack.last().map(|c| &c.context_type),
|
||||
Some(ContextType::Every)
|
||||
) {
|
||||
self.emit_instruction(
|
||||
Instruction::Guard {
|
||||
register: some_result_reg,
|
||||
mode: GuardMode::Condition,
|
||||
},
|
||||
&stmt.span,
|
||||
);
|
||||
}
|
||||
return Ok(());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -234,8 +234,20 @@ impl<'a> Compiler<'a> {
|
||||
pub fn compile_from_policy(
|
||||
policy: &CompiledPolicy,
|
||||
entry_points: &[&str],
|
||||
) -> Result<Arc<Program>> {
|
||||
Self::compile_from_policy_with_host_await(policy, entry_points, &[])
|
||||
}
|
||||
|
||||
/// Compile from a CompiledPolicy to RVM Program with registered host-awaitable builtins.
|
||||
pub fn compile_from_policy_with_host_await(
|
||||
policy: &CompiledPolicy,
|
||||
entry_points: &[&str],
|
||||
host_await_builtins: &[(&str, usize)],
|
||||
) -> Result<Arc<Program>> {
|
||||
let mut compiler = Compiler::with_policy(policy);
|
||||
for &(name, arg_count) in host_await_builtins {
|
||||
compiler.register_host_await_builtin(name, arg_count)?;
|
||||
}
|
||||
compiler.current_rule_path = "".to_string();
|
||||
let rules = policy.get_rules();
|
||||
|
||||
|
||||
@@ -205,10 +205,10 @@ pub use alloc::sync::Arc as Rc;
|
||||
pub use alloc::rc::Rc;
|
||||
|
||||
#[cfg(feature = "std")]
|
||||
use std::collections::{hash_map::Entry as MapEntry, HashMap as Map, HashSet as Set};
|
||||
use std::collections::{hash_map::Entry as MapEntry, HashMap as Map, HashSet as MapSet};
|
||||
|
||||
#[cfg(not(feature = "std"))]
|
||||
use alloc::collections::{btree_map::Entry as MapEntry, BTreeMap as Map, BTreeSet as Set};
|
||||
use alloc::collections::{btree_map::Entry as MapEntry, BTreeMap as Map, BTreeSet as MapSet};
|
||||
|
||||
use alloc::{
|
||||
borrow::ToOwned as _,
|
||||
|
||||
@@ -354,6 +354,33 @@ impl<'source> Parser<'source> {
|
||||
}
|
||||
}
|
||||
|
||||
/// Parse a field name after `.` in a ref expression.
|
||||
///
|
||||
/// Unlike [`Self::parse_var`] and [`Self::parse_ident`], this method accepts **any**
|
||||
/// `TokenKind::Ident` token, including reserved keywords (e.g. `as`, `default`, `else`,
|
||||
/// `false`, `if`, `import`, `in`, `not`, `null`, `package`, `some`, `true`, `with`).
|
||||
///
|
||||
/// The position immediately after `.` is unambiguously a field name, so there is no
|
||||
/// syntactic ambiguity with statement-level keywords. This matches OPA's
|
||||
/// `keywords_in_refs` capability, which is enabled by default in standard OPA builds.
|
||||
///
|
||||
/// # Example
|
||||
/// ```rego
|
||||
/// allow if { input.v0.package.format == "npm" } # `package` is a keyword but valid here
|
||||
/// ```
|
||||
fn parse_ref_field(&mut self) -> Result<Span> {
|
||||
let span = self.tok.1.clone();
|
||||
match self.tok.0 {
|
||||
TokenKind::Ident => {
|
||||
self.next_token()?;
|
||||
Ok(span)
|
||||
}
|
||||
_ => Err(self
|
||||
.source
|
||||
.error(self.tok.1.line, self.tok.1.col, "expecting identifier")),
|
||||
}
|
||||
}
|
||||
|
||||
fn read_number(&mut self, span: Span) -> Result<Expr> {
|
||||
match Number::from_str(span.text()) {
|
||||
Ok(v) => Ok(Expr::Number {
|
||||
@@ -743,9 +770,10 @@ impl<'source> Parser<'source> {
|
||||
);
|
||||
}
|
||||
"." => {
|
||||
// Read identifier.
|
||||
// Read identifier. Keywords are allowed as field names in
|
||||
// dot-notation refs (e.g. `input.package.name`).
|
||||
self.next_token()?;
|
||||
let field = self.parse_var()?;
|
||||
let field = self.parse_ref_field()?;
|
||||
span.end = self.end;
|
||||
|
||||
// Disallow any whitespace between . and identifier.
|
||||
@@ -1418,9 +1446,10 @@ impl<'source> Parser<'source> {
|
||||
);
|
||||
}
|
||||
"." => {
|
||||
// Read identifier.
|
||||
// Read identifier. Keywords are allowed as field names in
|
||||
// dot-notation refs (e.g. `import data.my.package`).
|
||||
self.next_token()?;
|
||||
let field = self.parse_ident()?;
|
||||
let field = self.parse_ref_field()?;
|
||||
span.end = self.end;
|
||||
|
||||
// Disallow any whitespace between . and identifier.
|
||||
@@ -1523,7 +1552,8 @@ impl<'source> Parser<'source> {
|
||||
"." => {
|
||||
let sep_pos = self.tok.1.start;
|
||||
self.next_token()?;
|
||||
let field = self.parse_var()?;
|
||||
// Keywords are allowed as field names in dot-notation refs.
|
||||
let field = self.parse_ref_field()?;
|
||||
span.end = self.end;
|
||||
|
||||
// Disallow any whitespace between . and identifier.
|
||||
|
||||
@@ -495,8 +495,15 @@ impl RegoVM {
|
||||
// over a virtual null element.
|
||||
Ok(Some(IterationState::Single { consumed: false }))
|
||||
} else {
|
||||
// Standard Rego or count/forEach: non-collection → immediate result.
|
||||
let result = non_collection_result(mode);
|
||||
// Standard Rego: iterating a non-collection scalar (number,
|
||||
// string, bool, null, undefined) yields no iterations. For
|
||||
// `every` this makes the quantifier undefined (it fails) — it
|
||||
// is NOT vacuously true, which only applies to a genuinely
|
||||
// empty collection. `any`/`forEach` remain false.
|
||||
let result = match *mode {
|
||||
LoopMode::Every => Value::Undefined,
|
||||
LoopMode::Any | LoopMode::ForEach => Value::Bool(false),
|
||||
};
|
||||
self.set_register(params.result_reg, result)?;
|
||||
self.pc = usize::from(params.loop_end).saturating_sub(1);
|
||||
Ok(None)
|
||||
|
||||
@@ -24,6 +24,7 @@ use anyhow::{bail, Result};
|
||||
use core::num::NonZeroU32;
|
||||
use core::time::Duration;
|
||||
use serde::{Deserialize, Serialize};
|
||||
use std::collections::{BTreeMap, BTreeSet};
|
||||
use test_generator::test_resources;
|
||||
use timer_test_support::{
|
||||
apply_engine_timer, configure_time_source, reset_time_source, GlobalTimerGuard,
|
||||
@@ -818,3 +819,446 @@ fn test_get_data() -> Result<()> {
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_add_data_deep_merge() -> Result<()> {
|
||||
let mut engine = Engine::new();
|
||||
|
||||
// Nested objects under a shared top-level key are deep-merged, not replaced.
|
||||
engine.add_data(Value::from_json_str(r#"{ "a" : { "x" : 1 } }"#)?)?;
|
||||
engine.add_data(Value::from_json_str(r#"{ "a" : { "y" : 2 } }"#)?)?;
|
||||
|
||||
assert_eq!(
|
||||
engine.get_data(),
|
||||
Value::from_json_str(r#"{ "a" : { "x" : 1, "y" : 2 } }"#)?
|
||||
);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_add_data_deep_merge_multi_level() -> Result<()> {
|
||||
let mut engine = Engine::new();
|
||||
|
||||
// Merging recurses through multiple levels of nesting.
|
||||
engine.add_data(Value::from_json_str(
|
||||
r#"{ "a" : { "b" : { "x" : 1 } }, "top" : 0 }"#,
|
||||
)?)?;
|
||||
engine.add_data(Value::from_json_str(
|
||||
r#"{ "a" : { "b" : { "y" : 2 }, "c" : 3 } }"#,
|
||||
)?)?;
|
||||
|
||||
assert_eq!(
|
||||
engine.get_data(),
|
||||
Value::from_json_str(r#"{ "a" : { "b" : { "x" : 1, "y" : 2 }, "c" : 3 }, "top" : 0 }"#)?
|
||||
);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_add_data_leaf_conflict_errors() -> Result<()> {
|
||||
let mut engine = Engine::new();
|
||||
|
||||
// A genuine leaf conflict (same nested path, different value) is an error.
|
||||
engine.add_data(Value::from_json_str(r#"{ "a" : { "x" : 1 } }"#)?)?;
|
||||
assert!(engine
|
||||
.add_data(Value::from_json_str(r#"{ "a" : { "x" : 2 } }"#)?)
|
||||
.is_err());
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_add_data_object_vs_scalar_conflict_errors() -> Result<()> {
|
||||
let mut engine = Engine::new();
|
||||
|
||||
// An object cannot be merged with a scalar at the same path.
|
||||
engine.add_data(Value::from_json_str(r#"{ "a" : { "x" : 1 } }"#)?)?;
|
||||
assert!(engine
|
||||
.add_data(Value::from_json_str(r#"{ "a" : 5 }"#)?)
|
||||
.is_err());
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_add_data_equal_leaf_is_noop() -> Result<()> {
|
||||
let mut engine = Engine::new();
|
||||
|
||||
// Re-adding identical data (including equal nested leaves) is tolerated as a no-op.
|
||||
engine.add_data(Value::from_json_str(r#"{ "a" : { "x" : 1 } }"#)?)?;
|
||||
engine.add_data(Value::from_json_str(r#"{ "a" : { "x" : 1 }, "b" : 2 }"#)?)?;
|
||||
|
||||
assert_eq!(
|
||||
engine.get_data(),
|
||||
Value::from_json_str(r#"{ "a" : { "x" : 1 }, "b" : 2 }"#)?
|
||||
);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_add_data_set_union() -> Result<()> {
|
||||
let mut engine = Engine::new();
|
||||
|
||||
// Sets under a shared key are unioned rather than conflicting (consistent with the
|
||||
// rule-evaluation merge, where partial set rules accumulate elements). JSON cannot express
|
||||
// sets, so the data documents are built via the `Value` API.
|
||||
engine.add_data(Value::from(BTreeMap::from([(
|
||||
Value::from("s"),
|
||||
Value::from(BTreeSet::from([Value::from(1_u64), Value::from(2_u64)])),
|
||||
)])))?;
|
||||
engine.add_data(Value::from(BTreeMap::from([(
|
||||
Value::from("s"),
|
||||
Value::from(BTreeSet::from([Value::from(2_u64), Value::from(3_u64)])),
|
||||
)])))?;
|
||||
|
||||
let expected = Value::from(BTreeMap::from([(
|
||||
Value::from("s"),
|
||||
Value::from(BTreeSet::from([
|
||||
Value::from(1_u64),
|
||||
Value::from(2_u64),
|
||||
Value::from(3_u64),
|
||||
])),
|
||||
)]));
|
||||
assert_eq!(engine.get_data(), expected);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_add_data_nested_set_union() -> Result<()> {
|
||||
let mut engine = Engine::new();
|
||||
|
||||
// A set nested under an object key exercises the recursive merge: the outer objects are
|
||||
// deep-merged and the inner sets are then unioned.
|
||||
engine.add_data(Value::from(BTreeMap::from([(
|
||||
Value::from("a"),
|
||||
Value::from(BTreeMap::from([(
|
||||
Value::from("s"),
|
||||
Value::from(BTreeSet::from([Value::from(1_u64)])),
|
||||
)])),
|
||||
)])))?;
|
||||
engine.add_data(Value::from(BTreeMap::from([(
|
||||
Value::from("a"),
|
||||
Value::from(BTreeMap::from([(
|
||||
Value::from("s"),
|
||||
Value::from(BTreeSet::from([Value::from(2_u64)])),
|
||||
)])),
|
||||
)])))?;
|
||||
|
||||
let expected = Value::from(BTreeMap::from([(
|
||||
Value::from("a"),
|
||||
Value::from(BTreeMap::from([(
|
||||
Value::from("s"),
|
||||
Value::from(BTreeSet::from([Value::from(1_u64), Value::from(2_u64)])),
|
||||
)])),
|
||||
)]));
|
||||
assert_eq!(engine.get_data(), expected);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_add_data_equal_set_is_noop() -> Result<()> {
|
||||
let mut engine = Engine::new();
|
||||
|
||||
// Re-adding an identical set is tolerated as a no-op (not a conflict).
|
||||
engine.add_data(Value::from(BTreeMap::from([(
|
||||
Value::from("s"),
|
||||
Value::from(BTreeSet::from([Value::from(1_u64), Value::from(2_u64)])),
|
||||
)])))?;
|
||||
engine.add_data(Value::from(BTreeMap::from([(
|
||||
Value::from("s"),
|
||||
Value::from(BTreeSet::from([Value::from(1_u64), Value::from(2_u64)])),
|
||||
)])))?;
|
||||
|
||||
let expected = Value::from(BTreeMap::from([(
|
||||
Value::from("s"),
|
||||
Value::from(BTreeSet::from([Value::from(1_u64), Value::from(2_u64)])),
|
||||
)]));
|
||||
assert_eq!(engine.get_data(), expected);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_add_data_failed_merge_is_atomic() -> Result<()> {
|
||||
let mut engine = Engine::new();
|
||||
|
||||
engine.add_data(Value::from_json_str(r#"{ "a" : { "z" : 1 } }"#)?)?;
|
||||
|
||||
// Mixes a new key `m` with a conflicting leaf `z` (1 vs 3). Because `m` sorts
|
||||
// before `z`, a naive in-place merge would insert `m` and only then hit the `z`
|
||||
// conflict. add_data must be all-or-nothing: the whole call fails AND leaves the
|
||||
// existing data untouched — `m` must not leak in.
|
||||
assert!(engine
|
||||
.add_data(Value::from_json_str(r#"{ "a" : { "m" : 2, "z" : 3 } }"#)?)
|
||||
.is_err());
|
||||
|
||||
assert_eq!(
|
||||
engine.get_data(),
|
||||
Value::from_json_str(r#"{ "a" : { "z" : 1 } }"#)?
|
||||
);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_add_data_failed_set_merge_is_atomic() -> Result<()> {
|
||||
let mut engine = Engine::new();
|
||||
|
||||
// Existing data: a set `s` alongside a scalar `z` under `a`.
|
||||
engine.add_data(Value::from(BTreeMap::from([(
|
||||
Value::from("a"),
|
||||
Value::from(BTreeMap::from([
|
||||
(
|
||||
Value::from("s"),
|
||||
Value::from(BTreeSet::from([Value::from(1_u64), Value::from(2_u64)])),
|
||||
),
|
||||
(Value::from("z"), Value::from(1_u64)),
|
||||
])),
|
||||
)])))?;
|
||||
|
||||
// This add would union `s` with {3} but conflicts on `z` (1 vs 2). Since `s`
|
||||
// sorts before `z`, a naive in-place merge would union the set *before* failing
|
||||
// on `z`, leaking {3} into `s`. The atomic add must reject the whole call and
|
||||
// leave `s` as {1, 2}.
|
||||
assert!(engine
|
||||
.add_data(Value::from(BTreeMap::from([(
|
||||
Value::from("a"),
|
||||
Value::from(BTreeMap::from([
|
||||
(
|
||||
Value::from("s"),
|
||||
Value::from(BTreeSet::from([Value::from(3_u64)])),
|
||||
),
|
||||
(Value::from("z"), Value::from(2_u64)),
|
||||
])),
|
||||
)])))
|
||||
.is_err());
|
||||
|
||||
// `s` must be unchanged ({1, 2}, not {1, 2, 3}) and `z` must still be 1.
|
||||
let expected = Value::from(BTreeMap::from([(
|
||||
Value::from("a"),
|
||||
Value::from(BTreeMap::from([
|
||||
(
|
||||
Value::from("s"),
|
||||
Value::from(BTreeSet::from([Value::from(1_u64), Value::from(2_u64)])),
|
||||
),
|
||||
(Value::from("z"), Value::from(1_u64)),
|
||||
])),
|
||||
)]));
|
||||
assert_eq!(engine.get_data(), expected);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_add_data_failed_array_merge_is_atomic() -> Result<()> {
|
||||
let mut engine = Engine::new();
|
||||
|
||||
engine.add_data(Value::from_json_str(r#"{ "a" : { "arr" : [1, 2] } }"#)?)?;
|
||||
|
||||
// Arrays are atomic leaves (never element-merged), so a differing array at the
|
||||
// same path is a conflict. The new key `aa` sorts before `arr`, so a naive
|
||||
// in-place merge would insert `aa` and only then hit the `arr` conflict. add_data
|
||||
// must reject the whole call and leave the data untouched — `aa` must not leak in.
|
||||
assert!(engine
|
||||
.add_data(Value::from_json_str(
|
||||
r#"{ "a" : { "aa" : 5, "arr" : [3] } }"#
|
||||
)?)
|
||||
.is_err());
|
||||
|
||||
assert_eq!(
|
||||
engine.get_data(),
|
||||
Value::from_json_str(r#"{ "a" : { "arr" : [1, 2] } }"#)?
|
||||
);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
// The `Value::merge` used by `add_data` is shared with the rule-evaluation path
|
||||
// (`Interpreter::merge_rule_value`, reached via `with data.* as ...` and rule-value
|
||||
// materialization). The tests below pin down that making `merge` recursive changed only the
|
||||
// data-document semantics and left rule evaluation — in particular the `with data.* as ...`
|
||||
// modifier — behaving exactly as before (an override, never a deep merge).
|
||||
|
||||
#[test]
|
||||
fn test_with_data_modifier_replaces_nested_object() -> Result<()> {
|
||||
let mut engine = Engine::new();
|
||||
|
||||
// Base data provides a nested object with two keys.
|
||||
engine.add_data(Value::from_json_str(
|
||||
r#"{ "base" : { "foo" : { "a" : 1, "b" : 2 } } }"#,
|
||||
)?)?;
|
||||
|
||||
engine.add_policy(
|
||||
"policy.rego".to_string(),
|
||||
r#"
|
||||
package test
|
||||
|
||||
result := x if {
|
||||
x := data.base.foo with data.base.foo as {"a": 99}
|
||||
}
|
||||
"#
|
||||
.to_string(),
|
||||
)?;
|
||||
|
||||
// `with data.base.foo as {"a": 99}` REPLACES the whole subtree for the duration of the
|
||||
// rule; it must NOT deep-merge with the base `{ "a": 1, "b": 2 }`. So `b` is gone.
|
||||
assert_eq!(
|
||||
engine
|
||||
.eval_query("data.test.result".to_string(), false)?
|
||||
.result[0]
|
||||
.expressions[0]
|
||||
.value
|
||||
.clone(),
|
||||
Value::from_json_str(r#"{ "a" : 99 }"#)?
|
||||
);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_with_data_modifier_replaces_whole_subtree() -> Result<()> {
|
||||
let mut engine = Engine::new();
|
||||
|
||||
engine.add_data(Value::from_json_str(
|
||||
r#"{ "base" : { "foo" : 1, "bar" : 2 } }"#,
|
||||
)?)?;
|
||||
|
||||
engine.add_policy(
|
||||
"policy.rego".to_string(),
|
||||
r#"
|
||||
package test
|
||||
|
||||
result := x if {
|
||||
x := data.base with data.base as {"only": 3}
|
||||
}
|
||||
"#
|
||||
.to_string(),
|
||||
)?;
|
||||
|
||||
// `with data.base as {...}` replaces the entire `data.base` object; the original
|
||||
// `foo`/`bar` keys are not merged in.
|
||||
assert_eq!(
|
||||
engine
|
||||
.eval_query("data.test.result".to_string(), false)?
|
||||
.result[0]
|
||||
.expressions[0]
|
||||
.value
|
||||
.clone(),
|
||||
Value::from_json_str(r#"{ "only" : 3 }"#)?
|
||||
);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_with_data_modifier_nested_replace_preserves_siblings() -> Result<()> {
|
||||
let mut engine = Engine::new();
|
||||
|
||||
// `data.base` has a nested `foo` object AND a sibling `bar`.
|
||||
engine.add_data(Value::from_json_str(
|
||||
r#"{ "base" : { "foo" : { "a" : 1, "b" : 2 }, "bar" : 7 } }"#,
|
||||
)?)?;
|
||||
|
||||
engine.add_policy(
|
||||
"policy.rego".to_string(),
|
||||
r#"
|
||||
package test
|
||||
|
||||
# `with` targets the nested `data.base.foo`, but the rule observes the PARENT `data.base`.
|
||||
result := x if {
|
||||
x := data.base with data.base.foo as {"a": 99}
|
||||
}
|
||||
"#
|
||||
.to_string(),
|
||||
)?;
|
||||
|
||||
// The nested `foo` is deep-replaced (its `b` is gone — `with` never merges), while the
|
||||
// sibling `bar` under the same parent is preserved.
|
||||
assert_eq!(
|
||||
engine
|
||||
.eval_query("data.test.result".to_string(), false)?
|
||||
.result[0]
|
||||
.expressions[0]
|
||||
.value
|
||||
.clone(),
|
||||
Value::from_json_str(r#"{ "foo" : { "a" : 99 }, "bar" : 7 }"#)?
|
||||
);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_rule_reads_deep_merged_base_data() -> Result<()> {
|
||||
let mut engine = Engine::new();
|
||||
|
||||
// Two add_data calls deep-merge into a single nested object...
|
||||
engine.add_data(Value::from_json_str(
|
||||
r#"{ "base" : { "foo" : { "a" : 1 } } }"#,
|
||||
)?)?;
|
||||
engine.add_data(Value::from_json_str(
|
||||
r#"{ "base" : { "foo" : { "b" : 2 } } }"#,
|
||||
)?)?;
|
||||
|
||||
engine.add_policy(
|
||||
"policy.rego".to_string(),
|
||||
r#"
|
||||
package test
|
||||
|
||||
a := data.base.foo.a
|
||||
b := data.base.foo.b
|
||||
"#
|
||||
.to_string(),
|
||||
)?;
|
||||
|
||||
// ...and both merged leaves are visible to rule evaluation.
|
||||
assert_eq!(
|
||||
engine.eval_query("data.test".to_string(), false)?.result[0].expressions[0]
|
||||
.value
|
||||
.clone(),
|
||||
Value::from_json_str(r#"{ "a" : 1, "b" : 2 }"#)?
|
||||
);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_rule_values_coexist_with_merged_base_data() -> Result<()> {
|
||||
let mut engine = Engine::new();
|
||||
|
||||
// Deep-merged base data under `base`...
|
||||
engine.add_data(Value::from_json_str(
|
||||
r#"{ "base" : { "foo" : { "a" : 1 } } }"#,
|
||||
)?)?;
|
||||
engine.add_data(Value::from_json_str(
|
||||
r#"{ "base" : { "foo" : { "b" : 2 } } }"#,
|
||||
)?)?;
|
||||
|
||||
engine.add_policy(
|
||||
"policy.rego".to_string(),
|
||||
r#"
|
||||
package test
|
||||
|
||||
computed := data.base.foo.a + data.base.foo.b
|
||||
"#
|
||||
.to_string(),
|
||||
)?;
|
||||
|
||||
let data = engine.eval_query("data".to_string(), false)?.result[0].expressions[0]
|
||||
.value
|
||||
.clone();
|
||||
|
||||
// Base data is preserved and deep-merged...
|
||||
assert_eq!(
|
||||
data["base"],
|
||||
Value::from_json_str(r#"{ "foo" : { "a" : 1, "b" : 2 } }"#)?
|
||||
);
|
||||
// ...and the rule-computed value materializes alongside it without disturbing the merge.
|
||||
assert_eq!(data["test"]["computed"], Value::from(3_u64));
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
187
src/value/mod.rs
187
src/value/mod.rs
@@ -12,16 +12,22 @@
|
||||
)] // value helpers index paths directly for performance
|
||||
|
||||
mod object;
|
||||
mod set;
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests;
|
||||
|
||||
#[allow(unused_imports)] // surface for downstream PRs
|
||||
pub use object::{IntoIter, Iter, IterMut, Object};
|
||||
#[allow(unused_imports)] // surface for downstream PRs
|
||||
pub use set::Set;
|
||||
|
||||
#[cfg(feature = "rvm")]
|
||||
#[allow(unused_imports)] // surface for downstream PRs
|
||||
pub use object::ObjectCursor;
|
||||
#[cfg(feature = "rvm")]
|
||||
#[allow(unused_imports)] // surface for downstream PRs
|
||||
pub use set::SetCursor;
|
||||
|
||||
use crate::number::Number;
|
||||
|
||||
@@ -1326,6 +1332,13 @@ impl Value {
|
||||
}
|
||||
}
|
||||
|
||||
/// Depth cap for `deep_merge`/`check_mergeable`, set at serde_json's default recursion limit.
|
||||
///
|
||||
/// Prevents a stack overflow from adversarially nested data — an uncatchable abort that poisons
|
||||
/// every engine in an FFI process. At serde_json's limit it only backstops `Value`s built without
|
||||
/// a parse-time cap: the Python/Ruby native bindings, or programmatic construction.
|
||||
const MAX_MERGE_DEPTH: usize = 128;
|
||||
|
||||
impl Value {
|
||||
pub(crate) fn make_or_get_value_mut<'a>(&'a mut self, paths: &[&str]) -> Result<&'a mut Value> {
|
||||
if paths.is_empty() {
|
||||
@@ -1359,6 +1372,11 @@ impl Value {
|
||||
}
|
||||
}
|
||||
|
||||
/// Shallow-merge `new` into `self` with strict rule-output semantics.
|
||||
///
|
||||
/// Objects merge one level deep: a key on both sides must hold the *same* value or it is a
|
||||
/// conflict; sets union; equal values are a no-op. Non-recursive by design — data documents
|
||||
/// use [`Value::deep_merge`] instead.
|
||||
pub(crate) fn merge(&mut self, mut new: Value) -> Result<()> {
|
||||
if self == &new {
|
||||
return Ok(());
|
||||
@@ -1366,24 +1384,26 @@ impl Value {
|
||||
match (self, &mut new) {
|
||||
(v @ Value::Undefined, _) => *v = new,
|
||||
(Value::Set(ref mut set), Value::Set(new)) => {
|
||||
Rc::make_mut(set).append(Rc::make_mut(new));
|
||||
// Enforce allocator limit after merging set entries.
|
||||
// Union without deep-cloning the RHS set (see `deep_merge`).
|
||||
let dst = Rc::make_mut(set);
|
||||
match Rc::try_unwrap(core::mem::take(new)) {
|
||||
Ok(owned) => dst.extend(owned),
|
||||
Err(shared) => dst.extend(shared.iter().cloned()),
|
||||
}
|
||||
enforce_limit_anyhow()?;
|
||||
}
|
||||
(Value::Object(map), Value::Object(new)) => {
|
||||
for (k, v) in new.iter() {
|
||||
match map.get(k) {
|
||||
Some(pv) if *pv != *v => {
|
||||
bail!(
|
||||
"value for key `{}` generated multiple times: `{}` and `{}`",
|
||||
serde_json::to_string_pretty(&k).map_err(anyhow::Error::msg)?,
|
||||
serde_json::to_string_pretty(&pv).map_err(anyhow::Error::msg)?,
|
||||
serde_json::to_string_pretty(&v).map_err(anyhow::Error::msg)?,
|
||||
)
|
||||
}
|
||||
// Same key, different value: the rule produced two outputs for one path.
|
||||
Some(pv) if *pv != *v => bail!(
|
||||
"value for key `{}` generated multiple times: `{}` and `{}`",
|
||||
serde_json::to_string_pretty(&k).map_err(anyhow::Error::msg)?,
|
||||
serde_json::to_string_pretty(&pv).map_err(anyhow::Error::msg)?,
|
||||
serde_json::to_string_pretty(&v).map_err(anyhow::Error::msg)?,
|
||||
),
|
||||
_ => {
|
||||
Rc::make_mut(map).insert(k.clone(), v.clone());
|
||||
// Enforce allocator limit after merging object entries.
|
||||
enforce_limit_anyhow()?;
|
||||
}
|
||||
};
|
||||
@@ -1393,6 +1413,151 @@ impl Value {
|
||||
};
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Recursively deep-merge `new` into `self` — the data-document merge behind [`Engine::add_data`].
|
||||
///
|
||||
/// Objects recurse per-key, sets union, equal values are a no-op, any other differing pair
|
||||
/// conflicts. Set-union is a regorus extension (OPA data is JSON, which has no sets). Distinct
|
||||
/// from the strict, non-recursive [`Value::merge`] used for rule outputs — use deep-merge ONLY
|
||||
/// for data documents.
|
||||
///
|
||||
/// [`Engine::add_data`]: crate::Engine::add_data
|
||||
pub(crate) fn deep_merge(&mut self, new: Value) -> Result<()> {
|
||||
self.deep_merge_at(new, 0)
|
||||
}
|
||||
|
||||
/// Depth-tracked worker for [`deep_merge`](Value::deep_merge). See [`MAX_MERGE_DEPTH`].
|
||||
fn deep_merge_at(&mut self, mut new: Value, depth: usize) -> Result<()> {
|
||||
if depth >= MAX_MERGE_DEPTH {
|
||||
bail!("data merge exceeds maximum nesting depth of {MAX_MERGE_DEPTH}");
|
||||
}
|
||||
if self == &new {
|
||||
return Ok(());
|
||||
}
|
||||
match (self, &mut new) {
|
||||
(v @ Value::Undefined, _) => *v = new,
|
||||
(Value::Set(ref mut set), Value::Set(new)) => {
|
||||
// Union without deep-cloning the RHS set: move elements if uniquely owned,
|
||||
// else clone only the element handles (`Rc` bumps), never the whole `BTreeSet`.
|
||||
let dst = Rc::make_mut(set);
|
||||
match Rc::try_unwrap(core::mem::take(new)) {
|
||||
Ok(owned) => dst.extend(owned),
|
||||
Err(shared) => dst.extend(shared.iter().cloned()),
|
||||
}
|
||||
enforce_limit_anyhow()?;
|
||||
}
|
||||
(Value::Object(map), Value::Object(new)) => {
|
||||
// What each incoming key requires of the target map. Decided from a read-only
|
||||
// probe so a no-op or a conflict never triggers `Rc::make_mut` (and never clones
|
||||
// a shared map); `make_mut` is taken lazily, only when a key actually mutates.
|
||||
enum Step {
|
||||
Skip,
|
||||
Insert,
|
||||
Recurse,
|
||||
Conflict,
|
||||
}
|
||||
for (k, v) in new.iter() {
|
||||
let step = match map.get(k) {
|
||||
None => Step::Insert,
|
||||
Some(existing) if existing == v => Step::Skip,
|
||||
Some(existing)
|
||||
if matches!(
|
||||
(existing, v),
|
||||
(Value::Object(_), Value::Object(_))
|
||||
| (Value::Set(_), Value::Set(_))
|
||||
) =>
|
||||
{
|
||||
Step::Recurse
|
||||
}
|
||||
Some(_) => Step::Conflict,
|
||||
};
|
||||
match step {
|
||||
Step::Skip => {}
|
||||
Step::Insert => {
|
||||
Rc::make_mut(map).insert(k.clone(), v.clone());
|
||||
enforce_limit_anyhow()?;
|
||||
}
|
||||
// Both sides are containers: recurse so nested objects merge rather than
|
||||
// the subtree being replaced (OPA data-merge semantics).
|
||||
Step::Recurse => {
|
||||
let existing = Rc::make_mut(map).get_mut(k).ok_or_else(|| {
|
||||
anyhow!("internal error: key vanished during merge")
|
||||
})?;
|
||||
existing.deep_merge_at(v.clone(), depth.saturating_add(1))?;
|
||||
}
|
||||
Step::Conflict => {
|
||||
let existing = map.get(k).ok_or_else(|| {
|
||||
anyhow!("internal error: key vanished during merge")
|
||||
})?;
|
||||
bail!(
|
||||
"value for key `{}` generated multiple times: `{}` and `{}`",
|
||||
serde_json::to_string_pretty(&k).map_err(anyhow::Error::msg)?,
|
||||
serde_json::to_string_pretty(&existing)
|
||||
.map_err(anyhow::Error::msg)?,
|
||||
serde_json::to_string_pretty(&v).map_err(anyhow::Error::msg)?,
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
_ => bail!("error: could not merge value"),
|
||||
};
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Read-only check that [`deep_merge`](Value::deep_merge)-ing `other` into `self` would not
|
||||
/// conflict, without mutating or allocating.
|
||||
///
|
||||
/// Lets [`Engine::add_data`] validate before merging in place. Since a conflict is the only
|
||||
/// way the default-build merge can fail and it depends only on the inputs, a passing scan
|
||||
/// guarantees the in-place `deep_merge` won't fail — avoiding the alternative of cloning the
|
||||
/// whole document into a candidate just to validate. Only overlapping keys are walked, so
|
||||
/// disjoint additions are near-free.
|
||||
///
|
||||
/// [`Engine::add_data`]: crate::Engine::add_data
|
||||
#[cfg(not(feature = "allocator-memory-limits"))]
|
||||
pub(crate) fn check_mergeable(&self, other: &Value) -> Result<()> {
|
||||
self.check_mergeable_at(other, 0)
|
||||
}
|
||||
|
||||
/// Depth-tracked worker for [`check_mergeable`](Value::check_mergeable). See [`MAX_MERGE_DEPTH`].
|
||||
#[cfg(not(feature = "allocator-memory-limits"))]
|
||||
fn check_mergeable_at(&self, other: &Value, depth: usize) -> Result<()> {
|
||||
if depth >= MAX_MERGE_DEPTH {
|
||||
bail!("data merge exceeds maximum nesting depth of {MAX_MERGE_DEPTH}");
|
||||
}
|
||||
if self == other {
|
||||
return Ok(());
|
||||
}
|
||||
match (self, other) {
|
||||
(Value::Undefined, _) => Ok(()),
|
||||
// Set union never conflicts.
|
||||
(Value::Set(_), Value::Set(_)) => Ok(()),
|
||||
(Value::Object(dst), Value::Object(src)) => {
|
||||
for (k, sv) in src.iter() {
|
||||
// Only overlapping keys can conflict.
|
||||
if let Some(dv) = dst.get(k) {
|
||||
let both_mergeable = matches!(
|
||||
(dv, sv),
|
||||
(Value::Object(_), Value::Object(_)) | (Value::Set(_), Value::Set(_))
|
||||
);
|
||||
if both_mergeable {
|
||||
dv.check_mergeable_at(sv, depth.saturating_add(1))?;
|
||||
} else if dv != sv {
|
||||
bail!(
|
||||
"value for key `{}` generated multiple times: `{}` and `{}`",
|
||||
serde_json::to_string_pretty(&k).map_err(anyhow::Error::msg)?,
|
||||
serde_json::to_string_pretty(&dv).map_err(anyhow::Error::msg)?,
|
||||
serde_json::to_string_pretty(&sv).map_err(anyhow::Error::msg)?,
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
_ => bail!("error: could not merge value"),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl ops::Index<&Value> for Value {
|
||||
|
||||
103
src/value/set/iter.rs
Normal file
103
src/value/set/iter.rs
Normal file
@@ -0,0 +1,103 @@
|
||||
// Copyright (c) Microsoft Corporation.
|
||||
// Licensed under the MIT License.
|
||||
|
||||
//! Opaque iterator types for [`Set`].
|
||||
//!
|
||||
//! These newtypes wrap the storage backend's iterators so the backend can be
|
||||
//! swapped without changing any iterator type signatures observed by callers.
|
||||
|
||||
use alloc::collections::btree_set;
|
||||
use core::iter::FusedIterator;
|
||||
|
||||
use super::Set;
|
||||
use crate::value::Value;
|
||||
|
||||
/// Owned iterator over `Value` elements.
|
||||
#[derive(Debug)]
|
||||
pub struct IntoIter {
|
||||
pub(super) inner: btree_set::IntoIter<Value>,
|
||||
}
|
||||
|
||||
impl Iterator for IntoIter {
|
||||
type Item = Value;
|
||||
#[inline]
|
||||
fn next(&mut self) -> Option<Self::Item> {
|
||||
self.inner.next()
|
||||
}
|
||||
#[inline]
|
||||
fn size_hint(&self) -> (usize, Option<usize>) {
|
||||
self.inner.size_hint()
|
||||
}
|
||||
}
|
||||
|
||||
impl DoubleEndedIterator for IntoIter {
|
||||
#[inline]
|
||||
fn next_back(&mut self) -> Option<Self::Item> {
|
||||
self.inner.next_back()
|
||||
}
|
||||
}
|
||||
|
||||
impl ExactSizeIterator for IntoIter {
|
||||
#[inline]
|
||||
fn len(&self) -> usize {
|
||||
self.inner.len()
|
||||
}
|
||||
}
|
||||
|
||||
impl FusedIterator for IntoIter {}
|
||||
|
||||
/// Borrowed iterator over `&Value` elements.
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct Iter<'a> {
|
||||
pub(super) inner: btree_set::Iter<'a, Value>,
|
||||
}
|
||||
|
||||
impl<'a> Iterator for Iter<'a> {
|
||||
type Item = &'a Value;
|
||||
#[inline]
|
||||
fn next(&mut self) -> Option<Self::Item> {
|
||||
self.inner.next()
|
||||
}
|
||||
#[inline]
|
||||
fn size_hint(&self) -> (usize, Option<usize>) {
|
||||
self.inner.size_hint()
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> DoubleEndedIterator for Iter<'a> {
|
||||
#[inline]
|
||||
fn next_back(&mut self) -> Option<Self::Item> {
|
||||
self.inner.next_back()
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> ExactSizeIterator for Iter<'a> {
|
||||
#[inline]
|
||||
fn len(&self) -> usize {
|
||||
self.inner.len()
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> FusedIterator for Iter<'a> {}
|
||||
|
||||
impl IntoIterator for Set {
|
||||
type Item = Value;
|
||||
type IntoIter = IntoIter;
|
||||
#[inline]
|
||||
fn into_iter(self) -> Self::IntoIter {
|
||||
IntoIter {
|
||||
inner: self.inner.into_iter(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> IntoIterator for &'a Set {
|
||||
type Item = &'a Value;
|
||||
type IntoIter = Iter<'a>;
|
||||
#[inline]
|
||||
fn into_iter(self) -> Self::IntoIter {
|
||||
Iter {
|
||||
inner: self.inner.iter(),
|
||||
}
|
||||
}
|
||||
}
|
||||
269
src/value/set/mod.rs
Normal file
269
src/value/set/mod.rs
Normal file
@@ -0,0 +1,269 @@
|
||||
// Copyright (c) Microsoft Corporation.
|
||||
// Licensed under the MIT License.
|
||||
|
||||
//! See [`Set`].
|
||||
|
||||
mod iter;
|
||||
mod serde;
|
||||
|
||||
use alloc::collections::BTreeSet;
|
||||
use core::cmp::Ordering;
|
||||
use core::fmt;
|
||||
use core::ops::Bound;
|
||||
|
||||
use crate::value::Value;
|
||||
|
||||
#[allow(unused_imports)] // surface for downstream PRs
|
||||
pub use iter::{IntoIter, Iter};
|
||||
|
||||
/// Opaque, ordered set of [`Value`]s.
|
||||
///
|
||||
/// The current backing storage is `BTreeSet<Value>`. The inner field is
|
||||
/// private so the representation can change (hash-backed, lazy, bloom-fronted,
|
||||
/// FFI-backed) without touching call sites.
|
||||
///
|
||||
/// # Iteration
|
||||
///
|
||||
/// - [`Set::iter`] — implementation-defined order; non-resumable.
|
||||
/// - [`Set::iter_sorted`] — sorted by `Value::Ord`; non-resumable.
|
||||
/// - [`Set::cursor`] / [`Set::next`] — implementation-defined order,
|
||||
/// resumable; cheapest per-step cost. Used by interpreter/RVM when iteration
|
||||
/// must yield mid-flight.
|
||||
#[derive(Default, Clone, Eq, PartialEq)]
|
||||
pub struct Set {
|
||||
inner: BTreeSet<Value>,
|
||||
}
|
||||
|
||||
impl Set {
|
||||
/// Create an empty `Set`.
|
||||
#[inline]
|
||||
pub const fn new() -> Self {
|
||||
Self {
|
||||
inner: BTreeSet::new(),
|
||||
}
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn len(&self) -> usize {
|
||||
self.inner.len()
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn is_empty(&self) -> bool {
|
||||
self.inner.is_empty()
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn contains(&self, value: &Value) -> bool {
|
||||
self.inner.contains(value)
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn get(&self, value: &Value) -> Option<&Value> {
|
||||
self.inner.get(value)
|
||||
}
|
||||
|
||||
/// First element in sorted order (by `Value::Ord`).
|
||||
#[inline]
|
||||
pub fn first(&self) -> Option<&Value> {
|
||||
self.iter_sorted().next()
|
||||
}
|
||||
|
||||
/// Last element in sorted order (by `Value::Ord`).
|
||||
#[inline]
|
||||
pub fn last(&self) -> Option<&Value> {
|
||||
self.iter_sorted().next_back()
|
||||
}
|
||||
|
||||
/// Iteration in implementation-defined order. Non-resumable.
|
||||
///
|
||||
/// For the current BTree-backed storage this happens to be sorted, but
|
||||
/// callers MUST NOT depend on that. Use [`Set::iter_sorted`] when
|
||||
/// deterministic order is required, or [`Set::cursor`] when iteration
|
||||
/// must yield and resume.
|
||||
#[inline]
|
||||
pub fn iter(&self) -> impl Iterator<Item = &Value> + '_ {
|
||||
self.inner.iter()
|
||||
}
|
||||
|
||||
/// Iteration in sorted order (by `Value::Ord`). Non-resumable.
|
||||
///
|
||||
/// Use this for serialization, snapshots, hashing, `Debug`, etc.
|
||||
#[inline]
|
||||
pub fn iter_sorted(&self) -> Iter<'_> {
|
||||
// BTree backend iterates sorted natively.
|
||||
Iter {
|
||||
inner: self.inner.iter(),
|
||||
}
|
||||
}
|
||||
|
||||
/// Insert `value`. Returns `true` if the value was newly inserted.
|
||||
#[inline]
|
||||
pub fn insert(&mut self, value: Value) -> bool {
|
||||
self.inner.insert(value)
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn remove(&mut self, value: &Value) -> bool {
|
||||
self.inner.remove(value)
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn retain<F>(&mut self, f: F)
|
||||
where
|
||||
F: FnMut(&Value) -> bool,
|
||||
{
|
||||
self.inner.retain(f);
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn clear(&mut self) {
|
||||
self.inner.clear();
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn append(&mut self, other: &mut Set) {
|
||||
self.inner.append(&mut other.inner);
|
||||
}
|
||||
|
||||
/// Set intersection. Returns a new `Set` containing the elements
|
||||
/// present in both `self` and `other`.
|
||||
pub fn intersection(&self, other: &Set) -> Set {
|
||||
Set {
|
||||
inner: self.inner.intersection(&other.inner).cloned().collect(),
|
||||
}
|
||||
}
|
||||
|
||||
/// Set union. Returns a new `Set` containing the elements present in
|
||||
/// either `self` or `other`.
|
||||
pub fn union(&self, other: &Set) -> Set {
|
||||
Set {
|
||||
inner: self.inner.union(&other.inner).cloned().collect(),
|
||||
}
|
||||
}
|
||||
|
||||
/// Set difference. Returns a new `Set` containing the elements present
|
||||
/// in `self` but not in `other`.
|
||||
pub fn difference(&self, other: &Set) -> Set {
|
||||
Set {
|
||||
inner: self.inner.difference(&other.inner).cloned().collect(),
|
||||
}
|
||||
}
|
||||
|
||||
#[inline]
|
||||
pub fn is_subset(&self, other: &Set) -> bool {
|
||||
self.inner.is_subset(&other.inner)
|
||||
}
|
||||
|
||||
/// Wrap into a `Value::Set`.
|
||||
#[inline]
|
||||
pub fn into_value(self) -> Value {
|
||||
Value::Set(crate::Rc::new(self.inner))
|
||||
}
|
||||
|
||||
/// Create a resumable cursor over elements in implementation-defined
|
||||
/// order. Stable for the lifetime of `&self`. O(1).
|
||||
///
|
||||
/// The cursor is fully self-owned (it stores a clone of the last-seen
|
||||
/// element, not a reference) so it can be stored as a field of a
|
||||
/// long-lived state struct — e.g. an RVM iteration frame that persists
|
||||
/// across instruction dispatches. As a consequence, mutating the `Set`
|
||||
/// between `next()` calls is not rejected by the borrow checker; the
|
||||
/// resulting iteration order in that case is unspecified.
|
||||
#[inline]
|
||||
pub const fn cursor(&self) -> SetCursor {
|
||||
SetCursor {
|
||||
inner: SetCursorInner::BTree(None),
|
||||
}
|
||||
}
|
||||
|
||||
/// Advance `cursor` and yield the next element. O(log n) for the BTree
|
||||
/// backend (range probe); future hash/inline variants may be O(1).
|
||||
pub fn next<'a>(&'a self, cursor: &mut SetCursor) -> Option<&'a Value> {
|
||||
let SetCursorInner::BTree(ref mut last) = cursor.inner;
|
||||
let next = last.as_ref().map_or_else(
|
||||
|| self.inner.iter().next(),
|
||||
|prev| {
|
||||
// `(Bound<&T>, Bound<&T>)` impls `RangeBounds<T>` — no clone
|
||||
// needed to build the resume bound.
|
||||
self.inner
|
||||
.range((Bound::Excluded(prev), Bound::Unbounded))
|
||||
.next()
|
||||
},
|
||||
);
|
||||
let v = next?;
|
||||
*last = Some(v.clone());
|
||||
Some(v)
|
||||
}
|
||||
}
|
||||
|
||||
/// Opaque resumable cursor over a [`Set`]'s elements in
|
||||
/// implementation-defined order.
|
||||
///
|
||||
/// Self-owned: holds no borrow on the `Set`, so it can be stored as a
|
||||
/// field of a long-lived state struct (e.g. an RVM iteration frame).
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct SetCursor {
|
||||
inner: SetCursorInner,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
enum SetCursorInner {
|
||||
/// BTree backend cursor: tracks last-seen element. `None` means "before start".
|
||||
BTree(Option<Value>),
|
||||
}
|
||||
|
||||
// ---- Hand-written Ord/PartialOrd ----------------------------------------
|
||||
//
|
||||
// Implemented in terms of `iter_sorted()` so ordering is consistent with the
|
||||
// canonical (sorted) view of the elements and is therefore independent of
|
||||
// the storage variant.
|
||||
|
||||
impl Ord for Set {
|
||||
fn cmp(&self, other: &Self) -> Ordering {
|
||||
self.iter_sorted().cmp(other.iter_sorted())
|
||||
}
|
||||
}
|
||||
|
||||
impl PartialOrd for Set {
|
||||
#[inline]
|
||||
fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
|
||||
Some(self.cmp(other))
|
||||
}
|
||||
}
|
||||
|
||||
impl fmt::Debug for Set {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
// Use sorted iteration so Debug output is stable across storage
|
||||
// variants.
|
||||
f.debug_set().entries(self.iter_sorted()).finish()
|
||||
}
|
||||
}
|
||||
|
||||
impl Extend<Value> for Set {
|
||||
fn extend<I: IntoIterator<Item = Value>>(&mut self, iter: I) {
|
||||
self.inner.extend(iter);
|
||||
}
|
||||
}
|
||||
|
||||
impl FromIterator<Value> for Set {
|
||||
fn from_iter<I: IntoIterator<Item = Value>>(iter: I) -> Self {
|
||||
Self {
|
||||
inner: BTreeSet::from_iter(iter),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl From<BTreeSet<Value>> for Set {
|
||||
#[inline]
|
||||
fn from(set: BTreeSet<Value>) -> Self {
|
||||
Self { inner: set }
|
||||
}
|
||||
}
|
||||
|
||||
impl From<Set> for Value {
|
||||
#[inline]
|
||||
fn from(s: Set) -> Self {
|
||||
s.into_value()
|
||||
}
|
||||
}
|
||||
44
src/value/set/serde.rs
Normal file
44
src/value/set/serde.rs
Normal file
@@ -0,0 +1,44 @@
|
||||
// Copyright (c) Microsoft Corporation.
|
||||
// Licensed under the MIT License.
|
||||
|
||||
//! Serde `Serialize`/`Deserialize` impls for [`Set`].
|
||||
|
||||
use core::fmt;
|
||||
|
||||
use serde::de::{Deserialize, Deserializer, Error as _, SeqAccess, Visitor};
|
||||
use serde::ser::{Serialize, Serializer};
|
||||
|
||||
use super::Set;
|
||||
use crate::value::Value;
|
||||
|
||||
impl Serialize for Set {
|
||||
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
|
||||
// Sets serialize as JSON arrays. Sorted iteration: canonical output.
|
||||
serializer.collect_seq(self.iter_sorted())
|
||||
}
|
||||
}
|
||||
|
||||
struct SetVisitor;
|
||||
|
||||
impl<'de> Visitor<'de> for SetVisitor {
|
||||
type Value = Set;
|
||||
|
||||
fn expecting(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
f.write_str("a sequence of Values")
|
||||
}
|
||||
|
||||
fn visit_seq<A: SeqAccess<'de>>(self, mut access: A) -> Result<Self::Value, A::Error> {
|
||||
let mut set = Set::new();
|
||||
while let Some(v) = access.next_element::<Value>()? {
|
||||
set.insert(v);
|
||||
crate::utils::limits::check_memory_limit_if_needed().map_err(A::Error::custom)?;
|
||||
}
|
||||
Ok(set)
|
||||
}
|
||||
}
|
||||
|
||||
impl<'de> Deserialize<'de> for Set {
|
||||
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
|
||||
deserializer.deserialize_seq(SetVisitor)
|
||||
}
|
||||
}
|
||||
@@ -2,6 +2,7 @@
|
||||
// Licensed under the MIT License.
|
||||
|
||||
#![allow(
|
||||
clippy::panic,
|
||||
clippy::expect_used,
|
||||
clippy::unwrap_used,
|
||||
clippy::indexing_slicing,
|
||||
@@ -13,11 +14,11 @@
|
||||
clippy::pattern_type_mismatch
|
||||
)]
|
||||
|
||||
use alloc::collections::BTreeMap;
|
||||
use alloc::collections::{BTreeMap, BTreeSet};
|
||||
use alloc::format;
|
||||
use alloc::vec::Vec;
|
||||
|
||||
use super::Object;
|
||||
use super::{Object, Set};
|
||||
use crate::value::Value;
|
||||
|
||||
fn val(i: u64) -> Value {
|
||||
@@ -562,3 +563,306 @@ fn object_insert_returns_previous_value() {
|
||||
assert_eq!(obj.insert(val(0), val(2)), Some(val(1)));
|
||||
assert_eq!(obj.get(&val(0)), Some(&val(2)));
|
||||
}
|
||||
|
||||
// =========================================================================
|
||||
// Set tests
|
||||
// =========================================================================
|
||||
|
||||
const SET_SIZES: &[u64] = &[0, 1, 2, 4, 8, 64, 256, 1024];
|
||||
|
||||
#[test]
|
||||
fn set_iter_sorted_matches_btreeset_oracle() {
|
||||
for &n in SET_SIZES {
|
||||
let values: Vec<Value> = (0..n).map(val).collect();
|
||||
let oracle: BTreeSet<Value> = values.iter().cloned().collect();
|
||||
let s: Set = values.into_iter().collect();
|
||||
let actual: Vec<&Value> = s.iter_sorted().collect();
|
||||
let expected: Vec<&Value> = oracle.iter().collect();
|
||||
assert_eq!(actual, expected, "size {n}");
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn set_iter_multiset_equality_with_oracle() {
|
||||
for &n in SET_SIZES {
|
||||
let values: Vec<Value> = (0..n).map(val).collect();
|
||||
let oracle: BTreeSet<Value> = values.iter().cloned().collect();
|
||||
let s: Set = values.into_iter().collect();
|
||||
let mut a: Vec<Value> = s.iter().cloned().collect();
|
||||
let mut b: Vec<Value> = oracle.iter().cloned().collect();
|
||||
a.sort();
|
||||
b.sort();
|
||||
assert_eq!(a, b);
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn set_algebra_matches_btreeset() {
|
||||
let a_vals: Vec<Value> = (0..32_u64).map(val).collect();
|
||||
let b_vals: Vec<Value> = (16..48_u64).map(val).collect();
|
||||
let a_btree: BTreeSet<Value> = a_vals.iter().cloned().collect();
|
||||
let b_btree: BTreeSet<Value> = b_vals.iter().cloned().collect();
|
||||
let a: Set = a_vals.into_iter().collect();
|
||||
let b: Set = b_vals.into_iter().collect();
|
||||
|
||||
fn sorted<'a, I: Iterator<Item = &'a Value>>(it: I) -> Vec<&'a Value> {
|
||||
let mut v: Vec<&Value> = it.collect();
|
||||
v.sort();
|
||||
v
|
||||
}
|
||||
|
||||
let inter_set = a.intersection(&b);
|
||||
assert_eq!(
|
||||
sorted(inter_set.iter_sorted()),
|
||||
sorted(a_btree.intersection(&b_btree))
|
||||
);
|
||||
|
||||
let union_set = a.union(&b);
|
||||
assert_eq!(
|
||||
sorted(union_set.iter_sorted()),
|
||||
sorted(a_btree.union(&b_btree))
|
||||
);
|
||||
|
||||
let diff_set = a.difference(&b);
|
||||
assert_eq!(
|
||||
sorted(diff_set.iter_sorted()),
|
||||
sorted(a_btree.difference(&b_btree))
|
||||
);
|
||||
|
||||
// Subset: trivial + non-trivial cases.
|
||||
let proper_subset: Set = (0..16_u64).map(val).collect();
|
||||
let non_subset: Set = (30..50_u64).map(val).collect();
|
||||
assert!(a.is_subset(&a));
|
||||
assert!(proper_subset.is_subset(&a));
|
||||
assert!(!non_subset.is_subset(&a));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn set_first_last() {
|
||||
let s: Set = (0..16_u64).map(val).collect();
|
||||
assert_eq!(s.first(), Some(&val(0)));
|
||||
assert_eq!(s.last(), Some(&val(15)));
|
||||
assert!(Set::new().first().is_none());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn set_serde_roundtrip() {
|
||||
for &n in &[0_u64, 1, 8, 64] {
|
||||
let s: Set = (0..n).map(val).collect();
|
||||
let json = serde_json::to_string(&s).expect("ser");
|
||||
let back: Set = serde_json::from_str(&json).expect("de");
|
||||
assert_eq!(s, back, "size {n}");
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn set_append_drains_other() {
|
||||
let mut a: Set = (0..4_u64).map(val).collect();
|
||||
let mut b: Set = (4..8_u64).map(val).collect();
|
||||
a.append(&mut b);
|
||||
assert_eq!(a.len(), 8);
|
||||
assert!(b.is_empty());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn set_value_cow_make_mut_isolates_clones() {
|
||||
let a = Value::new_set();
|
||||
let b = a.clone();
|
||||
let mut b_owned = b;
|
||||
b_owned.as_set_mut().expect("set").insert(Value::from("x"));
|
||||
assert_eq!(a.as_set().expect("set").len(), 0);
|
||||
assert_eq!(b_owned.as_set().expect("set").len(), 1);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn set_from_iter_dedups_duplicates() {
|
||||
let s: Set = [val(1), val(1), val(2), val(2), val(2)]
|
||||
.into_iter()
|
||||
.collect();
|
||||
assert_eq!(s.len(), 2);
|
||||
assert!(s.contains(&val(1)));
|
||||
assert!(s.contains(&val(2)));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn set_accessor_coverage() {
|
||||
let mut s: Set = (0..4_u64).map(val).collect();
|
||||
|
||||
assert!(s.contains(&val(2)));
|
||||
assert!(!s.contains(&val(100)));
|
||||
|
||||
assert_eq!(s.get(&val(2)), Some(&val(2)));
|
||||
assert!(s.get(&val(100)).is_none());
|
||||
|
||||
assert!(s.remove(&val(2)));
|
||||
assert!(!s.remove(&val(2)));
|
||||
assert_eq!(s.len(), 3);
|
||||
|
||||
s.retain(|v| v != &val(0));
|
||||
assert!(!s.contains(&val(0)));
|
||||
assert_eq!(s.len(), 2);
|
||||
|
||||
s.clear();
|
||||
assert!(s.is_empty());
|
||||
assert!(!s.contains(&val(1)));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn set_into_iterator_ref() {
|
||||
let s: Set = (0..4_u64).map(val).collect();
|
||||
let mut count = 0;
|
||||
for _v in &s {
|
||||
count += 1;
|
||||
}
|
||||
assert_eq!(count, 4);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn set_cursor_yields_every_element_once() {
|
||||
for &n in SET_SIZES {
|
||||
let vals: Vec<Value> = (0..n).map(val).collect();
|
||||
let s: Set = vals.clone().into_iter().collect();
|
||||
let mut cursor = s.cursor();
|
||||
let mut collected: Vec<Value> = Vec::new();
|
||||
while let Some(v) = s.next(&mut cursor) {
|
||||
collected.push(v.clone());
|
||||
}
|
||||
let mut a = collected;
|
||||
a.sort();
|
||||
let mut b = vals;
|
||||
b.sort();
|
||||
assert_eq!(a, b, "size {n}");
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn set_cursor_empty_returns_none_immediately() {
|
||||
let s = Set::new();
|
||||
let mut c = s.cursor();
|
||||
assert!(s.next(&mut c).is_none());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn set_ord_invariant_to_insertion_order() {
|
||||
let mut a = Set::new();
|
||||
let mut b = Set::new();
|
||||
for i in 0..16_u64 {
|
||||
a.insert(val(i));
|
||||
}
|
||||
for i in (0..16_u64).rev() {
|
||||
b.insert(val(i));
|
||||
}
|
||||
assert_eq!(a.cmp(&b), core::cmp::Ordering::Equal);
|
||||
}
|
||||
|
||||
fn top_object_rc(v: &Value) -> crate::Rc<Object> {
|
||||
match v {
|
||||
Value::Object(rc) => crate::Rc::clone(rc),
|
||||
other => panic!("expected object, got {other:?}"),
|
||||
}
|
||||
}
|
||||
|
||||
/// A no-op deep-merge (every incoming key already present with an equal value) must not clone
|
||||
/// the target map. `deep_merge` acquires mutable access lazily, so when nothing changes at a
|
||||
/// level the shared `Rc` is left untouched.
|
||||
#[test]
|
||||
fn deep_merge_noop_subset_does_not_clone_object() {
|
||||
let mut a = Value::from_json_str(r#"{"x": {"deep": 1}, "y": 2}"#).unwrap();
|
||||
// Keep a second reference so the map's refcount > 1: eager `make_mut` would clone here.
|
||||
let shared = a.clone();
|
||||
let before = top_object_rc(&a);
|
||||
|
||||
// Strict subset with identical values: no insert, no recurse, no conflict at any level.
|
||||
a.deep_merge(Value::from_json_str(r#"{"y": 2}"#).unwrap())
|
||||
.unwrap();
|
||||
|
||||
let after = top_object_rc(&a);
|
||||
assert!(
|
||||
crate::Rc::ptr_eq(&before, &after),
|
||||
"no-op merge must not clone the shared object map"
|
||||
);
|
||||
assert_eq!(a, shared, "value must be unchanged by a no-op merge");
|
||||
}
|
||||
|
||||
/// An equal nested object under a shared key is a no-op too — the equality short-circuit runs
|
||||
/// before any mutable access, so the map is not cloned.
|
||||
#[test]
|
||||
fn deep_merge_equal_nested_object_does_not_clone() {
|
||||
let mut a = Value::from_json_str(r#"{"cfg": {"a": 1, "b": 2}, "n": 5}"#).unwrap();
|
||||
let _shared = a.clone();
|
||||
let before = top_object_rc(&a);
|
||||
|
||||
a.deep_merge(Value::from_json_str(r#"{"cfg": {"a": 1, "b": 2}}"#).unwrap())
|
||||
.unwrap();
|
||||
|
||||
let after = top_object_rc(&a);
|
||||
assert!(
|
||||
crate::Rc::ptr_eq(&before, &after),
|
||||
"merging an equal nested object must not clone the map"
|
||||
);
|
||||
}
|
||||
|
||||
/// A conflict on the first overlapping key is reported without cloning the target map: the
|
||||
/// read-only probe detects the conflict before any mutable access is taken.
|
||||
#[test]
|
||||
fn deep_merge_conflict_does_not_clone_object() {
|
||||
let mut a = Value::from_json_str(r#"{"x": 1, "y": 2}"#).unwrap();
|
||||
let _shared = a.clone();
|
||||
let before = top_object_rc(&a);
|
||||
|
||||
let err = a
|
||||
.deep_merge(Value::from_json_str(r#"{"x": 999}"#).unwrap())
|
||||
.unwrap_err();
|
||||
assert!(format!("{err}").contains("generated multiple times"));
|
||||
|
||||
let after = top_object_rc(&a);
|
||||
assert!(
|
||||
crate::Rc::ptr_eq(&before, &after),
|
||||
"a conflict must not clone the shared object map"
|
||||
);
|
||||
}
|
||||
|
||||
/// Nest `depth` objects `{"k": {"k": ... leaf}}` iteratively, so building the value can't itself
|
||||
/// overflow and there's no parser to cap depth first.
|
||||
fn nest(depth: usize, leaf: Value) -> Value {
|
||||
let mut v = leaf;
|
||||
for _ in 0..depth {
|
||||
let mut m = BTreeMap::new();
|
||||
m.insert(Value::from("k"), v);
|
||||
v = Value::from(m);
|
||||
}
|
||||
v
|
||||
}
|
||||
|
||||
/// Over-deep data must fail with a clean `Err`, not overflow the stack. A `Value` can be built
|
||||
/// without serde_json's parse-time cap (the native bindings), so `deep_merge` must guard itself.
|
||||
#[test]
|
||||
fn deep_merge_rejects_excessive_depth() {
|
||||
let depth = super::MAX_MERGE_DEPTH + 50;
|
||||
// Shared key `k` on both sides forces full-depth recursion; distinct leaves keep the trees
|
||||
// unequal so the equality short-circuit never fires.
|
||||
let mut a = nest(depth, Value::from_json_str(r#"{"a": 1}"#).unwrap());
|
||||
let b = nest(depth, Value::from_json_str(r#"{"b": 2}"#).unwrap());
|
||||
|
||||
let err = a.deep_merge(b).unwrap_err();
|
||||
assert!(
|
||||
format!("{err}").contains("nesting depth"),
|
||||
"expected a depth-limit error, got: {err}"
|
||||
);
|
||||
}
|
||||
|
||||
/// The pre-scan carries the same guard, so the default build rejects over-deep input up front
|
||||
/// (leaving the live document untouched) instead of overflowing during validation.
|
||||
#[cfg(not(feature = "allocator-memory-limits"))]
|
||||
#[test]
|
||||
fn check_mergeable_rejects_excessive_depth() {
|
||||
let depth = super::MAX_MERGE_DEPTH + 50;
|
||||
let a = nest(depth, Value::from_json_str(r#"{"a": 1}"#).unwrap());
|
||||
let b = nest(depth, Value::from_json_str(r#"{"b": 2}"#).unwrap());
|
||||
|
||||
let err = a.check_mergeable(&b).unwrap_err();
|
||||
assert!(
|
||||
format!("{err}").contains("nesting depth"),
|
||||
"expected a depth-limit error, got: {err}"
|
||||
);
|
||||
}
|
||||
|
||||
268
tests/interpreter/cases/refr/keywords_in_refs.yaml
Normal file
268
tests/interpreter/cases/refr/keywords_in_refs.yaml
Normal file
@@ -0,0 +1,268 @@
|
||||
# Copyright (c) Microsoft Corporation.
|
||||
# Licensed under the MIT License.
|
||||
#
|
||||
# Tests for keywords-as-field-names in dot-notation refs.
|
||||
# Matches OPA's `keywords_in_refs` behavior, enabled by default.
|
||||
cases:
|
||||
- note: keywords_in_refs/package field
|
||||
modules:
|
||||
- |
|
||||
package test
|
||||
allow if {
|
||||
input.v0.package.format == "npm"
|
||||
}
|
||||
input:
|
||||
v0:
|
||||
package:
|
||||
format: npm
|
||||
query: data.test.allow
|
||||
want_result: true
|
||||
|
||||
- note: keywords_in_refs/as field
|
||||
modules:
|
||||
- |
|
||||
package test
|
||||
x = input.as.type
|
||||
input:
|
||||
as:
|
||||
type: string
|
||||
query: data.test.x
|
||||
want_result: string
|
||||
|
||||
- note: keywords_in_refs/default field
|
||||
modules:
|
||||
- |
|
||||
package test
|
||||
x = input.default.value
|
||||
input:
|
||||
default:
|
||||
value: 42
|
||||
query: data.test.x
|
||||
want_result: 42
|
||||
|
||||
- note: keywords_in_refs/else field
|
||||
modules:
|
||||
- |
|
||||
package test
|
||||
x = input.else.value
|
||||
input:
|
||||
else:
|
||||
value: hello
|
||||
query: data.test.x
|
||||
want_result: hello
|
||||
|
||||
- note: keywords_in_refs/import field
|
||||
modules:
|
||||
- |
|
||||
package test
|
||||
x = input.import.name
|
||||
input:
|
||||
import:
|
||||
name: foo
|
||||
query: data.test.x
|
||||
want_result: foo
|
||||
|
||||
- note: keywords_in_refs/not field
|
||||
modules:
|
||||
- |
|
||||
package test
|
||||
x = input.not.allowed
|
||||
input:
|
||||
not:
|
||||
allowed: false
|
||||
query: data.test.x
|
||||
want_result: false
|
||||
|
||||
- note: keywords_in_refs/null field
|
||||
modules:
|
||||
- |
|
||||
package test
|
||||
x = input.null.value
|
||||
input:
|
||||
"null":
|
||||
value: 1
|
||||
query: data.test.x
|
||||
want_result: 1
|
||||
|
||||
- note: keywords_in_refs/some field
|
||||
modules:
|
||||
- |
|
||||
package test
|
||||
x = input.some.field
|
||||
input:
|
||||
some:
|
||||
field: bar
|
||||
query: data.test.x
|
||||
want_result: bar
|
||||
|
||||
- note: keywords_in_refs/true field
|
||||
modules:
|
||||
- |
|
||||
package test
|
||||
x = input.true.x
|
||||
input:
|
||||
"true":
|
||||
x: 2
|
||||
query: data.test.x
|
||||
want_result: 2
|
||||
|
||||
- note: keywords_in_refs/false field
|
||||
modules:
|
||||
- |
|
||||
package test
|
||||
x = input.false.x
|
||||
input:
|
||||
"false":
|
||||
x: 3
|
||||
query: data.test.x
|
||||
want_result: 3
|
||||
|
||||
- note: keywords_in_refs/with field
|
||||
modules:
|
||||
- |
|
||||
package test
|
||||
x = input.with.config
|
||||
input:
|
||||
with:
|
||||
config: test
|
||||
query: data.test.x
|
||||
want_result: test
|
||||
|
||||
- note: keywords_in_refs/future keywords (if, in, every, contains)
|
||||
modules:
|
||||
- |
|
||||
package test
|
||||
import future.keywords
|
||||
x if {
|
||||
input.if.condition == true
|
||||
input.in.set == "member"
|
||||
input.every.item == "x"
|
||||
input.contains.key == "val"
|
||||
}
|
||||
input:
|
||||
if:
|
||||
condition: true
|
||||
in:
|
||||
set: member
|
||||
every:
|
||||
item: x
|
||||
contains:
|
||||
key: val
|
||||
query: data.test.x
|
||||
want_result: true
|
||||
|
||||
- note: keywords_in_refs/chained keywords
|
||||
modules:
|
||||
- |
|
||||
package test
|
||||
x = input.package.import.default
|
||||
input:
|
||||
package:
|
||||
import:
|
||||
default: chained
|
||||
query: data.test.x
|
||||
want_result: chained
|
||||
|
||||
- note: keywords_in_refs/data path with keyword
|
||||
modules:
|
||||
- |
|
||||
package test
|
||||
x = data.mydata.package.name
|
||||
data:
|
||||
mydata:
|
||||
package:
|
||||
name: mypackage
|
||||
query: data.test.x
|
||||
want_result: mypackage
|
||||
|
||||
- note: keywords_in_refs/rego v1 all keywords
|
||||
modules:
|
||||
- |
|
||||
package test
|
||||
import rego.v1
|
||||
allow if {
|
||||
input.package.format == "npm"
|
||||
input.default.value == 1
|
||||
input.if.enabled == true
|
||||
input.in.set == "member"
|
||||
input.not.flag == false
|
||||
input.with.config == "ok"
|
||||
}
|
||||
input:
|
||||
package:
|
||||
format: npm
|
||||
default:
|
||||
value: 1
|
||||
if:
|
||||
enabled: true
|
||||
in:
|
||||
set: member
|
||||
not:
|
||||
flag: false
|
||||
with:
|
||||
config: ok
|
||||
query: data.test.allow
|
||||
want_result: true
|
||||
|
||||
- note: keywords_in_refs/future keywords without import
|
||||
modules:
|
||||
- |
|
||||
package test
|
||||
x = [input.if.flag, input.in.value, input.every.item, input.contains.key]
|
||||
input:
|
||||
if:
|
||||
flag: true
|
||||
in:
|
||||
value: member
|
||||
every:
|
||||
item: each
|
||||
contains:
|
||||
key: present
|
||||
query: data.test.x
|
||||
want_result: [true, "member", "each", "present"]
|
||||
|
||||
- note: keywords_in_refs/package path keywords
|
||||
modules:
|
||||
- |
|
||||
package words.if.default
|
||||
value = 7
|
||||
- |
|
||||
package test
|
||||
x = data.words.if.default.value
|
||||
query: data.test.x
|
||||
want_result: 7
|
||||
|
||||
- note: keywords_in_refs/import path keywords
|
||||
modules:
|
||||
- |
|
||||
package test
|
||||
import data.catalog.if.default as kw
|
||||
x = kw.value
|
||||
data:
|
||||
catalog:
|
||||
if:
|
||||
default:
|
||||
value: 99
|
||||
query: data.test.x
|
||||
want_result: 99
|
||||
|
||||
- note: keywords_in_refs/rule head keyword path
|
||||
modules:
|
||||
- |
|
||||
package test
|
||||
policy.default.level := 3
|
||||
query: data.test.policy.default.level
|
||||
want_result: 3
|
||||
|
||||
- note: keywords_in_refs/mixed dot keyword and dynamic bracket
|
||||
modules:
|
||||
- |
|
||||
package test
|
||||
x = input.package[segment].value
|
||||
segment = "import"
|
||||
input:
|
||||
package:
|
||||
import:
|
||||
value: from_dynamic
|
||||
query: data.test.x
|
||||
want_result: from_dynamic
|
||||
223
tests/interpreter/cases/rule/multiple_outputs.yaml
Normal file
223
tests/interpreter/cases/rule/multiple_outputs.yaml
Normal file
@@ -0,0 +1,223 @@
|
||||
# Copyright (c) Microsoft Corporation.
|
||||
# Licensed under the MIT License.
|
||||
|
||||
# How multiple rule definitions writing to the same path combine vs. conflict.
|
||||
# Cross-checked against OPA v1.2.0 (`opa eval`); modules use `rego.v1` to match it.
|
||||
#
|
||||
# * Zero-arg `f()` materializes as a COMPLETE document: any two differing outputs
|
||||
# conflict, even disjoint objects (OPA does NOT deep-merge).
|
||||
# * Partial-object `p[k]` and ref-head `p.q.r` COMBINE across disjoint keys/paths,
|
||||
# but conflict on the same key/leaf with a different value (no deep-merge).
|
||||
# * Equal re-definitions (same value twice) are tolerated in every family.
|
||||
|
||||
cases:
|
||||
# ----------------------------------------------------------------------------
|
||||
# Zero-arg functions: materialize as a complete document.
|
||||
# ----------------------------------------------------------------------------
|
||||
- note: fn_single_output
|
||||
data: {}
|
||||
modules:
|
||||
- |
|
||||
package test
|
||||
import rego.v1
|
||||
|
||||
f() := {"a": 1}
|
||||
query: data.test.f
|
||||
want_result:
|
||||
a: 1
|
||||
|
||||
- note: fn_identical_outputs_tolerated
|
||||
data: {}
|
||||
modules:
|
||||
- |
|
||||
package test
|
||||
import rego.v1
|
||||
|
||||
f() := {"a": 1}
|
||||
|
||||
f() := {"a": 1}
|
||||
query: data.test.f
|
||||
want_result:
|
||||
a: 1
|
||||
|
||||
- note: fn_toplevel_disjoint_conflict
|
||||
data: {}
|
||||
modules:
|
||||
- |
|
||||
package test
|
||||
import rego.v1
|
||||
|
||||
f() := {"a": 1}
|
||||
|
||||
f() := {"b": 2}
|
||||
query: data.test.f
|
||||
error: "rules should not produce multiple outputs"
|
||||
|
||||
- note: fn_nested_object_conflict_no_deep_merge
|
||||
data: {}
|
||||
modules:
|
||||
- |
|
||||
package test
|
||||
import rego.v1
|
||||
|
||||
f() := {"a": {"x": 1}}
|
||||
|
||||
f() := {"a": {"y": 2}}
|
||||
query: data.test.f
|
||||
error: "rules should not produce multiple outputs"
|
||||
|
||||
# ----------------------------------------------------------------------------
|
||||
# Partial-object rules with static keys: combine across disjoint keys.
|
||||
# ----------------------------------------------------------------------------
|
||||
- note: partial_object_disjoint_keys_combine
|
||||
data: {}
|
||||
modules:
|
||||
- |
|
||||
package test
|
||||
import rego.v1
|
||||
|
||||
p["a"] := 1
|
||||
|
||||
p["b"] := 2
|
||||
query: data.test.p
|
||||
want_result:
|
||||
a: 1
|
||||
b: 2
|
||||
|
||||
- note: partial_object_same_key_same_value_tolerated
|
||||
data: {}
|
||||
modules:
|
||||
- |
|
||||
package test
|
||||
import rego.v1
|
||||
|
||||
p["a"] := 1
|
||||
|
||||
p["a"] := 1
|
||||
query: data.test.p
|
||||
want_result:
|
||||
a: 1
|
||||
|
||||
- note: partial_object_same_key_diff_scalar_conflict
|
||||
data: {}
|
||||
modules:
|
||||
- |
|
||||
package test
|
||||
import rego.v1
|
||||
|
||||
p["a"] := 1
|
||||
|
||||
p["a"] := 2
|
||||
query: data.test.p
|
||||
error: "rule conflicts with the following rule"
|
||||
|
||||
- note: partial_object_same_key_object_values_conflict_no_deep_merge
|
||||
data: {}
|
||||
modules:
|
||||
- |
|
||||
package test
|
||||
import rego.v1
|
||||
|
||||
p["a"] := {"x": 1}
|
||||
|
||||
p["a"] := {"y": 2}
|
||||
query: data.test.p
|
||||
error: "rule conflicts with the following rule"
|
||||
|
||||
# ----------------------------------------------------------------------------
|
||||
# Ref-head rules: combine across disjoint sub-paths.
|
||||
# ----------------------------------------------------------------------------
|
||||
- note: refhead_disjoint_subpaths_combine
|
||||
data: {}
|
||||
modules:
|
||||
- |
|
||||
package test
|
||||
import rego.v1
|
||||
|
||||
p.q.r := 1
|
||||
|
||||
p.q.s := 2
|
||||
query: data.test.p
|
||||
want_result:
|
||||
q:
|
||||
r: 1
|
||||
s: 2
|
||||
|
||||
- note: refhead_same_leaf_diff_value_conflict
|
||||
data: {}
|
||||
modules:
|
||||
- |
|
||||
package test
|
||||
import rego.v1
|
||||
|
||||
p.q.r := 1
|
||||
|
||||
p.q.r := 2
|
||||
query: data.test.p
|
||||
error: "rule conflicts with the following rule"
|
||||
|
||||
- note: refhead_same_node_object_values_conflict_no_deep_merge
|
||||
data: {}
|
||||
modules:
|
||||
- |
|
||||
package test
|
||||
import rego.v1
|
||||
|
||||
p.q := {"r": 1}
|
||||
|
||||
p.q := {"s": 2}
|
||||
query: data.test.p
|
||||
error: "rule conflicts with the following rule"
|
||||
|
||||
# ----------------------------------------------------------------------------
|
||||
# Dynamic partial objects (keys computed at eval time).
|
||||
# ----------------------------------------------------------------------------
|
||||
- note: dynamic_partial_disjoint_keys_combine
|
||||
data: {}
|
||||
modules:
|
||||
- |
|
||||
package test
|
||||
import rego.v1
|
||||
|
||||
m := {"a": 1, "b": 2}
|
||||
|
||||
p[k] := v if {
|
||||
some k, v in m
|
||||
}
|
||||
query: data.test.p
|
||||
want_result:
|
||||
a: 1
|
||||
b: 2
|
||||
|
||||
- note: dynamic_partial_same_key_same_value_tolerated
|
||||
data: {}
|
||||
modules:
|
||||
- |
|
||||
package test
|
||||
import rego.v1
|
||||
|
||||
vals := [7, 7]
|
||||
|
||||
p[k] := v if {
|
||||
some v in vals
|
||||
k := "a"
|
||||
}
|
||||
query: data.test.p
|
||||
want_result:
|
||||
a: 7
|
||||
|
||||
- note: dynamic_partial_same_key_diff_value_conflict
|
||||
data: {}
|
||||
modules:
|
||||
- |
|
||||
package test
|
||||
import rego.v1
|
||||
|
||||
vals := [1, 2]
|
||||
|
||||
p[k] := v if {
|
||||
some v in vals
|
||||
k := "a"
|
||||
}
|
||||
query: data.test.p
|
||||
error: "rules must not produce multiple outputs"
|
||||
@@ -185,3 +185,75 @@ fn vm_memory_limit_during_large_allocation() {
|
||||
Ok(value) => panic!("expected VM memory limit error, got value {value:?}"),
|
||||
}
|
||||
}
|
||||
|
||||
/// On the `allocator-memory-limits` build, an `add_data` whose merge trips the memory limit
|
||||
/// mid-way must leave the data document unchanged — no partial insertions may leak. Atomicity
|
||||
/// here relies on the candidate-copy commit (`check_mergeable` models conflicts, not limits).
|
||||
#[test]
|
||||
fn add_data_memory_limit_partial_merge_is_atomic() {
|
||||
let mut guard = LimitGuard::lock();
|
||||
let mut engine = Engine::new();
|
||||
|
||||
// Seed existing data while the limit is relaxed.
|
||||
engine
|
||||
.add_data(Value::from_json_str(r#"{ "a": { "existing": 1 } }"#).expect("valid JSON"))
|
||||
.expect("seed add_data");
|
||||
|
||||
// Merge `{ "a": { "k0": 0, ... } }` into `a` as pure insertions. The count is sized to
|
||||
// beat the limit check's throttling — a check only fires every MEMORY_CHECK_STRIDE (16)
|
||||
// insertions or per MEMORY_CHECK_DELTA_BYTES (32 KiB), and mimalloc's usage snapshot lags
|
||||
// small allocations — so the trip lands mid-merge rather than after it completes.
|
||||
let elements = 20_000;
|
||||
let mut payload = String::with_capacity(elements * 16);
|
||||
payload.push_str("{\"a\":{");
|
||||
for i in 0..elements {
|
||||
if i > 0 {
|
||||
payload.push(',');
|
||||
}
|
||||
payload.push_str("\"k");
|
||||
payload.push_str(&i.to_string());
|
||||
payload.push_str("\":");
|
||||
payload.push_str(&i.to_string());
|
||||
}
|
||||
payload.push_str("}}");
|
||||
let big = Value::from_json_str(&payload).expect("valid JSON");
|
||||
|
||||
// What the engine must still hold if the add is rejected.
|
||||
let pristine = Value::from_json_str(r#"{ "a": { "existing": 1 } }"#).expect("valid JSON");
|
||||
|
||||
// Budget 0: the merge's insertions trip the limit mid-way.
|
||||
guard.set_with_additional_budget(0);
|
||||
|
||||
let err = engine
|
||||
.add_data(big)
|
||||
.expect_err("expected memory limit error during add_data merge");
|
||||
assert_memory_limit_error(&err);
|
||||
|
||||
// Atomicity: the rejected add must leave data untouched — no `k*` keys leaked.
|
||||
assert_eq!(engine.get_data(), pristine);
|
||||
}
|
||||
|
||||
/// Companion for the candidate-copy build: a *conflict* must also be atomic (the candidate is
|
||||
/// discarded before commit). Default-build conflict atomicity is covered in
|
||||
/// `src/tests/interpreter/mod.rs`; this exercises the distinct candidate-copy branch.
|
||||
#[test]
|
||||
fn add_data_conflict_is_atomic_on_allocator_build() {
|
||||
// Hold the lock (no budget set) so the conflict — not a limit — is the sole failure.
|
||||
let _guard = LimitGuard::lock();
|
||||
let mut engine = Engine::new();
|
||||
|
||||
engine
|
||||
.add_data(Value::from_json_str(r#"{ "a": { "z": 1 } }"#).expect("valid JSON"))
|
||||
.expect("seed add_data");
|
||||
|
||||
// `m` sorts before `z`, so a naive in-place merge inserts `m` then hits the `z` conflict
|
||||
// (1 vs 3). The whole call must be rejected with `m` left out.
|
||||
assert!(engine
|
||||
.add_data(Value::from_json_str(r#"{ "a": { "m": 2, "z": 3 } }"#).expect("valid JSON"))
|
||||
.is_err());
|
||||
|
||||
assert_eq!(
|
||||
engine.get_data(),
|
||||
Value::from_json_str(r#"{ "a": { "z": 1 } }"#).expect("valid JSON")
|
||||
);
|
||||
}
|
||||
|
||||
17
tests/opa.rs
17
tests/opa.rs
@@ -26,7 +26,6 @@ const OPA_TODO_FOLDERS: &[&str] = &[
|
||||
"baseandvirtualdocs",
|
||||
"dataderef",
|
||||
"defaultkeyword",
|
||||
"every",
|
||||
"fix1863",
|
||||
"functions",
|
||||
"partialdocconstants",
|
||||
@@ -102,6 +101,20 @@ fn log_rvm_skip(case_note: &str, folder_name: Option<&str>) {
|
||||
}
|
||||
}
|
||||
|
||||
/// Allows temporarily enabling RVM verification for folders otherwise listed in
|
||||
/// `OPA_TODO_FOLDERS`, without editing the source. Set `OPA_UNSKIP_FOLDERS` to a
|
||||
/// comma-separated list of folder names (e.g. `every,functions`) or `all`.
|
||||
/// Intended for auditing latent RVM bugs in currently-skipped constructs.
|
||||
fn folder_rvm_unskipped(folder: &str) -> bool {
|
||||
match std::env::var("OPA_UNSKIP_FOLDERS") {
|
||||
Ok(list) => {
|
||||
let list = list.trim();
|
||||
list.eq_ignore_ascii_case("all") || list.split(',').any(|f| f.trim() == folder)
|
||||
}
|
||||
Err(_) => false,
|
||||
}
|
||||
}
|
||||
|
||||
fn setup_engine_for_case(case: &TestCase, is_rego_v0_test: bool) -> Result<EngineSetup> {
|
||||
let mut engine = Engine::new();
|
||||
|
||||
@@ -388,7 +401,7 @@ fn run_opa_tests(opa_tests_dir: String, folders: &[String]) -> Result<()> {
|
||||
let folder_name = folder_name_from_path(path_dir);
|
||||
let skip_rvm_for_folder = folder_name
|
||||
.as_deref()
|
||||
.map(|folder| OPA_TODO_FOLDERS.contains(&folder))
|
||||
.map(|folder| OPA_TODO_FOLDERS.contains(&folder) && !folder_rvm_unskipped(folder))
|
||||
.unwrap_or(false);
|
||||
|
||||
if path.is_dir() {
|
||||
|
||||
@@ -315,3 +315,109 @@ cases:
|
||||
}
|
||||
query: data.test.main
|
||||
want_result: "/api/v1/users"
|
||||
|
||||
- note: keywords_in_refs/package_field
|
||||
data: {}
|
||||
input:
|
||||
v0:
|
||||
package:
|
||||
format: npm
|
||||
modules:
|
||||
- |
|
||||
package test
|
||||
allow := true if {
|
||||
input.v0.package.format == "npm"
|
||||
}
|
||||
query: data.test.allow
|
||||
want_result: true
|
||||
|
||||
- note: keywords_in_refs/multiple_keywords
|
||||
data: {}
|
||||
input:
|
||||
default:
|
||||
value: 42
|
||||
import:
|
||||
name: foo
|
||||
not:
|
||||
allowed: false
|
||||
with:
|
||||
config: ok
|
||||
modules:
|
||||
- |
|
||||
package test
|
||||
import rego.v1
|
||||
result if {
|
||||
input.default.value == 42
|
||||
input.import.name == "foo"
|
||||
input.not.allowed == false
|
||||
input.with.config == "ok"
|
||||
}
|
||||
query: data.test.result
|
||||
want_result: true
|
||||
|
||||
- note: keywords_in_refs/future_keywords_without_import
|
||||
data: {}
|
||||
input:
|
||||
if:
|
||||
flag: true
|
||||
in:
|
||||
value: member
|
||||
every:
|
||||
item: each
|
||||
contains:
|
||||
key: present
|
||||
modules:
|
||||
- |
|
||||
package test
|
||||
result := [input.if.flag, input.in.value, input.every.item, input.contains.key]
|
||||
query: data.test.result
|
||||
want_result: [true, "member", "each", "present"]
|
||||
|
||||
- note: keywords_in_refs/package_path_keywords
|
||||
data: {}
|
||||
modules:
|
||||
- |
|
||||
package words.if.default
|
||||
value := 7
|
||||
- |
|
||||
package test
|
||||
result := data.words.if.default.value
|
||||
query: data.test.result
|
||||
want_result: 7
|
||||
|
||||
- note: keywords_in_refs/import_path_keywords
|
||||
data:
|
||||
catalog:
|
||||
if:
|
||||
default:
|
||||
value: 99
|
||||
modules:
|
||||
- |
|
||||
package test
|
||||
import data.catalog.if.default as kw
|
||||
result := kw.value
|
||||
query: data.test.result
|
||||
want_result: 99
|
||||
|
||||
- note: keywords_in_refs/rule_head_keyword_path
|
||||
data: {}
|
||||
modules:
|
||||
- |
|
||||
package test
|
||||
policy.default.level := 3
|
||||
query: data.test.policy.default.level
|
||||
want_result: 3
|
||||
|
||||
- note: keywords_in_refs/mixed_dot_keyword_and_dynamic_bracket
|
||||
data: {}
|
||||
input:
|
||||
package:
|
||||
import:
|
||||
value: from_dynamic
|
||||
modules:
|
||||
- |
|
||||
package test
|
||||
segment := "import"
|
||||
result := input.package[segment].value
|
||||
query: data.test.result
|
||||
want_result: "from_dynamic"
|
||||
|
||||
@@ -44,6 +44,295 @@ cases:
|
||||
query: data.test.main
|
||||
want_result: true
|
||||
|
||||
- note: every_body_fails_for_one_element
|
||||
data: {}
|
||||
modules:
|
||||
- |
|
||||
package test
|
||||
main := result if {
|
||||
every x in [1, 2, 3] {
|
||||
x > 1
|
||||
}
|
||||
result := true
|
||||
}
|
||||
query: data.test.main
|
||||
want_result: "#undefined"
|
||||
|
||||
- note: every_body_fails_for_all_elements
|
||||
data: {}
|
||||
modules:
|
||||
- |
|
||||
package test
|
||||
main := result if {
|
||||
every x in [1, 2, 3] {
|
||||
x > 100
|
||||
}
|
||||
result := true
|
||||
}
|
||||
query: data.test.main
|
||||
want_result: "#undefined"
|
||||
|
||||
- note: every_used_directly_as_condition_false
|
||||
data: {}
|
||||
modules:
|
||||
- |
|
||||
package test
|
||||
allowed if {
|
||||
every x in [1, 2, 3] {
|
||||
x > 1
|
||||
}
|
||||
}
|
||||
main := allowed
|
||||
query: data.test.main
|
||||
want_result: "#undefined"
|
||||
|
||||
- note: every_used_directly_as_condition_true
|
||||
data: {}
|
||||
modules:
|
||||
- |
|
||||
package test
|
||||
allowed if {
|
||||
every x in [1, 2, 3] {
|
||||
x > 0
|
||||
}
|
||||
}
|
||||
main := allowed
|
||||
query: data.test.main
|
||||
want_result: true
|
||||
|
||||
- note: every_over_non_iterable_number_is_undefined
|
||||
data: {}
|
||||
modules:
|
||||
- |
|
||||
package test
|
||||
allowed if {
|
||||
every x in 42 {
|
||||
x > 1
|
||||
}
|
||||
}
|
||||
main := allowed
|
||||
query: data.test.main
|
||||
want_result: "#undefined"
|
||||
|
||||
- note: every_over_non_iterable_string_is_undefined
|
||||
data: {}
|
||||
modules:
|
||||
- |
|
||||
package test
|
||||
allowed if {
|
||||
every x in "hello" {
|
||||
x == x
|
||||
}
|
||||
}
|
||||
main := allowed
|
||||
query: data.test.main
|
||||
want_result: "#undefined"
|
||||
|
||||
- note: every_over_empty_array_is_vacuously_true
|
||||
data: {}
|
||||
modules:
|
||||
- |
|
||||
package test
|
||||
allowed if {
|
||||
every x in [] {
|
||||
x > 1
|
||||
}
|
||||
}
|
||||
main := allowed
|
||||
query: data.test.main
|
||||
want_result: true
|
||||
|
||||
- note: every_with_inner_some_matching_nothing_fails
|
||||
data: {}
|
||||
modules:
|
||||
- |
|
||||
package test
|
||||
allowed if {
|
||||
every c in [1, 2] {
|
||||
some x in []
|
||||
c == x
|
||||
}
|
||||
}
|
||||
main := allowed
|
||||
query: data.test.main
|
||||
want_result: "#undefined"
|
||||
|
||||
- note: every_with_inner_some_matching_succeeds
|
||||
data: {}
|
||||
modules:
|
||||
- |
|
||||
package test
|
||||
allowed if {
|
||||
every c in [1, 2] {
|
||||
some x in [1, 2, 3]
|
||||
c == x
|
||||
}
|
||||
}
|
||||
main := allowed
|
||||
query: data.test.main
|
||||
want_result: true
|
||||
|
||||
- note: every_with_hoisted_index_matching_nothing_fails
|
||||
data: {}
|
||||
modules:
|
||||
- |
|
||||
package test
|
||||
allowed if {
|
||||
every c in [1] {
|
||||
some i
|
||||
[2, 3][i] == c
|
||||
}
|
||||
}
|
||||
main := allowed
|
||||
query: data.test.main
|
||||
want_result: "#undefined"
|
||||
|
||||
- note: every_with_hoisted_index_matching_succeeds
|
||||
data: {}
|
||||
modules:
|
||||
- |
|
||||
package test
|
||||
allowed if {
|
||||
every c in [2, 3] {
|
||||
some i
|
||||
[1, 2, 3][i] == c
|
||||
}
|
||||
}
|
||||
main := allowed
|
||||
query: data.test.main
|
||||
want_result: true
|
||||
|
||||
- note: every_keyval_over_object_succeeds
|
||||
data: {}
|
||||
modules:
|
||||
- |
|
||||
package test
|
||||
allowed if {
|
||||
every k, v in {"a": 1, "b": 2} {
|
||||
v > 0
|
||||
}
|
||||
}
|
||||
main := allowed
|
||||
query: data.test.main
|
||||
want_result: true
|
||||
|
||||
- note: every_keyval_over_object_fails
|
||||
data: {}
|
||||
modules:
|
||||
- |
|
||||
package test
|
||||
allowed if {
|
||||
every k, v in {"a": 1, "b": 2} {
|
||||
v > 1
|
||||
}
|
||||
}
|
||||
main := allowed
|
||||
query: data.test.main
|
||||
want_result: "#undefined"
|
||||
|
||||
- note: every_over_set_domain_succeeds
|
||||
data: {}
|
||||
modules:
|
||||
- |
|
||||
package test
|
||||
allowed if {
|
||||
every x in {1, 2, 3} {
|
||||
x > 0
|
||||
}
|
||||
}
|
||||
main := allowed
|
||||
query: data.test.main
|
||||
want_result: true
|
||||
|
||||
- note: every_over_empty_object_is_vacuously_true
|
||||
data: {}
|
||||
modules:
|
||||
- |
|
||||
package test
|
||||
allowed if {
|
||||
every k, v in {} {
|
||||
v > 1
|
||||
}
|
||||
}
|
||||
main := allowed
|
||||
query: data.test.main
|
||||
want_result: true
|
||||
|
||||
- note: every_over_empty_set_is_vacuously_true
|
||||
data: {}
|
||||
modules:
|
||||
- |
|
||||
package test
|
||||
allowed if {
|
||||
every x in set() {
|
||||
x > 1
|
||||
}
|
||||
}
|
||||
main := allowed
|
||||
query: data.test.main
|
||||
want_result: true
|
||||
|
||||
- note: every_over_undefined_domain_is_undefined
|
||||
data: {}
|
||||
modules:
|
||||
- |
|
||||
package test
|
||||
allowed if {
|
||||
every x in input.missing {
|
||||
x > 0
|
||||
}
|
||||
}
|
||||
main := allowed
|
||||
query: data.test.main
|
||||
want_result: "#undefined"
|
||||
|
||||
- note: every_nested_inside_every_succeeds
|
||||
data: {}
|
||||
modules:
|
||||
- |
|
||||
package test
|
||||
allowed if {
|
||||
every row in [[1, 2], [3, 4]] {
|
||||
every c in row {
|
||||
c > 0
|
||||
}
|
||||
}
|
||||
}
|
||||
main := allowed
|
||||
query: data.test.main
|
||||
want_result: true
|
||||
|
||||
- note: every_nested_inside_every_fails
|
||||
data: {}
|
||||
modules:
|
||||
- |
|
||||
package test
|
||||
allowed if {
|
||||
every row in [[1, 2], [3, 0]] {
|
||||
every c in row {
|
||||
c > 0
|
||||
}
|
||||
}
|
||||
}
|
||||
main := allowed
|
||||
query: data.test.main
|
||||
want_result: "#undefined"
|
||||
|
||||
- note: every_with_outer_binding
|
||||
data: {}
|
||||
modules:
|
||||
- |
|
||||
package test
|
||||
allowed if {
|
||||
threshold := 5
|
||||
every x in [6, 7, 8] {
|
||||
x > threshold
|
||||
}
|
||||
}
|
||||
main := allowed
|
||||
query: data.test.main
|
||||
want_result: true
|
||||
|
||||
- note: simple_loop_test
|
||||
data: {}
|
||||
modules:
|
||||
|
||||
610
tests/rvm/rego/cases/registered_host_await.yaml
Normal file
610
tests/rvm/rego/cases/registered_host_await.yaml
Normal file
@@ -0,0 +1,610 @@
|
||||
cases:
|
||||
- note: registered_builtin_suspendable
|
||||
data: {}
|
||||
input:
|
||||
account_id: "acct-42"
|
||||
skip_interpreter: true
|
||||
execution_mode: suspendable
|
||||
host_await_builtins:
|
||||
- name: get_account
|
||||
arg_count: 1
|
||||
modules:
|
||||
- |
|
||||
package demo
|
||||
import rego.v1
|
||||
|
||||
allow if {
|
||||
account := get_account({"id": input.account_id})
|
||||
account.status == "active"
|
||||
}
|
||||
query: data.demo.allow
|
||||
host_await_responses_suspendable:
|
||||
- id: "get_account"
|
||||
args:
|
||||
id: "acct-42"
|
||||
value:
|
||||
status: "active"
|
||||
name: "Alice"
|
||||
want_result: true
|
||||
|
||||
- note: registered_builtin_run_to_completion
|
||||
data: {}
|
||||
input:
|
||||
lang: "es"
|
||||
skip_interpreter: true
|
||||
execution_mode: run-to-completion
|
||||
host_await_builtins:
|
||||
- name: translate
|
||||
arg_count: 1
|
||||
modules:
|
||||
- |
|
||||
package demo
|
||||
import rego.v1
|
||||
|
||||
greeting := msg if {
|
||||
msg := translate(input.lang)
|
||||
}
|
||||
query: data.demo.greeting
|
||||
host_await_responses:
|
||||
- id: "translate"
|
||||
value: "hola"
|
||||
want_result: "hola"
|
||||
|
||||
- note: registered_builtin_run_to_completion_rejects_args
|
||||
data: {}
|
||||
input:
|
||||
lang: "es"
|
||||
skip_interpreter: true
|
||||
execution_mode: run-to-completion
|
||||
# `args:` payload validation is only meaningful in suspendable mode, where
|
||||
# the harness sees each call's argument. In run-to-completion mode the VM
|
||||
# consumes pre-loaded responses internally, so an `args:` expectation can
|
||||
# never be checked. Rather than silently ignore it (which would let a case
|
||||
# "assert" a payload that is never verified), the harness rejects it.
|
||||
host_await_builtins:
|
||||
- name: translate
|
||||
arg_count: 1
|
||||
modules:
|
||||
- |
|
||||
package demo
|
||||
import rego.v1
|
||||
|
||||
greeting := msg if {
|
||||
msg := translate(input.lang)
|
||||
}
|
||||
query: data.demo.greeting
|
||||
host_await_responses:
|
||||
- id: "translate"
|
||||
args: "es"
|
||||
value: "hola"
|
||||
want_error: "not supported in run-to-completion mode"
|
||||
|
||||
- note: registered_builtin_multiple_names
|
||||
data: {}
|
||||
input:
|
||||
user_id: "user-7"
|
||||
skip_interpreter: true
|
||||
execution_mode: suspendable
|
||||
host_await_builtins:
|
||||
- name: lookup
|
||||
arg_count: 1
|
||||
- name: persist
|
||||
arg_count: 1
|
||||
modules:
|
||||
- |
|
||||
package demo
|
||||
import rego.v1
|
||||
|
||||
result := {"data": fetched, "stored": saved} if {
|
||||
fetched := lookup(input.user_id)
|
||||
saved := persist({"id": input.user_id, "action": "audit"})
|
||||
}
|
||||
query: data.demo.result
|
||||
host_await_responses_suspendable:
|
||||
- id: "lookup"
|
||||
args: "user-7"
|
||||
value:
|
||||
name: "Charlie"
|
||||
- id: "persist"
|
||||
args:
|
||||
id: "user-7"
|
||||
action: "audit"
|
||||
value: true
|
||||
want_result:
|
||||
data:
|
||||
name: "Charlie"
|
||||
stored: true
|
||||
|
||||
- note: registered_builtin_suspendable_queue
|
||||
data: {}
|
||||
input:
|
||||
items: ["alpha", "beta", "gamma"]
|
||||
skip_interpreter: true
|
||||
execution_mode: suspendable
|
||||
host_await_builtins:
|
||||
- name: enrich
|
||||
arg_count: 1
|
||||
modules:
|
||||
- |
|
||||
package demo
|
||||
import rego.v1
|
||||
|
||||
results := [r |
|
||||
item := input.items[_]
|
||||
r := enrich(item)
|
||||
]
|
||||
query: data.demo.results
|
||||
host_await_responses_suspendable:
|
||||
- id: "enrich"
|
||||
args: "alpha"
|
||||
value: "enriched-alpha"
|
||||
- id: "enrich"
|
||||
args: "beta"
|
||||
value: "enriched-beta"
|
||||
- id: "enrich"
|
||||
args: "gamma"
|
||||
value: "enriched-gamma"
|
||||
want_result: ["enriched-alpha", "enriched-beta", "enriched-gamma"]
|
||||
|
||||
- note: registered_builtin_shadows_user_function
|
||||
data: {}
|
||||
input:
|
||||
key: "test-key"
|
||||
skip_interpreter: true
|
||||
execution_mode: suspendable
|
||||
host_await_builtins:
|
||||
- name: resolve
|
||||
arg_count: 1
|
||||
modules:
|
||||
- |
|
||||
package demo
|
||||
import rego.v1
|
||||
|
||||
# This user-defined function should be shadowed by the registered builtin
|
||||
resolve(x) := {"local": true, "key": x}
|
||||
|
||||
result := resolve(input.key)
|
||||
query: data.demo.result
|
||||
host_await_responses_suspendable:
|
||||
- id: "resolve"
|
||||
args: "test-key"
|
||||
value: "from-host"
|
||||
# The registered builtin takes precedence — result is the host response, not the user function
|
||||
want_result: "from-host"
|
||||
|
||||
- note: registered_builtin_multi_arg_object_packing
|
||||
data: {}
|
||||
input:
|
||||
user: "alice"
|
||||
resource: "/api/data"
|
||||
skip_interpreter: true
|
||||
execution_mode: suspendable
|
||||
host_await_builtins:
|
||||
- name: check_access
|
||||
arg_count: 1
|
||||
modules:
|
||||
- |
|
||||
package demo
|
||||
import rego.v1
|
||||
|
||||
# Multi-value calls pack arguments into a single object
|
||||
allowed if {
|
||||
result := check_access({"user": input.user, "resource": input.resource})
|
||||
result.granted == true
|
||||
}
|
||||
query: data.demo.allowed
|
||||
host_await_responses_suspendable:
|
||||
- id: "check_access"
|
||||
args:
|
||||
user: "alice"
|
||||
resource: "/api/data"
|
||||
value:
|
||||
granted: true
|
||||
reason: "admin"
|
||||
want_result: true
|
||||
|
||||
- note: registered_builtin_rejects_arg_count_greater_than_one
|
||||
data: {}
|
||||
input:
|
||||
key: "k1"
|
||||
value: "v1"
|
||||
skip_interpreter: true
|
||||
execution_mode: suspendable
|
||||
host_await_builtins:
|
||||
- name: kv_store
|
||||
arg_count: 2
|
||||
modules:
|
||||
- |
|
||||
package demo
|
||||
import rego.v1
|
||||
|
||||
result := kv_store(input.key, input.value)
|
||||
query: data.demo.result
|
||||
# Registration fails with an error because arg_count must be 1.
|
||||
# Use object packing instead: kv_store({"key": input.key, "value": input.value})
|
||||
want_error: "arg_count == 1"
|
||||
|
||||
- note: registered_builtin_overrides_standard_builtin
|
||||
data: {}
|
||||
input:
|
||||
duration: "2h30m"
|
||||
skip_interpreter: true
|
||||
execution_mode: suspendable
|
||||
host_await_builtins:
|
||||
- name: time.parse_duration_ns
|
||||
arg_count: 1
|
||||
modules:
|
||||
- |
|
||||
package demo
|
||||
import rego.v1
|
||||
|
||||
# time.parse_duration_ns is a standard Rego builtin (1 arg, returns nanoseconds).
|
||||
# Registering it as a host-await builtin shadows the standard implementation.
|
||||
duration_ns := time.parse_duration_ns(input.duration)
|
||||
query: data.demo.duration_ns
|
||||
host_await_responses_suspendable:
|
||||
- id: "time.parse_duration_ns"
|
||||
args: "2h30m"
|
||||
value: 9000000000000
|
||||
# Host returns 9000000000000 (custom value) instead of the real parse result.
|
||||
# This proves the registered builtin shadows the standard one.
|
||||
want_result: 9000000000000
|
||||
|
||||
- note: registered_builtin_rejects_reserved_name
|
||||
data: {}
|
||||
input: {}
|
||||
skip_interpreter: true
|
||||
execution_mode: suspendable
|
||||
host_await_builtins:
|
||||
- name: __builtin_host_await
|
||||
arg_count: 1
|
||||
modules:
|
||||
- |
|
||||
package demo
|
||||
import rego.v1
|
||||
result := true
|
||||
query: data.demo.result
|
||||
# __builtin_host_await is a reserved name handled by the explicit code path;
|
||||
# registering it as a host-await builtin is rejected at compile time.
|
||||
want_error: "__builtin_host_await is a reserved name"
|
||||
|
||||
- note: registered_builtin_empty_list_is_noop
|
||||
data: {}
|
||||
input: {}
|
||||
skip_interpreter: true
|
||||
execution_mode: suspendable
|
||||
# Empty registration list: nothing is registered, the policy compiles
|
||||
# normally and no HostAwait machinery fires.
|
||||
host_await_builtins: []
|
||||
modules:
|
||||
- |
|
||||
package demo
|
||||
import rego.v1
|
||||
result := 42
|
||||
query: data.demo.result
|
||||
want_result: 42
|
||||
|
||||
- note: registered_builtin_rejects_duplicate_name
|
||||
data: {}
|
||||
input: {}
|
||||
skip_interpreter: true
|
||||
execution_mode: suspendable
|
||||
# Registering the same name twice is rejected (rather than silently
|
||||
# overwritten) so the host can't accidentally clobber its own registration.
|
||||
host_await_builtins:
|
||||
- name: lookup
|
||||
arg_count: 1
|
||||
- name: lookup
|
||||
arg_count: 1
|
||||
modules:
|
||||
- |
|
||||
package demo
|
||||
import rego.v1
|
||||
result := lookup("anything")
|
||||
query: data.demo.result
|
||||
want_error: "already registered"
|
||||
|
||||
- note: registered_builtin_rejects_empty_name
|
||||
data: {}
|
||||
input: {}
|
||||
skip_interpreter: true
|
||||
execution_mode: suspendable
|
||||
# The empty identifier is meaningless; reject at registration time.
|
||||
host_await_builtins:
|
||||
- name: ""
|
||||
arg_count: 1
|
||||
modules:
|
||||
- |
|
||||
package demo
|
||||
import rego.v1
|
||||
result := true
|
||||
query: data.demo.result
|
||||
want_error: "must not be empty"
|
||||
|
||||
- note: registered_builtin_rejects_whitespace_name
|
||||
data: {}
|
||||
input: {}
|
||||
skip_interpreter: true
|
||||
execution_mode: suspendable
|
||||
# Whitespace-only names are equivalent to empty for registration purposes.
|
||||
host_await_builtins:
|
||||
- name: " "
|
||||
arg_count: 1
|
||||
modules:
|
||||
- |
|
||||
package demo
|
||||
import rego.v1
|
||||
result := true
|
||||
query: data.demo.result
|
||||
want_error: "leading/trailing whitespace"
|
||||
|
||||
- note: registered_builtin_rejects_leading_whitespace_name
|
||||
data: {}
|
||||
input: {}
|
||||
skip_interpreter: true
|
||||
execution_mode: suspendable
|
||||
# Whitespace-padded names would never match the trimmed identifier produced
|
||||
# by the Rego parser, creating an unreachable registration. Reject at
|
||||
# registration time so misconfiguration is loud, not silent.
|
||||
host_await_builtins:
|
||||
- name: " lookup"
|
||||
arg_count: 1
|
||||
modules:
|
||||
- |
|
||||
package demo
|
||||
import rego.v1
|
||||
result := true
|
||||
query: data.demo.result
|
||||
want_error: "leading/trailing whitespace"
|
||||
|
||||
- note: registered_builtin_rejects_trailing_whitespace_name
|
||||
data: {}
|
||||
input: {}
|
||||
skip_interpreter: true
|
||||
execution_mode: suspendable
|
||||
host_await_builtins:
|
||||
- name: "lookup "
|
||||
arg_count: 1
|
||||
modules:
|
||||
- |
|
||||
package demo
|
||||
import rego.v1
|
||||
result := true
|
||||
query: data.demo.result
|
||||
want_error: "leading/trailing whitespace"
|
||||
|
||||
- note: registered_builtin_out_param_syntax
|
||||
data: {}
|
||||
input: {}
|
||||
skip_interpreter: true
|
||||
execution_mode: suspendable
|
||||
# Rego's "output-param" calling form: `f(in, out)` desugars to `f(in)`
|
||||
# with the return value unified with `out`. With a registered arg_count=1
|
||||
# builtin, only the first positional argument (input) reaches the host;
|
||||
# the second positional is the output binding, not a second host-await
|
||||
# argument. The host returns the response, which is then unified with the
|
||||
# output binding (here, `out`).
|
||||
host_await_builtins:
|
||||
- name: lookup
|
||||
arg_count: 1
|
||||
modules:
|
||||
- |
|
||||
package demo
|
||||
import rego.v1
|
||||
result := out if {
|
||||
lookup("ping", out)
|
||||
}
|
||||
query: data.demo.result
|
||||
host_await_responses_suspendable:
|
||||
- id: "lookup"
|
||||
args: "ping"
|
||||
value: "pong"
|
||||
want_result: "pong"
|
||||
|
||||
- note: registered_builtin_mixed_with_explicit_builtin_host_await
|
||||
data: {}
|
||||
input: {}
|
||||
skip_interpreter: true
|
||||
execution_mode: suspendable
|
||||
# Both invocation forms in the same policy. The explicit
|
||||
# __builtin_host_await call uses the user-supplied identifier ("kv_get"),
|
||||
# while the registered "lookup" name resolves to a HostAwait with the
|
||||
# registered identifier. Both are emitted as HostAwait instructions and
|
||||
# consume from their respective identifier queues.
|
||||
host_await_builtins:
|
||||
- name: lookup
|
||||
arg_count: 1
|
||||
modules:
|
||||
- |
|
||||
package demo
|
||||
import rego.v1
|
||||
registered_value := lookup("alpha")
|
||||
explicit_value := __builtin_host_await("beta", "kv_get")
|
||||
result := {
|
||||
"registered": registered_value,
|
||||
"explicit": explicit_value,
|
||||
}
|
||||
query: data.demo.result
|
||||
host_await_responses_suspendable:
|
||||
- id: "lookup"
|
||||
args: "alpha"
|
||||
value: "from_registered"
|
||||
- id: "kv_get"
|
||||
args: "beta"
|
||||
value: "from_explicit"
|
||||
want_result:
|
||||
registered: "from_registered"
|
||||
explicit: "from_explicit"
|
||||
|
||||
- note: registered_builtin_does_not_intercept_qualified_calls
|
||||
data: {}
|
||||
input:
|
||||
key: "alpha"
|
||||
skip_interpreter: true
|
||||
execution_mode: suspendable
|
||||
# Pins the documented FQN behavior: a registered name (`resolve`) only
|
||||
# intercepts the unqualified call form (`resolve(x)`) inside the
|
||||
# registering package. A package-qualified call (`data.other.resolve(x)`)
|
||||
# resolves through the normal user-defined function path. The other
|
||||
# package's `resolve` is invoked and returns its own value — the host
|
||||
# never sees the call. The test asserts both: the registered intercept
|
||||
# is consumed once (from the unqualified call), and the qualified call
|
||||
# returns the user-rule output without registering as a host-await.
|
||||
host_await_builtins:
|
||||
- name: resolve
|
||||
arg_count: 1
|
||||
modules:
|
||||
- |
|
||||
package other
|
||||
import rego.v1
|
||||
resolve(k) := result if {
|
||||
result := sprintf("user-rule-handled:%s", [k])
|
||||
}
|
||||
- |
|
||||
package demo
|
||||
import rego.v1
|
||||
intercepted := resolve(input.key)
|
||||
bypassed := data.other.resolve(input.key)
|
||||
result := {
|
||||
"intercepted": intercepted,
|
||||
"bypassed": bypassed,
|
||||
}
|
||||
query: data.demo.result
|
||||
host_await_responses_suspendable:
|
||||
- id: "resolve"
|
||||
args: "alpha"
|
||||
value: "from_host"
|
||||
want_result:
|
||||
intercepted: "from_host"
|
||||
bypassed: "user-rule-handled:alpha"
|
||||
|
||||
- note: registered_builtin_same_package_qualified_reaches_local_rule
|
||||
data: {}
|
||||
input:
|
||||
key: "alpha"
|
||||
skip_interpreter: true
|
||||
execution_mode: suspendable
|
||||
# When a registered name *also* exists as a rule in the registering
|
||||
# package, the bare call is intercepted (HostAwait) while the
|
||||
# same-package qualified call reaches the local rule. Registration is a
|
||||
# bare-name intercept only; the qualified path resolves as it normally
|
||||
# would. This gives a policy a deliberate escape hatch: register `resolve`
|
||||
# for host interception, yet still reach the local rule via
|
||||
# `data.demo.resolve` when the host should be bypassed.
|
||||
host_await_builtins:
|
||||
- name: resolve
|
||||
arg_count: 1
|
||||
modules:
|
||||
- |
|
||||
package demo
|
||||
import rego.v1
|
||||
resolve(k) := sprintf("local-rule:%s", [k])
|
||||
intercepted := resolve(input.key)
|
||||
bypassed := data.demo.resolve(input.key)
|
||||
result := {
|
||||
"intercepted": intercepted,
|
||||
"bypassed": bypassed,
|
||||
}
|
||||
query: data.demo.result
|
||||
host_await_responses_suspendable:
|
||||
- id: "resolve"
|
||||
args: "alpha"
|
||||
value: "from_host"
|
||||
want_result:
|
||||
intercepted: "from_host"
|
||||
bypassed: "local-rule:alpha"
|
||||
|
||||
- note: registered_builtin_shadows_standard_builtin_by_bare_name
|
||||
data: {}
|
||||
input: {}
|
||||
skip_interpreter: true
|
||||
execution_mode: suspendable
|
||||
# Registering a name that collides with a standard builtin (`count`)
|
||||
# intercepts the bare call form: `count([...])` compiles to a HostAwait
|
||||
# instead of invoking the built-in implementation. The qualified form
|
||||
# `data.demo.count([...])` has no meaning for a builtin (builtins are
|
||||
# callable only by bare name) and would fail to compile with
|
||||
# `Unknown function` whether or not `count` is registered, so it is not
|
||||
# exercised here.
|
||||
host_await_builtins:
|
||||
- name: count
|
||||
arg_count: 1
|
||||
modules:
|
||||
- |
|
||||
package demo
|
||||
import rego.v1
|
||||
result := count([10, 20, 30])
|
||||
query: data.demo.result
|
||||
host_await_responses_suspendable:
|
||||
- id: "count"
|
||||
args: [10, 20, 30]
|
||||
value: "from_host"
|
||||
want_result: "from_host"
|
||||
|
||||
- note: registered_builtin_qualified_unknown_function_when_no_rule
|
||||
data: {}
|
||||
input:
|
||||
key: "alpha"
|
||||
skip_interpreter: true
|
||||
execution_mode: suspendable
|
||||
# Registration is a bare-name intercept and creates no rule. A qualified
|
||||
# call to the registered name therefore has nothing to resolve to (no rule
|
||||
# exists at `data.demo.resolve`) and fails to compile with
|
||||
# `Unknown function` — the same outcome as without registration. Pins the
|
||||
# documented "otherwise compilation fails with Unknown function" case.
|
||||
host_await_builtins:
|
||||
- name: resolve
|
||||
arg_count: 1
|
||||
modules:
|
||||
- |
|
||||
package demo
|
||||
import rego.v1
|
||||
result := data.demo.resolve(input.key)
|
||||
query: data.demo.result
|
||||
want_error: "Unknown function"
|
||||
|
||||
- note: registered_builtin_qualified_builtin_name_is_unknown_function
|
||||
data: {}
|
||||
input: {}
|
||||
skip_interpreter: true
|
||||
execution_mode: suspendable
|
||||
# A standard builtin has no package-qualified form: `data.demo.count([...])`
|
||||
# fails with `Unknown function` whether or not `count` is registered as a
|
||||
# host-await builtin. Pins the parenthetical in the docs.
|
||||
host_await_builtins:
|
||||
- name: count
|
||||
arg_count: 1
|
||||
modules:
|
||||
- |
|
||||
package demo
|
||||
import rego.v1
|
||||
result := data.demo.count([10, 20, 30])
|
||||
query: data.demo.result
|
||||
want_error: "Unknown function"
|
||||
|
||||
- note: registered_builtin_suspendable_set_argument
|
||||
data: {}
|
||||
input: {}
|
||||
skip_interpreter: true
|
||||
execution_mode: suspendable
|
||||
# Regression pin for the host-await argument comparison: the policy passes
|
||||
# a *set* as the payload. The runtime argument is already a `Value::Set`,
|
||||
# and the expected `args` decodes (via the `set!` helper) to the same set.
|
||||
# The harness must compare them directly -- re-running `process_value` on the
|
||||
# runtime argument would bail with "unexpected set in value read from
|
||||
# json/yaml" and fail the case for the wrong reason.
|
||||
host_await_builtins:
|
||||
- name: lookup
|
||||
arg_count: 1
|
||||
modules:
|
||||
- |
|
||||
package demo
|
||||
import rego.v1
|
||||
result := lookup({1, 2, 3})
|
||||
query: data.demo.result
|
||||
host_await_responses_suspendable:
|
||||
- id: "lookup"
|
||||
args:
|
||||
set!: [1, 2, 3]
|
||||
value: "found"
|
||||
want_result: "found"
|
||||
@@ -41,6 +41,7 @@ struct TestCase {
|
||||
pub host_await_responses: Option<Vec<HostAwaitResponseSpec>>,
|
||||
pub host_await_responses_run_to_completion: Option<Vec<HostAwaitResponseSpec>>,
|
||||
pub host_await_responses_suspendable: Option<Vec<HostAwaitResponseSpec>>,
|
||||
pub host_await_builtins: Option<Vec<HostAwaitBuiltinSpec>>,
|
||||
}
|
||||
|
||||
fn default_strict() -> bool {
|
||||
@@ -55,14 +56,24 @@ struct YamlTest {
|
||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
|
||||
struct HostAwaitResponseSpec {
|
||||
pub id: Value,
|
||||
pub args: Option<Value>,
|
||||
pub value: Value,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
|
||||
struct HostAwaitBuiltinSpec {
|
||||
pub name: String,
|
||||
pub arg_count: usize,
|
||||
}
|
||||
|
||||
type HostAwaitResponseMap = BTreeMap<Value, VecDeque<(Option<Value>, Value)>>;
|
||||
|
||||
#[derive(Debug, Clone)]
|
||||
struct RvmExecutionOptions {
|
||||
execution_mode: ExecutionMode,
|
||||
host_await_responses_run_to_completion: Option<Vec<(Value, Vec<Value>)>>,
|
||||
host_await_responses_suspendable: Option<BTreeMap<Value, VecDeque<Value>>>,
|
||||
host_await_responses_suspendable: Option<HostAwaitResponseMap>,
|
||||
host_await_builtins: Option<Vec<(String, usize)>>,
|
||||
}
|
||||
|
||||
impl Default for RvmExecutionOptions {
|
||||
@@ -71,6 +82,7 @@ impl Default for RvmExecutionOptions {
|
||||
execution_mode: ExecutionMode::RunToCompletion,
|
||||
host_await_responses_run_to_completion: None,
|
||||
host_await_responses_suspendable: None,
|
||||
host_await_builtins: None,
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -82,12 +94,13 @@ fn render_program_listing(program: &Program) -> String {
|
||||
|
||||
fn build_host_await_response_map(
|
||||
responses: &[HostAwaitResponseSpec],
|
||||
) -> anyhow::Result<BTreeMap<Value, VecDeque<Value>>> {
|
||||
let mut map: BTreeMap<Value, VecDeque<Value>> = BTreeMap::new();
|
||||
) -> anyhow::Result<HostAwaitResponseMap> {
|
||||
let mut map: HostAwaitResponseMap = BTreeMap::new();
|
||||
for response in responses {
|
||||
let id = process_value(&response.id)?;
|
||||
let expected_args = response.args.as_ref().map(process_value).transpose()?;
|
||||
let value = process_value(&response.value)?;
|
||||
map.entry(id).or_default().push_back(value);
|
||||
map.entry(id).or_default().push_back((expected_args, value));
|
||||
}
|
||||
Ok(map)
|
||||
}
|
||||
@@ -95,10 +108,24 @@ fn build_host_await_response_map(
|
||||
fn build_host_await_response_vec(
|
||||
responses: &[HostAwaitResponseSpec],
|
||||
) -> anyhow::Result<Vec<(Value, Vec<Value>)>> {
|
||||
// Run-to-completion responses are pre-loaded into the VM, which consumes
|
||||
// them internally without surfacing each call's argument to the harness.
|
||||
// There is therefore no point at which an `args:` expectation could be
|
||||
// checked, so silently dropping it would let a case "assert" a payload
|
||||
// that is never verified. Reject `args:` up front instead, pointing the
|
||||
// author at suspendable mode where argument validation is supported.
|
||||
if let Some(response) = responses.iter().find(|response| response.args.is_some()) {
|
||||
return Err(anyhow::anyhow!(
|
||||
"`args:` payload validation is not supported in run-to-completion mode \
|
||||
(response for id {:?}); drop the `args:` field or move the case to \
|
||||
execution_mode: suspendable",
|
||||
response.id
|
||||
));
|
||||
}
|
||||
let map = build_host_await_response_map(responses)?;
|
||||
Ok(map
|
||||
.into_iter()
|
||||
.map(|(id, values)| (id, values.into_iter().collect()))
|
||||
.map(|(id, values)| (id, values.into_iter().map(|(_, output)| output).collect()))
|
||||
.collect())
|
||||
}
|
||||
|
||||
@@ -111,12 +138,20 @@ fn build_execution_options(case: &TestCase) -> anyhow::Result<RvmExecutionOption
|
||||
}
|
||||
};
|
||||
|
||||
let rtc_responses = case
|
||||
.host_await_responses_run_to_completion
|
||||
.as_ref()
|
||||
.or(case.host_await_responses.as_ref())
|
||||
.map(|responses| build_host_await_response_vec(responses))
|
||||
.transpose()?;
|
||||
// Only build the run-to-completion response vec when the case actually
|
||||
// runs in RTC mode. A suspendable case may legitimately use the shared
|
||||
// `host_await_responses` field with `args:` expectations (validated via
|
||||
// the suspendable map below); building the RTC vec for it would wrongly
|
||||
// trip the RTC-only `args:` rejection in `build_host_await_response_vec`.
|
||||
let rtc_responses = if execution_mode == ExecutionMode::RunToCompletion {
|
||||
case.host_await_responses_run_to_completion
|
||||
.as_ref()
|
||||
.or(case.host_await_responses.as_ref())
|
||||
.map(|responses| build_host_await_response_vec(responses))
|
||||
.transpose()?
|
||||
} else {
|
||||
None
|
||||
};
|
||||
|
||||
let suspendable_responses = case
|
||||
.host_await_responses_suspendable
|
||||
@@ -125,10 +160,18 @@ fn build_execution_options(case: &TestCase) -> anyhow::Result<RvmExecutionOption
|
||||
.map(|responses| build_host_await_response_map(responses))
|
||||
.transpose()?;
|
||||
|
||||
let ha_builtins = case.host_await_builtins.as_ref().map(|specs| {
|
||||
specs
|
||||
.iter()
|
||||
.map(|s| (s.name.clone(), s.arg_count))
|
||||
.collect()
|
||||
});
|
||||
|
||||
Ok(RvmExecutionOptions {
|
||||
execution_mode,
|
||||
host_await_responses_run_to_completion: rtc_responses,
|
||||
host_await_responses_suspendable: suspendable_responses,
|
||||
host_await_builtins: ha_builtins,
|
||||
})
|
||||
}
|
||||
|
||||
@@ -227,7 +270,13 @@ fn compile_and_run_rvm_with_all_entry_points(
|
||||
listing_out: &mut Option<String>,
|
||||
execution_options: &RvmExecutionOptions,
|
||||
) -> anyhow::Result<Vec<Value>> {
|
||||
let program = Compiler::compile_from_policy(compiled_policy, entry_points)?;
|
||||
let ha_builtins = execution_options
|
||||
.host_await_builtins
|
||||
.as_ref()
|
||||
.map(|b| b.iter().map(|(n, a)| (n.as_str(), *a)).collect::<Vec<_>>())
|
||||
.unwrap_or_default();
|
||||
let program =
|
||||
Compiler::compile_from_policy_with_host_await(compiled_policy, entry_points, &ha_builtins)?;
|
||||
|
||||
// Basic serialization sanity check keeps regressions visible in CI.
|
||||
test_round_trip_serialization(program.as_ref()).map_err(|e| anyhow::anyhow!(e))?;
|
||||
@@ -269,8 +318,12 @@ fn compile_and_run_rvm_with_all_entry_points(
|
||||
return Err(anyhow::anyhow!("{}", error));
|
||||
}
|
||||
ExecutionState::Suspended { reason, .. } => match reason {
|
||||
SuspendReason::HostAwait { identifier, .. } => {
|
||||
let response = suspendable_responses
|
||||
SuspendReason::HostAwait {
|
||||
identifier,
|
||||
argument,
|
||||
..
|
||||
} => {
|
||||
let (expected_args, response) = suspendable_responses
|
||||
.get_mut(identifier)
|
||||
.and_then(|queue| queue.pop_front())
|
||||
.ok_or_else(|| {
|
||||
@@ -279,6 +332,24 @@ fn compile_and_run_rvm_with_all_entry_points(
|
||||
identifier
|
||||
)
|
||||
})?;
|
||||
if let Some(expected) = expected_args {
|
||||
// `argument` is already a runtime `Value`; the
|
||||
// expected side has been through `process_value`
|
||||
// once at YAML decode time (see
|
||||
// `build_host_await_response_map`). Comparing
|
||||
// raw runtime values keeps fixture sentinels like
|
||||
// "#undefined" from coercing a runtime string
|
||||
// payload into a different shape, which would
|
||||
// otherwise let tests pass for the wrong reason.
|
||||
if argument != &expected {
|
||||
return Err(anyhow::anyhow!(
|
||||
"HostAwait argument mismatch for {:?}: expected {:?}, got {:?}",
|
||||
identifier,
|
||||
expected,
|
||||
argument
|
||||
));
|
||||
}
|
||||
}
|
||||
vm.resume(Some(response))?;
|
||||
}
|
||||
other => {
|
||||
@@ -365,7 +436,34 @@ fn yaml_test_impl(file: &str) -> Result<()> {
|
||||
Some(engine.eval_rule(case.query.clone()))
|
||||
};
|
||||
|
||||
let execution_options = build_execution_options(&case)?;
|
||||
let execution_options = match build_execution_options(&case) {
|
||||
Ok(options) => options,
|
||||
Err(options_error) => {
|
||||
// A malformed host-await fixture (e.g. an `args:` expectation on
|
||||
// a run-to-completion response, which can never be validated) is
|
||||
// reported here. Mirror the compilation-error handling below: if
|
||||
// the case expects an error, match it; otherwise fail hard.
|
||||
if let (None, Some(expected_error)) = (&case.want_result, &case.want_error) {
|
||||
let error_str = options_error.to_string();
|
||||
if error_str.contains(expected_error) {
|
||||
println!(
|
||||
"✓ Execution-options error matches expected for case '{}'",
|
||||
case.note
|
||||
);
|
||||
println!("passed");
|
||||
continue;
|
||||
}
|
||||
panic_with_listing!(
|
||||
&last_listing,
|
||||
&case.note,
|
||||
"Execution-options error does not match expected for case '{}':\nExpected: '{expected_error}'\nActual: '{error_str}'",
|
||||
case.note
|
||||
);
|
||||
}
|
||||
dump_rvm_listing(&case.note, &last_listing);
|
||||
return Err(options_error);
|
||||
}
|
||||
};
|
||||
|
||||
if let Err(compilation_error) = &compilation_result {
|
||||
if let (None, Some(expected_error)) = (&case.want_result, &case.want_error) {
|
||||
|
||||
Reference in New Issue
Block a user