feat!: Indexes for nodes in the AST (#414)

Indexes allow associating extra data with nodes in the AST
using an array and then quickly looking up the array to fetch
the extra data.

- Index eidx for expressions
- Index sidx for statements
- Index qidx for queries.

AST nodes are not cloneable. Therefore once a module is created,
it is not possible to accidentally create two nodes with the same
index inadvertently via clone.

Also added IndexChecker in debug builds. When a module is parsed,
it will assert that indexes have been constructed correctly.

AST Cleanup
- Make literal expressions (null, val, number, string etc) also structs
  to match all other expressions
- Merge True and False nodes into a single Bool node.

Also update dependencies.

Signed-off-by: Anand Krishnamoorthi <anakrish@microsoft.com>
This commit is contained in:
Anand Krishnamoorthi
2025-06-20 15:09:07 -05:00
committed by GitHub
parent 620f8a4547
commit 444b2970a1
35 changed files with 2015 additions and 586 deletions

166
Cargo.lock generated
View File

@@ -48,9 +48,9 @@ checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299"
[[package]]
name = "anstream"
version = "0.6.18"
version = "0.6.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b"
checksum = "301af1932e46185686725e0fad2f8f2aa7da69dd70bf6ecc44d6b703844a3933"
dependencies = [
"anstyle",
"anstyle-parse",
@@ -63,33 +63,33 @@ dependencies = [
[[package]]
name = "anstyle"
version = "1.0.10"
version = "1.0.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9"
checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd"
[[package]]
name = "anstyle-parse"
version = "0.2.6"
version = "0.2.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9"
checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2"
dependencies = [
"utf8parse",
]
[[package]]
name = "anstyle-query"
version = "1.1.2"
version = "1.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c"
checksum = "6c8bdeb6047d8983be085bab0ba1472e6dc604e7041dbf6fcd5e71523014fae9"
dependencies = [
"windows-sys",
]
[[package]]
name = "anstyle-wincon"
version = "3.0.8"
version = "3.0.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6680de5231bd6ee4c6191b8a1325daa282b415391ec9d3a37bd34f2060dc73fa"
checksum = "403f75924867bb1033c59fbf0797484329750cfbe3c4325cd33127941fabc882"
dependencies = [
"anstyle",
"once_cell_polyfill",
@@ -104,9 +104,9 @@ checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487"
[[package]]
name = "autocfg"
version = "1.4.0"
version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26"
checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
[[package]]
name = "base64"
@@ -153,15 +153,15 @@ dependencies = [
[[package]]
name = "bumpalo"
version = "3.17.0"
version = "3.18.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf"
checksum = "793db76d6187cd04dff33004d8e6c9cc4e05cd330500379d2394209271b4aeee"
[[package]]
name = "bytecount"
version = "0.6.8"
version = "0.6.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5ce89b21cab1437276d2650d57e971f9d548a2d9037cc231abdc0562b97498ce"
checksum = "175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e"
[[package]]
name = "cast"
@@ -171,18 +171,18 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5"
[[package]]
name = "cc"
version = "1.2.23"
version = "1.2.27"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5f4ac86a9e5bc1e2b3449ab9d7d3a6a405e3d1bb28d7b9be8614f55846ae3766"
checksum = "d487aa071b5f64da6f19a3e848e3578944b726ee5a4854b82172f02aa876bfdc"
dependencies = [
"shlex",
]
[[package]]
name = "cfg-if"
version = "1.0.0"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268"
[[package]]
name = "chrono"
@@ -248,9 +248,9 @@ dependencies = [
[[package]]
name = "clap"
version = "4.5.39"
version = "4.5.40"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fd60e63e9be68e5fb56422e397cf9baddded06dae1d2e523401542383bc72a9f"
checksum = "40b6887a1d8685cebccf115538db5c0efe625ccac9696ad45c409d96566e910f"
dependencies = [
"clap_builder",
"clap_derive",
@@ -258,9 +258,9 @@ dependencies = [
[[package]]
name = "clap_builder"
version = "4.5.39"
version = "4.5.40"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "89cc6392a1f72bbeb820d71f32108f61fdaf18bc526e1d23954168a67759ef51"
checksum = "e0c66c08ce9f0c698cbce5c0279d0bb6ac936d8674174fe48f736533b964f59e"
dependencies = [
"anstream",
"anstyle",
@@ -270,27 +270,27 @@ dependencies = [
[[package]]
name = "clap_derive"
version = "4.5.32"
version = "4.5.40"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "09176aae279615badda0765c0c0b3f6ed53f4709118af73cf4655d85d1530cd7"
checksum = "d2c7947ae4cc3d851207c1adb5b5e260ff0cca11446b1d6d1423788e442257ce"
dependencies = [
"heck",
"proc-macro2 1.0.95",
"quote 1.0.40",
"syn 2.0.101",
"syn 2.0.103",
]
[[package]]
name = "clap_lex"
version = "0.7.4"
version = "0.7.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6"
checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675"
[[package]]
name = "colorchoice"
version = "1.0.3"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990"
checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75"
[[package]]
name = "core-foundation-sys"
@@ -376,7 +376,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
dependencies = [
"proc-macro2 1.0.95",
"quote 1.0.40",
"syn 2.0.101",
"syn 2.0.103",
]
[[package]]
@@ -491,9 +491,9 @@ dependencies = [
[[package]]
name = "hashbrown"
version = "0.15.3"
version = "0.15.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3"
checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5"
[[package]]
name = "heck"
@@ -719,9 +719,9 @@ dependencies = [
[[package]]
name = "libc"
version = "0.2.172"
version = "0.2.174"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa"
checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776"
[[package]]
name = "litemap"
@@ -731,9 +731,9 @@ checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956"
[[package]]
name = "lock_api"
version = "0.4.12"
version = "0.4.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17"
checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765"
dependencies = [
"autocfg",
"scopeguard",
@@ -747,9 +747,9 @@ checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94"
[[package]]
name = "memchr"
version = "2.7.4"
version = "2.7.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0"
[[package]]
name = "msvc_spectre_libs"
@@ -869,20 +869,11 @@ version = "4.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "26995317201fa17f3656c36716aed4a7c81743a9634ac4c99c0eeda495db0cec"
[[package]]
name = "pad"
version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d2ad9b889f1b12e0b9ee24db044b5129150d5eada288edc800f789928dc8c0e3"
dependencies = [
"unicode-width",
]
[[package]]
name = "parking_lot"
version = "0.12.3"
version = "0.12.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27"
checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13"
dependencies = [
"lock_api",
"parking_lot_core",
@@ -890,9 +881,9 @@ dependencies = [
[[package]]
name = "parking_lot_core"
version = "0.9.10"
version = "0.9.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8"
checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5"
dependencies = [
"cfg-if",
"libc",
@@ -1002,12 +993,11 @@ dependencies = [
[[package]]
name = "prettydiff"
version = "0.8.0"
version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bf0668e945d7caa9b3e3a4cb360d7dd1f2613d62233f8846dbfb7ea3c3df0910"
checksum = "b9a475bdea0881b8c65eb81f91fe53187b8522352a701b919c5a2c8a2f262808"
dependencies = [
"owo-colors",
"pad",
]
[[package]]
@@ -1048,9 +1038,9 @@ dependencies = [
[[package]]
name = "r-efi"
version = "5.2.0"
version = "5.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5"
checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
[[package]]
name = "rand"
@@ -1118,9 +1108,9 @@ dependencies = [
[[package]]
name = "redox_syscall"
version = "0.5.12"
version = "0.5.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af"
checksum = "0d04b7d0ee6b4a0207a0a7adb104d23ecb0b47d6beae7152d0fa34b692b29fd6"
dependencies = [
"bitflags",
]
@@ -1142,7 +1132,7 @@ checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7"
dependencies = [
"proc-macro2 1.0.95",
"quote 1.0.40",
"syn 2.0.101",
"syn 2.0.103",
]
[[package]]
@@ -1255,7 +1245,7 @@ checksum = "d2ee4885492bb655bfa05d039cd9163eb8fe9f79ddebf00ca23a1637510c2fd2"
dependencies = [
"proc-macro2 1.0.95",
"quote 1.0.40",
"syn 2.0.101",
"syn 2.0.103",
]
[[package]]
@@ -1287,7 +1277,7 @@ checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00"
dependencies = [
"proc-macro2 1.0.95",
"quote 1.0.40",
"syn 2.0.101",
"syn 2.0.103",
]
[[package]]
@@ -1329,9 +1319,9 @@ checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d"
[[package]]
name = "smallvec"
version = "1.15.0"
version = "1.15.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9"
checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
[[package]]
name = "spin"
@@ -1364,9 +1354,9 @@ dependencies = [
[[package]]
name = "syn"
version = "2.0.101"
version = "2.0.103"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf"
checksum = "e4307e30089d6fd6aff212f2da3a1f9e32f3223b1f010fb09b7c95f90f3ca1e8"
dependencies = [
"proc-macro2 1.0.95",
"quote 1.0.40",
@@ -1381,7 +1371,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2"
dependencies = [
"proc-macro2 1.0.95",
"quote 1.0.40",
"syn 2.0.101",
"syn 2.0.103",
]
[[package]]
@@ -1422,12 +1412,6 @@ version = "1.0.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512"
[[package]]
name = "unicode-width"
version = "0.1.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af"
[[package]]
name = "unicode-xid"
version = "0.1.0"
@@ -1465,12 +1449,14 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
[[package]]
name = "uuid"
version = "1.16.0"
version = "1.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9"
checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d"
dependencies = [
"getrandom",
"js-sys",
"rand 0.9.1",
"wasm-bindgen",
]
[[package]]
@@ -1537,7 +1523,7 @@ dependencies = [
"log",
"proc-macro2 1.0.95",
"quote 1.0.40",
"syn 2.0.101",
"syn 2.0.103",
"wasm-bindgen-shared",
]
@@ -1559,7 +1545,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de"
dependencies = [
"proc-macro2 1.0.95",
"quote 1.0.40",
"syn 2.0.101",
"syn 2.0.103",
"wasm-bindgen-backend",
"wasm-bindgen-shared",
]
@@ -1613,7 +1599,7 @@ checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836"
dependencies = [
"proc-macro2 1.0.95",
"quote 1.0.40",
"syn 2.0.101",
"syn 2.0.103",
]
[[package]]
@@ -1624,14 +1610,14 @@ checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8"
dependencies = [
"proc-macro2 1.0.95",
"quote 1.0.40",
"syn 2.0.101",
"syn 2.0.103",
]
[[package]]
name = "windows-link"
version = "0.1.1"
version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38"
checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a"
[[package]]
name = "windows-result"
@@ -1759,28 +1745,28 @@ checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6"
dependencies = [
"proc-macro2 1.0.95",
"quote 1.0.40",
"syn 2.0.101",
"syn 2.0.103",
"synstructure",
]
[[package]]
name = "zerocopy"
version = "0.8.25"
version = "0.8.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb"
checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f"
dependencies = [
"zerocopy-derive",
]
[[package]]
name = "zerocopy-derive"
version = "0.8.25"
version = "0.8.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef"
checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181"
dependencies = [
"proc-macro2 1.0.95",
"quote 1.0.40",
"syn 2.0.101",
"syn 2.0.103",
]
[[package]]
@@ -1800,7 +1786,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502"
dependencies = [
"proc-macro2 1.0.95",
"quote 1.0.40",
"syn 2.0.101",
"syn 2.0.103",
"synstructure",
]
@@ -1834,5 +1820,5 @@ checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f"
dependencies = [
"proc-macro2 1.0.95",
"quote 1.0.40",
"syn 2.0.101",
"syn 2.0.103",
]

247
bindings/ffi/Cargo.lock generated
View File

@@ -42,9 +42,9 @@ dependencies = [
[[package]]
name = "anstream"
version = "0.6.18"
version = "0.6.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b"
checksum = "301af1932e46185686725e0fad2f8f2aa7da69dd70bf6ecc44d6b703844a3933"
dependencies = [
"anstyle",
"anstyle-parse",
@@ -57,37 +57,37 @@ dependencies = [
[[package]]
name = "anstyle"
version = "1.0.10"
version = "1.0.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9"
checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd"
[[package]]
name = "anstyle-parse"
version = "0.2.6"
version = "0.2.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9"
checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2"
dependencies = [
"utf8parse",
]
[[package]]
name = "anstyle-query"
version = "1.1.2"
version = "1.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c"
checksum = "6c8bdeb6047d8983be085bab0ba1472e6dc604e7041dbf6fcd5e71523014fae9"
dependencies = [
"windows-sys",
"windows-sys 0.59.0",
]
[[package]]
name = "anstyle-wincon"
version = "3.0.8"
version = "3.0.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6680de5231bd6ee4c6191b8a1325daa282b415391ec9d3a37bd34f2060dc73fa"
checksum = "403f75924867bb1033c59fbf0797484329750cfbe3c4325cd33127941fabc882"
dependencies = [
"anstyle",
"once_cell_polyfill",
"windows-sys",
"windows-sys 0.59.0",
]
[[package]]
@@ -98,9 +98,9 @@ checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487"
[[package]]
name = "autocfg"
version = "1.4.0"
version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26"
checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
[[package]]
name = "base64"
@@ -147,15 +147,15 @@ dependencies = [
[[package]]
name = "bumpalo"
version = "3.17.0"
version = "3.18.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf"
checksum = "793db76d6187cd04dff33004d8e6c9cc4e05cd330500379d2394209271b4aeee"
[[package]]
name = "bytecount"
version = "0.6.8"
version = "0.6.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5ce89b21cab1437276d2650d57e971f9d548a2d9037cc231abdc0562b97498ce"
checksum = "175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e"
[[package]]
name = "cbindgen"
@@ -178,18 +178,18 @@ dependencies = [
[[package]]
name = "cc"
version = "1.2.23"
version = "1.2.27"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5f4ac86a9e5bc1e2b3449ab9d7d3a6a405e3d1bb28d7b9be8614f55846ae3766"
checksum = "d487aa071b5f64da6f19a3e848e3578944b726ee5a4854b82172f02aa876bfdc"
dependencies = [
"shlex",
]
[[package]]
name = "cfg-if"
version = "1.0.0"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268"
[[package]]
name = "chrono"
@@ -228,18 +228,18 @@ dependencies = [
[[package]]
name = "clap"
version = "4.5.38"
version = "4.5.40"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ed93b9805f8ba930df42c2590f05453d5ec36cbb85d018868a5b24d31f6ac000"
checksum = "40b6887a1d8685cebccf115538db5c0efe625ccac9696ad45c409d96566e910f"
dependencies = [
"clap_builder",
]
[[package]]
name = "clap_builder"
version = "4.5.38"
version = "4.5.40"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "379026ff283facf611b0ea629334361c4211d1b12ee01024eec1591133b04120"
checksum = "e0c66c08ce9f0c698cbce5c0279d0bb6ac936d8674174fe48f736533b964f59e"
dependencies = [
"anstream",
"anstyle",
@@ -249,15 +249,15 @@ dependencies = [
[[package]]
name = "clap_lex"
version = "0.7.4"
version = "0.7.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6"
checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675"
[[package]]
name = "colorchoice"
version = "1.0.3"
version = "1.0.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990"
checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75"
[[package]]
name = "core-foundation-sys"
@@ -309,12 +309,12 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
[[package]]
name = "errno"
version = "0.3.12"
version = "0.3.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cea14ef9355e3beab063703aa9dab15afd25f0667c341310c1e5274bb1d0da18"
checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad"
dependencies = [
"libc",
"windows-sys",
"windows-sys 0.60.2",
]
[[package]]
@@ -390,9 +390,9 @@ dependencies = [
[[package]]
name = "hashbrown"
version = "0.15.3"
version = "0.15.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3"
checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5"
[[package]]
name = "heck"
@@ -597,9 +597,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
[[package]]
name = "libc"
version = "0.2.172"
version = "0.2.174"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa"
checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776"
[[package]]
name = "linux-raw-sys"
@@ -615,9 +615,9 @@ checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956"
[[package]]
name = "lock_api"
version = "0.4.12"
version = "0.4.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17"
checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765"
dependencies = [
"autocfg",
"scopeguard",
@@ -631,9 +631,9 @@ checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94"
[[package]]
name = "memchr"
version = "2.7.4"
version = "2.7.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0"
[[package]]
name = "msvc_spectre_libs"
@@ -743,9 +743,9 @@ checksum = "1a80800c0488c3a21695ea981a54918fbb37abf04f4d0720c453632255e2ff0e"
[[package]]
name = "parking_lot"
version = "0.12.3"
version = "0.12.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27"
checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13"
dependencies = [
"lock_api",
"parking_lot_core",
@@ -753,15 +753,15 @@ dependencies = [
[[package]]
name = "parking_lot_core"
version = "0.9.10"
version = "0.9.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8"
checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5"
dependencies = [
"cfg-if",
"libc",
"redox_syscall",
"smallvec",
"windows-targets",
"windows-targets 0.52.6",
]
[[package]]
@@ -855,9 +855,9 @@ dependencies = [
[[package]]
name = "r-efi"
version = "5.2.0"
version = "5.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5"
checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
[[package]]
name = "rand"
@@ -905,9 +905,9 @@ dependencies = [
[[package]]
name = "redox_syscall"
version = "0.5.12"
version = "0.5.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af"
checksum = "0d04b7d0ee6b4a0207a0a7adb104d23ecb0b47d6beae7152d0fa34b692b29fd6"
dependencies = [
"bitflags",
]
@@ -1019,7 +1019,7 @@ dependencies = [
"errno",
"libc",
"linux-raw-sys",
"windows-sys",
"windows-sys 0.59.0",
]
[[package]]
@@ -1100,9 +1100,9 @@ dependencies = [
[[package]]
name = "serde_spanned"
version = "0.6.8"
version = "0.6.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1"
checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3"
dependencies = [
"serde",
]
@@ -1134,9 +1134,9 @@ checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d"
[[package]]
name = "smallvec"
version = "1.15.0"
version = "1.15.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9"
checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
[[package]]
name = "stable_deref_trait"
@@ -1152,9 +1152,9 @@ checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
[[package]]
name = "syn"
version = "2.0.101"
version = "2.0.103"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf"
checksum = "e4307e30089d6fd6aff212f2da3a1f9e32f3223b1f010fb09b7c95f90f3ca1e8"
dependencies = [
"proc-macro2",
"quote",
@@ -1182,7 +1182,7 @@ dependencies = [
"getrandom",
"once_cell",
"rustix",
"windows-sys",
"windows-sys 0.59.0",
]
[[package]]
@@ -1197,9 +1197,9 @@ dependencies = [
[[package]]
name = "toml"
version = "0.8.22"
version = "0.8.23"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "05ae329d1f08c4d17a59bed7ff5b5a769d062e64a62d34a3261b219e62cd5aae"
checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362"
dependencies = [
"serde",
"serde_spanned",
@@ -1209,18 +1209,18 @@ dependencies = [
[[package]]
name = "toml_datetime"
version = "0.6.9"
version = "0.6.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3da5db5a963e24bc68be8b17b6fa82814bb22ee8660f192bb182771d498f09a3"
checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c"
dependencies = [
"serde",
]
[[package]]
name = "toml_edit"
version = "0.22.26"
version = "0.22.27"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e"
checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a"
dependencies = [
"indexmap",
"serde",
@@ -1232,9 +1232,9 @@ dependencies = [
[[package]]
name = "toml_write"
version = "0.1.1"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bfb942dfe1d8e29a7ee7fcbde5bd2b9a25fb89aa70caea2eba3bee836ff41076"
checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801"
[[package]]
name = "unicode-ident"
@@ -1273,12 +1273,14 @@ checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
[[package]]
name = "uuid"
version = "1.16.0"
version = "1.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9"
checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d"
dependencies = [
"getrandom",
"js-sys",
"rand 0.9.1",
"wasm-bindgen",
]
[[package]]
@@ -1408,9 +1410,9 @@ dependencies = [
[[package]]
name = "windows-link"
version = "0.1.1"
version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38"
checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a"
[[package]]
name = "windows-result"
@@ -1436,7 +1438,16 @@ version = "0.59.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b"
dependencies = [
"windows-targets",
"windows-targets 0.52.6",
]
[[package]]
name = "windows-sys"
version = "0.60.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb"
dependencies = [
"windows-targets 0.53.2",
]
[[package]]
@@ -1445,14 +1456,30 @@ version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973"
dependencies = [
"windows_aarch64_gnullvm",
"windows_aarch64_msvc",
"windows_i686_gnu",
"windows_i686_gnullvm",
"windows_i686_msvc",
"windows_x86_64_gnu",
"windows_x86_64_gnullvm",
"windows_x86_64_msvc",
"windows_aarch64_gnullvm 0.52.6",
"windows_aarch64_msvc 0.52.6",
"windows_i686_gnu 0.52.6",
"windows_i686_gnullvm 0.52.6",
"windows_i686_msvc 0.52.6",
"windows_x86_64_gnu 0.52.6",
"windows_x86_64_gnullvm 0.52.6",
"windows_x86_64_msvc 0.52.6",
]
[[package]]
name = "windows-targets"
version = "0.53.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c66f69fcc9ce11da9966ddb31a40968cad001c5bedeb5c2b82ede4253ab48aef"
dependencies = [
"windows_aarch64_gnullvm 0.53.0",
"windows_aarch64_msvc 0.53.0",
"windows_i686_gnu 0.53.0",
"windows_i686_gnullvm 0.53.0",
"windows_i686_msvc 0.53.0",
"windows_x86_64_gnu 0.53.0",
"windows_x86_64_gnullvm 0.53.0",
"windows_x86_64_msvc 0.53.0",
]
[[package]]
@@ -1461,42 +1488,84 @@ version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3"
[[package]]
name = "windows_aarch64_gnullvm"
version = "0.53.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764"
[[package]]
name = "windows_aarch64_msvc"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469"
[[package]]
name = "windows_aarch64_msvc"
version = "0.53.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c"
[[package]]
name = "windows_i686_gnu"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b"
[[package]]
name = "windows_i686_gnu"
version = "0.53.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3"
[[package]]
name = "windows_i686_gnullvm"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66"
[[package]]
name = "windows_i686_gnullvm"
version = "0.53.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11"
[[package]]
name = "windows_i686_msvc"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66"
[[package]]
name = "windows_i686_msvc"
version = "0.53.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d"
[[package]]
name = "windows_x86_64_gnu"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78"
[[package]]
name = "windows_x86_64_gnu"
version = "0.53.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba"
[[package]]
name = "windows_x86_64_gnullvm"
version = "0.52.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d"
[[package]]
name = "windows_x86_64_gnullvm"
version = "0.53.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57"
[[package]]
name = "windows_x86_64_msvc"
version = "0.52.6"
@@ -1504,10 +1573,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
[[package]]
name = "winnow"
version = "0.7.10"
name = "windows_x86_64_msvc"
version = "0.53.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c06928c8748d81b05c9be96aad92e1b6ff01833332f281e8cfca3be4b35fc9ec"
checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486"
[[package]]
name = "winnow"
version = "0.7.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "74c7b26e3480b707944fc872477815d29a8e429d2f93a1ce000f5fa84a15cbcd"
dependencies = [
"memchr",
]
@@ -1553,18 +1628,18 @@ dependencies = [
[[package]]
name = "zerocopy"
version = "0.8.25"
version = "0.8.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb"
checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f"
dependencies = [
"zerocopy-derive",
]
[[package]]
name = "zerocopy-derive"
version = "0.8.25"
version = "0.8.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef"
checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181"
dependencies = [
"proc-macro2",
"quote",

View File

@@ -48,9 +48,9 @@ checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487"
[[package]]
name = "autocfg"
version = "1.4.0"
version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26"
checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
[[package]]
name = "base64"
@@ -97,15 +97,15 @@ dependencies = [
[[package]]
name = "bumpalo"
version = "3.17.0"
version = "3.18.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf"
checksum = "793db76d6187cd04dff33004d8e6c9cc4e05cd330500379d2394209271b4aeee"
[[package]]
name = "bytecount"
version = "0.6.8"
version = "0.6.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5ce89b21cab1437276d2650d57e971f9d548a2d9037cc231abdc0562b97498ce"
checksum = "175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e"
[[package]]
name = "bytes"
@@ -115,9 +115,9 @@ checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a"
[[package]]
name = "cc"
version = "1.2.23"
version = "1.2.27"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5f4ac86a9e5bc1e2b3449ab9d7d3a6a405e3d1bb28d7b9be8614f55846ae3766"
checksum = "d487aa071b5f64da6f19a3e848e3578944b726ee5a4854b82172f02aa876bfdc"
dependencies = [
"shlex",
]
@@ -130,9 +130,9 @@ checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c"
[[package]]
name = "cfg-if"
version = "1.0.0"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268"
[[package]]
name = "chrono"
@@ -284,9 +284,9 @@ dependencies = [
[[package]]
name = "hashbrown"
version = "0.15.3"
version = "0.15.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3"
checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5"
[[package]]
name = "iana-time-zone"
@@ -501,9 +501,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
[[package]]
name = "libc"
version = "0.2.172"
version = "0.2.174"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa"
checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776"
[[package]]
name = "litemap"
@@ -513,9 +513,9 @@ checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956"
[[package]]
name = "lock_api"
version = "0.4.12"
version = "0.4.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17"
checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765"
dependencies = [
"autocfg",
"scopeguard",
@@ -529,9 +529,9 @@ checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94"
[[package]]
name = "memchr"
version = "2.7.4"
version = "2.7.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0"
[[package]]
name = "msvc_spectre_libs"
@@ -635,9 +635,9 @@ checksum = "1a80800c0488c3a21695ea981a54918fbb37abf04f4d0720c453632255e2ff0e"
[[package]]
name = "parking_lot"
version = "0.12.3"
version = "0.12.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27"
checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13"
dependencies = [
"lock_api",
"parking_lot_core",
@@ -645,9 +645,9 @@ dependencies = [
[[package]]
name = "parking_lot_core"
version = "0.9.10"
version = "0.9.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8"
checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5"
dependencies = [
"cfg-if",
"libc",
@@ -747,9 +747,9 @@ dependencies = [
[[package]]
name = "r-efi"
version = "5.2.0"
version = "5.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5"
checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
[[package]]
name = "rand"
@@ -797,9 +797,9 @@ dependencies = [
[[package]]
name = "redox_syscall"
version = "0.5.12"
version = "0.5.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af"
checksum = "0d04b7d0ee6b4a0207a0a7adb104d23ecb0b47d6beae7152d0fa34b692b29fd6"
dependencies = [
"bitflags",
]
@@ -1012,9 +1012,9 @@ checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d"
[[package]]
name = "smallvec"
version = "1.15.0"
version = "1.15.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9"
checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
[[package]]
name = "stable_deref_trait"
@@ -1024,9 +1024,9 @@ checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"
[[package]]
name = "syn"
version = "2.0.101"
version = "2.0.103"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf"
checksum = "e4307e30089d6fd6aff212f2da3a1f9e32f3223b1f010fb09b7c95f90f3ca1e8"
dependencies = [
"proc-macro2",
"quote",
@@ -1105,12 +1105,14 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
[[package]]
name = "uuid"
version = "1.16.0"
version = "1.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9"
checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d"
dependencies = [
"getrandom",
"js-sys",
"rand 0.9.1",
"wasm-bindgen",
]
[[package]]
@@ -1259,9 +1261,9 @@ dependencies = [
[[package]]
name = "windows-link"
version = "0.1.1"
version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38"
checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a"
[[package]]
name = "windows-result"
@@ -1461,18 +1463,18 @@ dependencies = [
[[package]]
name = "zerocopy"
version = "0.8.25"
version = "0.8.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb"
checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f"
dependencies = [
"zerocopy-derive",
]
[[package]]
name = "zerocopy-derive"
version = "0.8.25"
version = "0.8.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef"
checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181"
dependencies = [
"proc-macro2",
"quote",

View File

@@ -48,9 +48,9 @@ checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487"
[[package]]
name = "autocfg"
version = "1.4.0"
version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26"
checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
[[package]]
name = "base64"
@@ -97,30 +97,30 @@ dependencies = [
[[package]]
name = "bumpalo"
version = "3.17.0"
version = "3.18.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf"
checksum = "793db76d6187cd04dff33004d8e6c9cc4e05cd330500379d2394209271b4aeee"
[[package]]
name = "bytecount"
version = "0.6.8"
version = "0.6.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5ce89b21cab1437276d2650d57e971f9d548a2d9037cc231abdc0562b97498ce"
checksum = "175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e"
[[package]]
name = "cc"
version = "1.2.23"
version = "1.2.27"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5f4ac86a9e5bc1e2b3449ab9d7d3a6a405e3d1bb28d7b9be8614f55846ae3766"
checksum = "d487aa071b5f64da6f19a3e848e3578944b726ee5a4854b82172f02aa876bfdc"
dependencies = [
"shlex",
]
[[package]]
name = "cfg-if"
version = "1.0.0"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268"
[[package]]
name = "chrono"
@@ -262,9 +262,9 @@ dependencies = [
[[package]]
name = "hashbrown"
version = "0.15.3"
version = "0.15.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3"
checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5"
[[package]]
name = "heck"
@@ -469,9 +469,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
[[package]]
name = "libc"
version = "0.2.172"
version = "0.2.174"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa"
checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776"
[[package]]
name = "litemap"
@@ -481,9 +481,9 @@ checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956"
[[package]]
name = "lock_api"
version = "0.4.12"
version = "0.4.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17"
checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765"
dependencies = [
"autocfg",
"scopeguard",
@@ -497,9 +497,9 @@ checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94"
[[package]]
name = "memchr"
version = "2.7.4"
version = "2.7.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0"
[[package]]
name = "memoffset"
@@ -621,9 +621,9 @@ checksum = "1a80800c0488c3a21695ea981a54918fbb37abf04f4d0720c453632255e2ff0e"
[[package]]
name = "parking_lot"
version = "0.12.3"
version = "0.12.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27"
checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13"
dependencies = [
"lock_api",
"parking_lot_core",
@@ -631,9 +631,9 @@ dependencies = [
[[package]]
name = "parking_lot_core"
version = "0.9.10"
version = "0.9.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8"
checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5"
dependencies = [
"cfg-if",
"libc",
@@ -697,9 +697,9 @@ dependencies = [
[[package]]
name = "portable-atomic"
version = "1.11.0"
version = "1.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "350e9b48cbc6b0e028b0473b114454c6316e57336ee184ceab6e53f72c178b3e"
checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483"
[[package]]
name = "potential_utf"
@@ -803,9 +803,9 @@ dependencies = [
[[package]]
name = "r-efi"
version = "5.2.0"
version = "5.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5"
checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
[[package]]
name = "rand"
@@ -853,9 +853,9 @@ dependencies = [
[[package]]
name = "redox_syscall"
version = "0.5.12"
version = "0.5.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af"
checksum = "0d04b7d0ee6b4a0207a0a7adb104d23ecb0b47d6beae7152d0fa34b692b29fd6"
dependencies = [
"bitflags",
]
@@ -1060,9 +1060,9 @@ checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d"
[[package]]
name = "smallvec"
version = "1.15.0"
version = "1.15.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9"
checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
[[package]]
name = "stable_deref_trait"
@@ -1072,9 +1072,9 @@ checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"
[[package]]
name = "syn"
version = "2.0.101"
version = "2.0.103"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf"
checksum = "e4307e30089d6fd6aff212f2da3a1f9e32f3223b1f010fb09b7c95f90f3ca1e8"
dependencies = [
"proc-macro2",
"quote",
@@ -1145,12 +1145,14 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
[[package]]
name = "uuid"
version = "1.16.0"
version = "1.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9"
checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d"
dependencies = [
"getrandom",
"js-sys",
"rand 0.9.1",
"wasm-bindgen",
]
[[package]]
@@ -1280,9 +1282,9 @@ dependencies = [
[[package]]
name = "windows-link"
version = "0.1.1"
version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38"
checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a"
[[package]]
name = "windows-result"
@@ -1407,18 +1409,18 @@ dependencies = [
[[package]]
name = "zerocopy"
version = "0.8.25"
version = "0.8.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb"
checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f"
dependencies = [
"zerocopy-derive",
]
[[package]]
name = "zerocopy-derive"
version = "0.8.25"
version = "0.8.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef"
checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181"
dependencies = [
"proc-macro2",
"quote",

View File

@@ -48,9 +48,9 @@ checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487"
[[package]]
name = "autocfg"
version = "1.4.0"
version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26"
checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
[[package]]
name = "base64"
@@ -117,21 +117,21 @@ dependencies = [
[[package]]
name = "bumpalo"
version = "3.17.0"
version = "3.18.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf"
checksum = "793db76d6187cd04dff33004d8e6c9cc4e05cd330500379d2394209271b4aeee"
[[package]]
name = "bytecount"
version = "0.6.8"
version = "0.6.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5ce89b21cab1437276d2650d57e971f9d548a2d9037cc231abdc0562b97498ce"
checksum = "175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e"
[[package]]
name = "cc"
version = "1.2.23"
version = "1.2.27"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5f4ac86a9e5bc1e2b3449ab9d7d3a6a405e3d1bb28d7b9be8614f55846ae3766"
checksum = "d487aa071b5f64da6f19a3e848e3578944b726ee5a4854b82172f02aa876bfdc"
dependencies = [
"shlex",
]
@@ -147,9 +147,9 @@ dependencies = [
[[package]]
name = "cfg-if"
version = "1.0.0"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268"
[[package]]
name = "chrono"
@@ -314,9 +314,9 @@ dependencies = [
[[package]]
name = "hashbrown"
version = "0.15.3"
version = "0.15.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3"
checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5"
[[package]]
name = "iana-time-zone"
@@ -524,18 +524,18 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55"
[[package]]
name = "libc"
version = "0.2.172"
version = "0.2.174"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa"
checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776"
[[package]]
name = "libloading"
version = "0.8.7"
version = "0.8.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6a793df0d7afeac54f95b471d3af7f0d4fb975699f972341a4b76988d49cdf0c"
checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667"
dependencies = [
"cfg-if",
"windows-targets 0.53.0",
"windows-targets 0.53.2",
]
[[package]]
@@ -546,9 +546,9 @@ checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956"
[[package]]
name = "lock_api"
version = "0.4.12"
version = "0.4.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17"
checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765"
dependencies = [
"autocfg",
"scopeguard",
@@ -585,9 +585,9 @@ dependencies = [
[[package]]
name = "memchr"
version = "2.7.4"
version = "2.7.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0"
[[package]]
name = "minimal-lexical"
@@ -707,9 +707,9 @@ checksum = "1a80800c0488c3a21695ea981a54918fbb37abf04f4d0720c453632255e2ff0e"
[[package]]
name = "parking_lot"
version = "0.12.3"
version = "0.12.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27"
checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13"
dependencies = [
"lock_api",
"parking_lot_core",
@@ -717,9 +717,9 @@ dependencies = [
[[package]]
name = "parking_lot_core"
version = "0.9.10"
version = "0.9.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8"
checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5"
dependencies = [
"cfg-if",
"libc",
@@ -819,9 +819,9 @@ dependencies = [
[[package]]
name = "r-efi"
version = "5.2.0"
version = "5.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5"
checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
[[package]]
name = "rand"
@@ -869,18 +869,18 @@ dependencies = [
[[package]]
name = "rb-sys"
version = "0.9.115"
version = "0.9.116"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "99ca6726be0eca74687047fed7dcbc2d509571f3962e190c343ac1eb40e482b3"
checksum = "7059846f68396df83155779c75336ca24567741cb95256e6308c9fcc370e8dad"
dependencies = [
"rb-sys-build",
]
[[package]]
name = "rb-sys-build"
version = "0.9.115"
version = "0.9.116"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9f2390cfc87b7513656656faad6567291e581542d3ec41dd0a2bf381896e0880"
checksum = "ac217510df41b9ffc041573e68d7a02aaff770c49943c7494441c4b224b0ecd0"
dependencies = [
"bindgen",
"lazy_static",
@@ -899,9 +899,9 @@ checksum = "a35802679f07360454b418a5d1735c89716bde01d35b1560fc953c1415a0b3bb"
[[package]]
name = "redox_syscall"
version = "0.5.12"
version = "0.5.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af"
checksum = "0d04b7d0ee6b4a0207a0a7adb104d23ecb0b47d6beae7152d0fa34b692b29fd6"
dependencies = [
"bitflags",
]
@@ -1134,9 +1134,9 @@ checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d"
[[package]]
name = "smallvec"
version = "1.15.0"
version = "1.15.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9"
checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
[[package]]
name = "stable_deref_trait"
@@ -1146,9 +1146,9 @@ checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"
[[package]]
name = "syn"
version = "2.0.101"
version = "2.0.103"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf"
checksum = "e4307e30089d6fd6aff212f2da3a1f9e32f3223b1f010fb09b7c95f90f3ca1e8"
dependencies = [
"proc-macro2",
"quote",
@@ -1213,12 +1213,14 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
[[package]]
name = "uuid"
version = "1.16.0"
version = "1.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9"
checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d"
dependencies = [
"getrandom",
"js-sys",
"rand 0.9.1",
"wasm-bindgen",
]
[[package]]
@@ -1348,9 +1350,9 @@ dependencies = [
[[package]]
name = "windows-link"
version = "0.1.1"
version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38"
checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a"
[[package]]
name = "windows-result"
@@ -1388,9 +1390,9 @@ dependencies = [
[[package]]
name = "windows-targets"
version = "0.53.0"
version = "0.53.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b"
checksum = "c66f69fcc9ce11da9966ddb31a40968cad001c5bedeb5c2b82ede4253ab48aef"
dependencies = [
"windows_aarch64_gnullvm 0.53.0",
"windows_aarch64_msvc 0.53.0",
@@ -1539,18 +1541,18 @@ dependencies = [
[[package]]
name = "zerocopy"
version = "0.8.25"
version = "0.8.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb"
checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f"
dependencies = [
"zerocopy-derive",
]
[[package]]
name = "zerocopy-derive"
version = "0.8.25"
version = "0.8.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef"
checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181"
dependencies = [
"proc-macro2",
"quote",

View File

@@ -48,9 +48,9 @@ checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487"
[[package]]
name = "autocfg"
version = "1.4.0"
version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26"
checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
[[package]]
name = "base64"
@@ -97,30 +97,30 @@ dependencies = [
[[package]]
name = "bumpalo"
version = "3.17.0"
version = "3.18.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf"
checksum = "793db76d6187cd04dff33004d8e6c9cc4e05cd330500379d2394209271b4aeee"
[[package]]
name = "bytecount"
version = "0.6.8"
version = "0.6.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5ce89b21cab1437276d2650d57e971f9d548a2d9037cc231abdc0562b97498ce"
checksum = "175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e"
[[package]]
name = "cc"
version = "1.2.23"
version = "1.2.27"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5f4ac86a9e5bc1e2b3449ab9d7d3a6a405e3d1bb28d7b9be8614f55846ae3766"
checksum = "d487aa071b5f64da6f19a3e848e3578944b726ee5a4854b82172f02aa876bfdc"
dependencies = [
"shlex",
]
[[package]]
name = "cfg-if"
version = "1.0.0"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268"
[[package]]
name = "chrono"
@@ -245,7 +245,7 @@ dependencies = [
"cfg-if",
"js-sys",
"libc",
"wasi 0.11.0+wasi-snapshot-preview1",
"wasi 0.11.1+wasi-snapshot-preview1",
"wasm-bindgen",
]
@@ -277,9 +277,9 @@ dependencies = [
[[package]]
name = "hashbrown"
version = "0.15.3"
version = "0.15.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3"
checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5"
[[package]]
name = "iana-time-zone"
@@ -472,9 +472,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
[[package]]
name = "libc"
version = "0.2.172"
version = "0.2.174"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa"
checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776"
[[package]]
name = "litemap"
@@ -484,9 +484,9 @@ checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956"
[[package]]
name = "lock_api"
version = "0.4.12"
version = "0.4.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17"
checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765"
dependencies = [
"autocfg",
"scopeguard",
@@ -500,9 +500,9 @@ checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94"
[[package]]
name = "memchr"
version = "2.7.4"
version = "2.7.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0"
[[package]]
name = "minicov"
@@ -616,9 +616,9 @@ checksum = "1a80800c0488c3a21695ea981a54918fbb37abf04f4d0720c453632255e2ff0e"
[[package]]
name = "parking_lot"
version = "0.12.3"
version = "0.12.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27"
checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13"
dependencies = [
"lock_api",
"parking_lot_core",
@@ -626,9 +626,9 @@ dependencies = [
[[package]]
name = "parking_lot_core"
version = "0.9.10"
version = "0.9.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8"
checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5"
dependencies = [
"cfg-if",
"libc",
@@ -728,9 +728,9 @@ dependencies = [
[[package]]
name = "r-efi"
version = "5.2.0"
version = "5.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5"
checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f"
[[package]]
name = "rand"
@@ -778,9 +778,9 @@ dependencies = [
[[package]]
name = "redox_syscall"
version = "0.5.12"
version = "0.5.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af"
checksum = "0d04b7d0ee6b4a0207a0a7adb104d23ecb0b47d6beae7152d0fa34b692b29fd6"
dependencies = [
"bitflags",
]
@@ -996,9 +996,9 @@ checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d"
[[package]]
name = "smallvec"
version = "1.15.0"
version = "1.15.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9"
checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
[[package]]
name = "stable_deref_trait"
@@ -1008,9 +1008,9 @@ checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"
[[package]]
name = "syn"
version = "2.0.101"
version = "2.0.103"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf"
checksum = "e4307e30089d6fd6aff212f2da3a1f9e32f3223b1f010fb09b7c95f90f3ca1e8"
dependencies = [
"proc-macro2",
"quote",
@@ -1069,9 +1069,9 @@ checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
[[package]]
name = "uuid"
version = "1.16.0"
version = "1.17.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9"
checksum = "3cf4199d1e5d15ddd86a694e4d0dffa9c323ce759fea589f00fef9d81cc1931d"
dependencies = [
"getrandom 0.3.3",
"js-sys",
@@ -1114,9 +1114,9 @@ dependencies = [
[[package]]
name = "wasi"
version = "0.11.0+wasi-snapshot-preview1"
version = "0.11.1+wasi-snapshot-preview1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b"
[[package]]
name = "wasi"
@@ -1278,9 +1278,9 @@ dependencies = [
[[package]]
name = "windows-link"
version = "0.1.1"
version = "0.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38"
checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a"
[[package]]
name = "windows-result"
@@ -1414,18 +1414,18 @@ dependencies = [
[[package]]
name = "zerocopy"
version = "0.8.25"
version = "0.8.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb"
checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f"
dependencies = [
"zerocopy-derive",
]
[[package]]
name = "zerocopy-derive"
version = "0.8.25"
version = "0.8.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef"
checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181"
dependencies = [
"proc-macro2",
"quote",

View File

@@ -26,5 +26,7 @@ fn main() -> Result<()> {
println!("cargo:rustc-env=GIT_HASH={}", git_hash);
}
// Rerun only if build.rs changes.
println!("cargo:rerun-if-changed=build.rs");
Ok(())
}

View File

@@ -106,29 +106,60 @@ pub type Ref<T> = NodeRef<T>;
#[cfg_attr(feature = "ast", derive(serde::Serialize))]
pub enum Expr {
// Simple items that only have a span as content.
String((Span, Value)),
RawString((Span, Value)),
Number((Span, Value)),
True(Span),
False(Span),
Null(Span),
Var((Span, Value)),
String {
span: Span,
value: Value,
eidx: u32,
},
RawString {
span: Span,
value: Value,
eidx: u32,
},
Number {
span: Span,
value: Value,
eidx: u32,
},
Bool {
span: Span,
value: Value,
eidx: u32,
},
Null {
span: Span,
value: Value,
eidx: u32,
},
Var {
span: Span,
value: Value,
eidx: u32,
},
// array
Array {
span: Span,
items: Vec<Ref<Expr>>,
eidx: u32,
},
// set
Set {
span: Span,
items: Vec<Ref<Expr>>,
eidx: u32,
},
Object {
span: Span,
fields: Vec<(Span, Ref<Expr>, Ref<Expr>)>,
eidx: u32,
},
// Comprehensions
@@ -136,12 +167,14 @@ pub enum Expr {
span: Span,
term: Ref<Expr>,
query: Ref<Query>,
eidx: u32,
},
SetCompr {
span: Span,
term: Ref<Expr>,
query: Ref<Query>,
eidx: u32,
},
ObjectCompr {
@@ -149,17 +182,20 @@ pub enum Expr {
key: Ref<Expr>,
value: Ref<Expr>,
query: Ref<Query>,
eidx: u32,
},
Call {
span: Span,
fcn: Ref<Expr>,
params: Vec<Ref<Expr>>,
eidx: u32,
},
UnaryExpr {
span: Span,
expr: Ref<Expr>,
eidx: u32,
},
// ref
@@ -167,12 +203,14 @@ pub enum Expr {
span: Span,
refr: Ref<Expr>,
field: (Span, Value),
eidx: u32,
},
RefBrack {
span: Span,
refr: Ref<Expr>,
index: Ref<Expr>,
eidx: u32,
},
// Infix expressions
@@ -181,12 +219,15 @@ pub enum Expr {
op: BinOp,
lhs: Ref<Expr>,
rhs: Ref<Expr>,
eidx: u32,
},
BoolExpr {
span: Span,
op: BoolOp,
lhs: Ref<Expr>,
rhs: Ref<Expr>,
eidx: u32,
},
ArithExpr {
@@ -194,6 +235,7 @@ pub enum Expr {
op: ArithOp,
lhs: Ref<Expr>,
rhs: Ref<Expr>,
eidx: u32,
},
AssignExpr {
@@ -201,6 +243,7 @@ pub enum Expr {
op: AssignOp,
lhs: Ref<Expr>,
rhs: Ref<Expr>,
eidx: u32,
},
Membership {
@@ -208,6 +251,7 @@ pub enum Expr {
key: Option<Ref<Expr>>,
value: Ref<Expr>,
collection: Ref<Expr>,
eidx: u32,
},
#[cfg(feature = "rego-extensions")]
@@ -215,6 +259,7 @@ pub enum Expr {
span: Span,
lhs: Ref<Expr>,
rhs: Ref<Expr>,
eidx: u32,
},
}
@@ -222,9 +267,13 @@ impl Expr {
pub fn span(&self) -> &Span {
use Expr::*;
match self {
String(s) | RawString(s) | Number(s) | Var(s) => &s.0,
True(s) | False(s) | Null(s) => s,
Array { span, .. }
String { span, .. }
| RawString { span, .. }
| Number { span, .. }
| Bool { span, .. }
| Null { span, .. }
| Var { span, .. }
| Array { span, .. }
| Set { span, .. }
| Object { span, .. }
| ArrayCompr { span, .. }
@@ -243,6 +292,35 @@ impl Expr {
OrExpr { span, .. } => span,
}
}
pub fn eidx(&self) -> u32 {
use Expr::*;
match self {
String { eidx, .. }
| RawString { eidx, .. }
| Number { eidx, .. }
| Bool { eidx, .. }
| Null { eidx, .. }
| Var { eidx, .. }
| Array { eidx, .. }
| Set { eidx, .. }
| Object { eidx, .. }
| ArrayCompr { eidx, .. }
| SetCompr { eidx, .. }
| ObjectCompr { eidx, .. }
| Call { eidx, .. }
| UnaryExpr { eidx, .. }
| RefDot { eidx, .. }
| RefBrack { eidx, .. }
| BinExpr { eidx, .. }
| BoolExpr { eidx, .. }
| ArithExpr { eidx, .. }
| AssignExpr { eidx, .. }
| Membership { eidx, .. } => *eidx,
#[cfg(feature = "rego-extensions")]
OrExpr { eidx, .. } => *eidx,
}
}
}
#[derive(Debug)]
@@ -290,6 +368,7 @@ pub struct LiteralStmt {
pub literal: Literal,
#[cfg_attr(feature = "ast", serde(skip_serializing_if = "Vec::is_empty"))]
pub with_mods: Vec<WithModifier>,
pub sidx: u32,
}
#[derive(Debug)]
@@ -297,6 +376,7 @@ pub struct LiteralStmt {
pub struct Query {
pub span: Span,
pub stmts: Vec<LiteralStmt>,
pub qidx: u32,
}
#[derive(Debug)]
@@ -385,6 +465,12 @@ pub struct Module {
#[cfg_attr(feature = "ast", serde(rename(serialize = "rules")))]
pub policy: Vec<Ref<Rule>>,
pub rego_v1: bool,
// Number of expressions in the module.
pub num_expressions: u32,
// Number of statements in the module.
pub num_statements: u32,
// Number of queries in the module.
pub num_queries: u32,
}
pub type ExprRef = Ref<Expr>;

281
src/indexchecker.rs Normal file
View File

@@ -0,0 +1,281 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
#![cfg(debug_assertions)]
use crate::ast::*;
use alloc::collections::BTreeSet;
use alloc::format;
use anyhow::{bail, Result};
// Ensures that indexes are unique and continuous, starting from 0.
#[derive(Default)]
pub struct IndexChecker {
eidx: BTreeSet<u32>,
sidx: BTreeSet<u32>,
qidx: BTreeSet<u32>,
}
#[cfg(debug_assertions)]
impl IndexChecker {
fn check_query(&mut self, query: &Query) -> Result<()> {
let qidx = query.qidx;
if !self.qidx.insert(qidx) {
bail!(query
.span
.error(format!("query with qidx {qidx} already exists").as_str()));
}
for stmt in &query.stmts {
if !self.sidx.insert(stmt.sidx) {
bail!(stmt
.span
.error(format!("statement with sidx {} already exists", stmt.sidx).as_str()));
}
match &stmt.literal {
Literal::Every { domain, query, .. } => {
self.check_eidx(domain)?;
self.check_query(query.as_ref())?;
}
Literal::SomeVars { .. } => (),
Literal::Expr { expr, .. } => self.check_eidx(expr.as_ref())?,
Literal::SomeIn {
key,
value,
collection,
..
} => {
if let Some(key) = key {
self.check_eidx(key.as_ref())?;
}
self.check_eidx(value.as_ref())?;
self.check_eidx(collection.as_ref())?;
}
Literal::NotExpr { expr, .. } => {
self.check_eidx(expr.as_ref())?;
}
}
for with_mod in &stmt.with_mods {
self.check_eidx(with_mod.refr.as_ref())?;
self.check_eidx(with_mod.r#as.as_ref())?;
}
}
Ok(())
}
fn check_eidx(&mut self, expr: &Expr) -> Result<()> {
use Expr::*;
let eidx = expr.eidx();
if !self.eidx.insert(eidx) {
bail!(expr
.span()
.error(format!("expression with eidx {eidx} already exists").as_str()));
}
match expr {
String { .. }
| RawString { .. }
| Number { .. }
| Bool { .. }
| Null { .. }
| Var { .. } => (),
Array { items, .. } => {
for elem in items {
self.check_eidx(elem.as_ref())?;
}
}
Set { items, .. } => {
for elem in items {
self.check_eidx(elem.as_ref())?;
}
}
Object { fields, .. } => {
for pair in fields {
self.check_eidx(pair.1.as_ref())?;
self.check_eidx(pair.2.as_ref())?;
}
}
ArrayCompr { term, query, .. } => {
self.check_eidx(term.as_ref())?;
self.check_query(query.as_ref())?;
}
SetCompr { term, query, .. } => {
self.check_eidx(term.as_ref())?;
self.check_query(query.as_ref())?;
}
ObjectCompr {
key, value, query, ..
} => {
self.check_eidx(key.as_ref())?;
self.check_eidx(value.as_ref())?;
self.check_query(query.as_ref())?;
}
Call { fcn, params, .. } => {
self.check_eidx(fcn.as_ref())?;
for param in params {
self.check_eidx(param.as_ref())?;
}
}
UnaryExpr { expr, .. } => {
self.check_eidx(expr.as_ref())?;
}
RefBrack { refr, index, .. } => {
self.check_eidx(refr.as_ref())?;
self.check_eidx(index.as_ref())?;
}
RefDot { refr, .. } => {
self.check_eidx(refr.as_ref())?;
}
BinExpr { lhs, rhs, .. }
| BoolExpr { lhs, rhs, .. }
| ArithExpr { lhs, rhs, .. }
| AssignExpr { lhs, rhs, .. } => {
self.check_eidx(lhs.as_ref())?;
self.check_eidx(rhs.as_ref())?;
}
Membership {
key,
value,
collection,
..
} => {
if let Some(key) = key {
self.check_eidx(key.as_ref())?;
}
self.check_eidx(value.as_ref())?;
self.check_eidx(collection.as_ref())?;
}
#[cfg(feature = "rego-extensions")]
OrExpr { lhs, rhs, .. } => {
self.check_eidx(lhs.as_ref())?;
self.check_eidx(rhs.as_ref())?;
}
}
Ok(())
}
fn check_rule_assign(&mut self, assign: &RuleAssign) -> Result<()> {
self.check_eidx(&assign.value)
}
fn check_rule_body(&mut self, body: &RuleBody) -> Result<()> {
if let Some(assign) = &body.assign {
self.check_rule_assign(assign)?;
}
self.check_query(&body.query)
}
fn check_rule_heade(&mut self, head: &RuleHead) -> Result<()> {
match head {
RuleHead::Compr { refr, assign, .. } => {
self.check_eidx(refr.as_ref())?;
if let Some(assign) = assign {
self.check_rule_assign(assign)?;
}
}
RuleHead::Func {
refr, args, assign, ..
} => {
self.check_eidx(refr.as_ref())?;
if let Some(assign) = assign {
self.check_rule_assign(assign)?;
}
for arg in args {
self.check_eidx(arg.as_ref())?;
}
}
RuleHead::Set { refr, key, .. } => {
self.check_eidx(refr.as_ref())?;
if let Some(key) = key {
self.check_eidx(key.as_ref())?;
}
}
}
Ok(())
}
fn check_gathered_indexes(
&self,
num_idx: u32,
idx_set: &BTreeSet<u32>,
idx_type: &str,
) -> Result<()> {
if num_idx == 0 {
if !idx_set.is_empty() {
bail!("no {idx_type} indexes should be collected when num_{idx_type}s is 0");
}
return Ok(());
}
if idx_set
.first()
.unwrap_or_else(|| panic!("no {idx_type} indexes collected"))
!= &0
{
bail!("start {idx_type} index must be 0");
}
let last_idx = idx_set
.last()
.unwrap_or_else(|| panic!("no {idx_type} indexes collected"));
if last_idx != &(num_idx - 1) {
bail!(
"last {idx_type} index must be {} got {last_idx} instead",
num_idx - 1
);
}
Ok(())
}
pub fn check_module(&mut self, module: &Module) -> Result<()> {
self.check_eidx(module.package.refr.as_ref())?;
for import in &module.imports {
self.check_eidx(import.refr.as_ref())?;
}
for rule in &module.policy {
match rule.as_ref() {
Rule::Spec { head, bodies, .. } => {
self.check_rule_heade(head)?;
for body in bodies {
self.check_rule_body(body)?;
}
}
Rule::Default {
refr, args, value, ..
} => {
self.check_eidx(refr.as_ref())?;
for arg in args {
self.check_eidx(arg.as_ref())?;
}
self.check_eidx(value.as_ref())?;
}
}
}
if module.num_expressions == 0 {
bail!("module must have at least one expression");
}
self.check_gathered_indexes(module.num_expressions, &self.eidx, "expression")?;
self.check_gathered_indexes(module.num_statements, &self.sidx, "statement")?;
self.check_gathered_indexes(module.num_queries, &self.qidx, "query")?;
Ok(())
}
}

View File

@@ -325,9 +325,9 @@ impl Interpreter {
}
match expr.as_ref() {
// Stop path collection upon encountering the leading variable.
Expr::Var(v) => {
Expr::Var { span, .. } => {
path.reverse();
return self.lookup_var(&v.0, &path[..], false);
return self.lookup_var(span, &path[..], false);
}
// Accumulate chained . field accesses.
Expr::RefDot { refr, field, .. } => {
@@ -336,9 +336,9 @@ impl Interpreter {
}
Expr::RefBrack { refr, index, .. } => match index.as_ref() {
// refr["field"] is the same as refr.field
Expr::String(s) => {
Expr::String { span, .. } => {
expr = refr;
path.push(s.0.text());
path.push(span.text());
}
// Handle other forms of refr.
// Note, we have the choice to evaluate a non-string index
@@ -410,7 +410,9 @@ impl Interpreter {
fn hoist_loops_impl(&self, expr: &ExprRef, loops: &mut Vec<LoopExpr>) {
use Expr::*;
match expr.as_ref() {
RefBrack { refr, index, span } => {
RefBrack {
refr, index, span, ..
} => {
// First hoist any loops in refr
self.hoist_loops_impl(refr, loops);
@@ -420,8 +422,8 @@ impl Interpreter {
// Then hoist the current bracket operation.
let mut indices = Vec::with_capacity(1);
let _ = traverse(index, &mut |e| match e.as_ref() {
Var(ident) if self.is_loop_index_var(&ident.0.source_str()) => {
indices.push(ident.0.source_str());
Var { span: ident, .. } if self.is_loop_index_var(&ident.source_str()) => {
indices.push(ident.source_str());
Ok(false)
}
Array { .. } | Object { .. } => Ok(true),
@@ -438,7 +440,12 @@ impl Interpreter {
}
// Primitives
String(_) | RawString(_) | Number(_) | True(_) | False(_) | Null(_) | Var(_) => (),
String { .. }
| RawString { .. }
| Number { .. }
| Bool { .. }
| Null { .. }
| Var { .. } => (),
// Recurse into expressions in other variants.
Array { items, .. } | Set { items, .. } | Call { params: items, .. } => {
@@ -595,17 +602,17 @@ impl Interpreter {
let (name, value) = match op {
AssignOp::Eq => {
match (lhs.as_ref(), rhs.as_ref()) {
(_, Expr::Var(var))
if var.0.source_str().text() != "input"
&& self.lookup_var(&var.0, &[], true)? == Value::Undefined =>
(_, Expr::Var { span: var, .. })
if var.source_str().text() != "input"
&& self.lookup_var(var, &[], true)? == Value::Undefined =>
{
(var.0.source_str(), self.eval_expr(lhs)?)
(var.source_str(), self.eval_expr(lhs)?)
}
(Expr::Var(var), _)
if var.0.source_str().text() != "input"
&& self.lookup_var(&var.0, &[], true)? == Value::Undefined =>
(Expr::Var { span: var, .. }, _)
if var.source_str().text() != "input"
&& self.lookup_var(var, &[], true)? == Value::Undefined =>
{
(var.0.source_str(), self.eval_expr(rhs)?)
(var.source_str(), self.eval_expr(rhs)?)
}
(
Expr::Array {
@@ -614,6 +621,7 @@ impl Interpreter {
Expr::Array {
items: rhs_items,
span: rhs_span,
..
},
) => {
if lhs_items.len() != rhs_items.len() {
@@ -635,6 +643,7 @@ impl Interpreter {
Expr::Object {
fields: rhs_fields,
span: rhs_span,
..
},
) => {
if lhs_fields.len() != rhs_fields.len() {
@@ -706,8 +715,8 @@ impl Interpreter {
return Ok(rhs_value);
}
let name = if let Expr::Var(s) = lhs.as_ref() {
s.0.source_str()
let name = if let Expr::Var { span: s, .. } = lhs.as_ref() {
s.source_str()
} else {
let mut cache = BTreeMap::new();
let mut type_match = BTreeSet::new();
@@ -838,16 +847,16 @@ impl Interpreter {
let raise_error = is_last && type_match.get(expr).is_none();
match (expr.as_ref(), value) {
(Expr::Var(ident), _) if ident.0.text() == "_" => Ok(true),
(Expr::Var(ident), _)
(Expr::Var { span: ident, .. }, _) if ident.text() == "_" => Ok(true),
(Expr::Var { span: ident, .. }, _)
if check_existing_value
&& self.lookup_local_var(&ident.0.source_str()) == Some(value.clone()) =>
&& self.lookup_local_var(&ident.source_str()) == Some(value.clone()) =>
{
Ok(false)
}
(Expr::Var(ident), _) => {
self.add_variable(&ident.0.source_str(), value.clone())?;
(Expr::Var { span: ident, .. }, _) => {
self.add_variable(&ident.source_str(), value.clone())?;
Ok(true)
}
@@ -1076,7 +1085,9 @@ impl Interpreter {
Ok(match &stmt.literal {
Literal::Expr { span, expr, .. } => {
let value = match expr.as_ref() {
Expr::Call { span, fcn, params } => self.eval_call(
Expr::Call {
span, fcn, params, ..
} => self.eval_call(
span,
expr,
fcn,
@@ -1116,7 +1127,9 @@ impl Interpreter {
Literal::NotExpr { span, expr, .. } => {
let value = match expr.as_ref() {
// Extra parameter is allowed; but a return argument is not allowed.
Expr::Call { span, fcn, params } => self.eval_call(
Expr::Call {
span, fcn, params, ..
} => self.eval_call(
span,
expr,
fcn,
@@ -1368,7 +1381,9 @@ impl Interpreter {
let (saved_state, _) = self.apply_with_modifiers(stmts[0])?;
let loop_expr_value = loop_expr.value();
let loop_expr_value = if let Expr::Call { span, fcn, params } = loop_expr_value.as_ref()
let loop_expr_value = if let Expr::Call {
span, fcn, params, ..
} = loop_expr_value.as_ref()
{
// Handle walk(obj, output_param)
let extra_arg = get_extra_arg(
@@ -1395,8 +1410,11 @@ impl Interpreter {
// (this can happen if the same index is used for two different collections),
// then evaluate statements only if the index applies to this collection.
let loop_expr_index = loop_expr.index();
if let Some(Expr::Var(index_var)) = loop_expr_index.as_ref().map(|r| r.as_ref()) {
if let Some(idx) = self.lookup_local_var(&index_var.0.source_str()) {
if let Some(Expr::Var {
span: index_var, ..
}) = loop_expr_index.as_ref().map(|r| r.as_ref())
{
if let Some(idx) = self.lookup_local_var(&index_var.source_str()) {
if loop_expr_value[&idx] != Value::Undefined {
result = self.eval_stmts_in_loop(stmts, &loops[1..])? || result;
return Ok(result);
@@ -1517,8 +1535,8 @@ impl Interpreter {
let mut expr = refr;
loop {
match expr.as_ref() {
Expr::Var(v) => {
comps.push(Value::String(v.0.text().into()));
Expr::Var { span: v, .. } => {
comps.push(Value::String(v.text().into()));
break;
}
Expr::RefBrack { refr, index, .. } => {
@@ -1613,7 +1631,7 @@ impl Interpreter {
fn is_constant_ref(&self, mut expr: &Ref<Expr>) -> Result<bool> {
loop {
match expr.as_ref() {
Expr::Var(_) => break,
Expr::Var { .. } => break,
Expr::RefDot { refr, .. } => expr = refr,
Expr::RefBrack { refr, index, .. } if self.is_simple_literal(index)? => expr = refr,
_ => return Ok(false),
@@ -1625,12 +1643,11 @@ impl Interpreter {
fn is_simple_literal(&self, expr: &Ref<Expr>) -> Result<bool> {
Ok(matches!(
expr.as_ref(),
Expr::String(_)
| Expr::RawString(_)
| Expr::True(_)
| Expr::False(_)
| Expr::Null(_)
| Expr::Number(_)
Expr::String { .. }
| Expr::RawString { .. }
| Expr::Bool { .. }
| Expr::Null { .. }
| Expr::Number { .. }
))
}
@@ -2529,13 +2546,13 @@ impl Interpreter {
// TODO: global var check; interop with `some var`
if let Some(ea) = extra_arg {
match ea.as_ref() {
Expr::Var(var)
if allow_return_arg && self.lookup_local_var(&var.0.source_str()).is_none() =>
Expr::Var { span: var, .. }
if allow_return_arg && self.lookup_local_var(&var.source_str()).is_none() =>
{
let value =
self.eval_call_impl(span, expr, fcn, &params[..params.len() - 1])?;
if var.0.text() != "_" {
self.add_variable(&var.0.source_str(), value)?;
if var.text() != "_" {
self.add_variable(&var.source_str(), value)?;
}
Ok(Value::Bool(true))
}
@@ -2799,15 +2816,14 @@ impl Interpreter {
}
match expr.as_ref() {
Expr::Null(_) => Ok(Value::Null),
Expr::True(_) => Ok(Value::Bool(true)),
Expr::False(_) => Ok(Value::Bool(false)),
Expr::Number((_, v)) => Ok(v.clone()),
Expr::Null { value: v, .. }
| Expr::Bool { value: v, .. }
| Expr::Number { value: v, .. } => Ok(v.clone()),
// TODO: Handle string vs rawstring
Expr::String((_, v)) => Ok(v.clone()),
Expr::RawString((_, v)) => Ok(v.clone()),
Expr::String { value: v, .. } => Ok(v.clone()),
Expr::RawString { value: v, .. } => Ok(v.clone()),
// TODO: Handle undefined variables
Expr::Var(_) => self.eval_chained_ref_dot_or_brack(expr),
Expr::Var { .. } => self.eval_chained_ref_dot_or_brack(expr),
Expr::RefDot { .. } => self.eval_chained_ref_dot_or_brack(expr),
Expr::RefBrack { .. } => self.eval_chained_ref_dot_or_brack(expr),
@@ -2843,8 +2859,10 @@ impl Interpreter {
key, value, query, ..
} => self.eval_object_compr(key, value, query),
Expr::SetCompr { term, query, .. } => self.eval_set_compr(term, query),
Expr::UnaryExpr { span, expr: uexpr } => match uexpr.as_ref() {
Expr::Number(_) if !uexpr.span().text().starts_with('-') => {
Expr::UnaryExpr {
span, expr: uexpr, ..
} => match uexpr.as_ref() {
Expr::Number { .. } if !uexpr.span().text().starts_with('-') => {
builtins::numbers::arithmetic_operation(
span,
&ArithOp::Sub,
@@ -2859,9 +2877,9 @@ impl Interpreter {
.span()
.error("unary - can only be used with numeric literals")),
},
Expr::Call { span, fcn, params } => {
self.eval_call(span, expr, fcn, params, None, false)
}
Expr::Call {
span, fcn, params, ..
} => self.eval_call(span, expr, fcn, params, None, false),
}
}
@@ -3041,14 +3059,16 @@ impl Interpreter {
comps.push(field.0.text());
expr = Some(refr);
}
Expr::RefBrack { refr, index, .. } if matches!(index.as_ref(), Expr::String(_)) => {
if let Expr::String(s) = index.as_ref() {
comps.push(s.0.text());
Expr::RefBrack { refr, index, .. }
if matches!(index.as_ref(), Expr::String { .. }) =>
{
if let Expr::String { span: s, .. } = index.as_ref() {
comps.push(s.text());
expr = Some(refr);
}
}
Expr::Var(v) => {
comps.push(v.0.text());
Expr::Var { span: v, .. } => {
comps.push(v.text());
expr = None;
}
_ => bail!(e.span().error("invalid ref expression")),
@@ -3088,10 +3108,12 @@ impl Interpreter {
use Expr::*;
let (kind, span) = match expr.as_ref() {
// Scalars are supported
String(_) | RawString(_) | Number(_) | True(_) | False(_) | Null(_) => return Ok(()),
String { .. } | RawString { .. } | Number { .. } | Bool { .. } | Null { .. } => {
return Ok(())
}
// Uminus of number is treated as a single expression,
UnaryExpr { expr, .. } if matches!(expr.as_ref(), Number(_)) => return Ok(()),
UnaryExpr { expr, .. } if matches!(expr.as_ref(), Number { .. }) => return Ok(()),
// Comprehensions are supported since they won't evaluate to undefined.
ArrayCompr { .. } | SetCompr { .. } | ObjectCompr { .. } => return Ok(()),
@@ -3114,7 +3136,7 @@ impl Interpreter {
}
// The following may evaluate to undefined.
Var((span, _)) => ("var", span),
Var { span, .. } => ("var", span),
Call { span, .. } => ("call", span),
UnaryExpr { span, .. } => ("unaryexpr", span),
RefDot { span, .. } => ("ref", span),
@@ -3169,7 +3191,7 @@ impl Interpreter {
let (refr, index) = match refr.as_ref() {
Expr::RefBrack { refr, index, .. } => (refr, Some(index.clone())),
Expr::RefDot { .. } => (refr, None),
Expr::Var(_) => (refr, None),
Expr::Var { .. } => (refr, None),
_ => bail!(refr.span().error(&format!(
"invalid token {:?} with the default keyword",
refr
@@ -3489,13 +3511,13 @@ impl Interpreter {
let mut components: Vec<Rc<str>> = vec![];
loop {
refr = match refr.as_ref() {
Expr::Var(v) => {
components.push(v.0.text().into());
Expr::Var { span: v, .. } => {
components.push(v.text().into());
break;
}
Expr::RefBrack { refr, index, .. } => {
if let Expr::String(s) = index.as_ref() {
components.push(s.0.text().into());
if let Expr::String { span: s, .. } = index.as_ref() {
components.push(s.text().into());
} else {
components.clear();
}
@@ -3625,10 +3647,10 @@ impl Interpreter {
_ => match import.refr.as_ref() {
Expr::RefDot { field, .. } => field.0.text(),
Expr::RefBrack { index, .. } => match index.as_ref() {
Expr::String(s) => s.0.text(),
Expr::String { span: s, .. } => s.text(),
_ => "",
},
Expr::Var(v) if v.0.text() == "input" => {
Expr::Var { span: v, .. } if v.text() == "input" => {
// Warn redundant import of input. Ignore it.
#[cfg(feature = "std")]
std::eprintln!(
@@ -3667,7 +3689,7 @@ impl Interpreter {
// TODO: refactor.
let refr = match refr.as_ref() {
Expr::RefBrack { index, .. }
if matches!(index.as_ref(), Expr::String(_)) =>
if matches!(index.as_ref(), Expr::String { .. }) =>
{
refr
}
@@ -3681,7 +3703,7 @@ impl Interpreter {
Expr::RefBrack { refr, index, .. } => {
if !matches!(
index.as_ref(),
Expr::True(_) | Expr::False(_) | Expr::Number(_) | Expr::String(_)
Expr::Bool { .. } | Expr::Number { .. } | Expr::String { .. }
) {
// OPA's behavior is ignoring the non-scalar index
bail!(index.span().error("index is not a scalar value"));

View File

@@ -22,6 +22,7 @@ extern crate std;
mod ast;
mod builtins;
mod engine;
mod indexchecker;
mod interpreter;
mod lexer;
mod number;

View File

@@ -21,6 +21,13 @@ pub struct Parser<'source> {
end: u32,
future_keywords: BTreeMap<String, Option<Span>>,
rego_v1: bool,
// The index of the last expression that was parsed.
eidx: u32,
// The index of the last statement that was parsed.
sidx: u32,
// The index of the last query that was parsed.
qidx: u32,
}
const FUTURE_KEYWORDS: [&str; 4] = ["contains", "every", "if", "in"];
@@ -37,9 +44,30 @@ impl<'source> Parser<'source> {
end: 0,
future_keywords: BTreeMap::new(),
rego_v1: false,
eidx: 0,
sidx: 0,
qidx: 0,
})
}
fn next_eidx(&mut self) -> u32 {
let eidx = self.eidx;
self.eidx += 1;
eidx
}
fn next_sidx(&mut self) -> u32 {
let sidx = self.sidx;
self.sidx += 1;
sidx
}
fn next_qidx(&mut self) -> u32 {
let qidx = self.qidx;
self.qidx += 1;
qidx
}
pub fn enable_rego_v1(&mut self) -> Result<()> {
self.turn_on_rego_v1(&None)
}
@@ -129,13 +157,13 @@ impl<'source> Parser<'source> {
Self::get_path_ref_components_into(refr, comps)?;
Self::get_path_ref_components_into(index, comps)?;
}
Expr::Var(v) => comps.push(v.0.clone()),
Expr::String(s) => comps.push(s.0.clone()),
Expr::True(s) | Expr::False(s) | Expr::Null(s) => comps.push(s.clone()),
Expr::Number(s) => {
Expr::Var { span: v, .. } => comps.push(v.clone()),
Expr::String { span: s, .. } => comps.push(s.clone()),
Expr::Bool { span: s, .. } | Expr::Null { span: s, .. } => comps.push(s.clone()),
Expr::Number { span, value, .. } => {
// Ensure that the span will be the serialized representation.
if *s.0.text() == s.1.to_json_str()? {
comps.push(s.0.clone());
if span.text() == value.to_json_str()? {
comps.push(span.clone());
} else {
bail!(refr.span().error("not a valid ref"));
}
@@ -262,9 +290,13 @@ impl<'source> Parser<'source> {
}
}
fn read_number(span: Span) -> Result<Expr> {
fn read_number(&mut self, span: Span) -> Result<Expr> {
match Number::from_str(span.text()) {
Ok(v) => Ok(Expr::Number((span, Value::Number(v)))),
Ok(v) => Ok(Expr::Number {
span,
value: Value::Number(v),
eidx: self.next_eidx(),
}),
Err(_) => bail!(span.error("could not parse number")),
}
}
@@ -272,27 +304,51 @@ impl<'source> Parser<'source> {
fn parse_scalar_or_var(&mut self) -> Result<Expr> {
let span = self.tok.1.clone();
let node = match &self.tok.0 {
TokenKind::Number => Self::read_number(span)?,
TokenKind::Number => self.read_number(span)?,
TokenKind::String => {
let v = match serde_json::from_str::<Value>(format!("\"{}\"", span.text()).as_str())
{
Ok(v) => v,
Err(e) => bail!(span.error(format!("invalid string literal. {e}").as_str())),
};
Expr::String((span, v))
Expr::String {
span,
value: v,
eidx: self.next_eidx(),
}
}
TokenKind::RawString => {
let v = Value::from(span.text().to_string());
Expr::RawString((span, v))
Expr::RawString {
span,
value: v,
eidx: self.next_eidx(),
}
}
TokenKind::Ident => match self.token_text() {
"null" => Expr::Null(span),
"true" => Expr::True(span),
"false" => Expr::False(span),
"null" => Expr::Null {
span,
value: Value::Null,
eidx: self.next_eidx(),
},
"true" => Expr::Bool {
span,
value: Value::from(true),
eidx: self.next_eidx(),
},
"false" => Expr::Bool {
span,
value: Value::from(false),
eidx: self.next_eidx(),
},
_ => {
let ident = self.parse_var()?;
let v = Value::from(ident.text());
return Ok(Expr::Var((ident, v)));
let value = Value::from(ident.text());
return Ok(Expr::Var {
span: ident,
value,
eidx: self.next_eidx(),
});
}
},
_ => {
@@ -353,6 +409,7 @@ impl<'source> Parser<'source> {
span,
term: Ref::new(term),
query: Ref::new(query),
eidx: self.next_eidx(),
})
}
Err(_) if self.end == pos => {
@@ -372,7 +429,11 @@ impl<'source> Parser<'source> {
}
self.expect("]", "while parsing array")?;
span.end = self.end;
Ok(Expr::Array { span, items })
Ok(Expr::Array {
span,
items,
eidx: self.next_eidx(),
})
}
Err(err) => Err(err),
}
@@ -390,6 +451,7 @@ impl<'source> Parser<'source> {
span,
term: Ref::new(term),
query: Ref::new(query),
eidx: self.next_eidx(),
});
}
Err(err) if self.end != pos => {
@@ -408,6 +470,7 @@ impl<'source> Parser<'source> {
return Ok(Expr::Object {
span,
fields: vec![],
eidx: self.next_eidx(),
});
}
@@ -427,7 +490,11 @@ impl<'source> Parser<'source> {
}
self.expect("}", "while parsing set")?;
span.end = self.end;
return Ok(Expr::Set { span, items });
return Ok(Expr::Set {
span,
items,
eidx: self.next_eidx(),
});
}
// Parse as object.
@@ -442,6 +509,7 @@ impl<'source> Parser<'source> {
key: Ref::new(first),
value: Ref::new(term),
query: Ref::new(query),
eidx: self.next_eidx(),
});
}
Err(err) if self.end != pos => {
@@ -483,6 +551,7 @@ impl<'source> Parser<'source> {
Ok(Expr::Object {
span,
fields: items,
eidx: self.next_eidx(),
})
}
@@ -494,6 +563,7 @@ impl<'source> Parser<'source> {
Ok(Expr::Set {
span,
items: vec![],
eidx: self.next_eidx(),
})
}
@@ -513,6 +583,7 @@ impl<'source> Parser<'source> {
Ok(Expr::UnaryExpr {
span,
expr: Ref::new(expr),
eidx: self.next_eidx(),
})
}
@@ -531,18 +602,18 @@ impl<'source> Parser<'source> {
let mut expr = &term;
while possible_fcn {
match expr {
Expr::Var(_) => break,
Expr::Var { .. } => break,
Expr::RefDot { refr, .. } => expr = refr,
Expr::RefBrack { refr, index, .. } => {
expr = refr;
possible_fcn = matches!(index.as_ref(), Expr::String(_));
possible_fcn = matches!(index.as_ref(), Expr::String { .. });
}
_ => {
possible_fcn = false;
}
}
}
matches!(&term, Expr::Var(_));
matches!(&term, Expr::Var { .. });
loop {
let mut span = self.tok.1.clone();
@@ -586,6 +657,7 @@ impl<'source> Parser<'source> {
span,
refr: Ref::new(term),
field: (field, fieldv),
eidx: self.next_eidx(),
};
}
"[" => {
@@ -593,7 +665,7 @@ impl<'source> Parser<'source> {
let index = self.parse_in_expr()?;
// If the index is a string, the ref could be path to a function.
possible_fcn = possible_fcn && matches!(&index, Expr::String(_));
possible_fcn = possible_fcn && matches!(&index, Expr::String { .. });
self.expect("]", "while parsing bracketed reference")?;
span.end = self.end;
@@ -602,6 +674,7 @@ impl<'source> Parser<'source> {
span,
refr: Ref::new(term),
index: Ref::new(index),
eidx: self.next_eidx(),
};
}
"(" if possible_fcn => {
@@ -624,6 +697,7 @@ impl<'source> Parser<'source> {
span,
fcn: Ref::new(term),
params: args,
eidx: self.next_eidx(),
};
// The expression can no longer be a function after the call.
@@ -661,6 +735,7 @@ impl<'source> Parser<'source> {
op,
lhs: Ref::new(expr),
rhs: Ref::new(right),
eidx: self.next_eidx(),
};
}
}
@@ -685,7 +760,7 @@ impl<'source> Parser<'source> {
rhs_span.col += 1;
self.next_token()?;
Self::read_number(rhs_span)?
self.read_number(rhs_span)?
} else {
self.next_token()?;
self.parse_mul_div_mod_expr()?
@@ -696,6 +771,7 @@ impl<'source> Parser<'source> {
op,
lhs: Ref::new(expr),
rhs: Ref::new(right),
eidx: self.next_eidx(),
};
}
}
@@ -715,6 +791,7 @@ impl<'source> Parser<'source> {
op: BinOp::Intersection,
lhs: Ref::new(expr),
rhs: Ref::new(right),
eidx: self.next_eidx(),
};
}
Ok(expr)
@@ -735,6 +812,7 @@ impl<'source> Parser<'source> {
op: BinOp::Union,
lhs: Ref::new(expr),
rhs: Ref::new(right),
eidx: self.next_eidx(),
};
}
Ok(expr)
@@ -763,6 +841,7 @@ impl<'source> Parser<'source> {
op,
lhs: Ref::new(expr),
rhs: Ref::new(right),
eidx: self.next_eidx(),
};
}
Ok(expr)
@@ -789,6 +868,7 @@ impl<'source> Parser<'source> {
key,
value,
collection: Ref::new(expr3),
eidx: self.next_eidx(),
};
expr2 = None;
@@ -832,6 +912,7 @@ impl<'source> Parser<'source> {
span,
lhs: Ref::new(expr),
rhs: Ref::new(rhs),
eidx: self.next_eidx(),
};
}
Ok(expr)
@@ -864,11 +945,11 @@ impl<'source> Parser<'source> {
let op = match self.token_text() {
"=" => AssignOp::Eq,
":=" if self.rego_v1 => {
if let Expr::Var(v) = &expr {
if v.0.text() == "input" {
if let Expr::Var { span: v, .. } = &expr {
if v.text() == "input" {
bail!(span.error("input cannot be shadowed"));
}
if v.0.text() == "data" {
if v.text() == "data" {
bail!(span.error("data cannot be shadowed"));
}
}
@@ -889,6 +970,7 @@ impl<'source> Parser<'source> {
op,
lhs: Ref::new(expr),
rhs: Ref::new(right),
eidx: self.next_eidx(),
})
}
@@ -973,7 +1055,7 @@ impl<'source> Parser<'source> {
for (idx, ref_expr) in refs.iter().enumerate() {
let span = &vars[idx];
match ref_expr.as_ref() {
Expr::Var(_) => (),
Expr::Var { .. } => (),
_ => {
return Err(anyhow!(
"{}:{}:{} error: encountered `{}` while expecting identifier",
@@ -987,6 +1069,8 @@ impl<'source> Parser<'source> {
}
span.end = self.end;
// Since exprs are discarded, adjust the expression index counter.
self.eidx -= vars.len() as u32;
return Ok(Literal::SomeVars { span, vars });
}
@@ -1053,6 +1137,7 @@ impl<'source> Parser<'source> {
span,
literal,
with_mods,
sidx: self.next_sidx(),
})
}
@@ -1130,6 +1215,7 @@ impl<'source> Parser<'source> {
Ok(Query {
span,
stmts: literals,
qidx: self.next_qidx(),
})
}
@@ -1166,7 +1252,12 @@ impl<'source> Parser<'source> {
let start = self.tok.1.start;
let var = self.parse_var()?;
let mut refr = Expr::Var(Self::span_and_value(var));
let (span, value) = Self::span_and_value(var);
let mut refr = Expr::Var {
span,
value,
eidx: self.next_eidx(),
};
loop {
let mut span = self.tok.1.clone();
let sep_pos = span.start;
@@ -1203,12 +1294,20 @@ impl<'source> Parser<'source> {
span,
refr: Ref::new(refr),
field: Self::span_and_value(field),
eidx: self.next_eidx(),
};
}
"[" => {
self.next_token()?;
let index = match &self.tok.0 {
TokenKind::String => Expr::String(Self::span_and_value(self.tok.1.clone())),
TokenKind::String => {
let (span, value) = Self::span_and_value(self.tok.1.clone());
Expr::String {
span,
value,
eidx: self.next_eidx(),
}
}
_ => {
return Err(self.source.error(
self.tok.1.line,
@@ -1224,6 +1323,7 @@ impl<'source> Parser<'source> {
span,
refr: Ref::new(refr),
index: Ref::new(index),
eidx: self.next_eidx(),
};
}
_ => break,
@@ -1247,7 +1347,12 @@ impl<'source> Parser<'source> {
bail!(span.error("data cannot be shadowed"));
}
}
Expr::Var(Self::span_and_value(v))
let (span, value) = Self::span_and_value(v);
Expr::Var {
span,
value,
eidx: self.next_eidx(),
}
} else {
return Err(self.source.error(
span.line,
@@ -1292,6 +1397,7 @@ impl<'source> Parser<'source> {
span,
refr: Ref::new(term),
field: Self::span_and_value(field),
eidx: self.next_eidx(),
};
}
"[" => {
@@ -1303,6 +1409,7 @@ impl<'source> Parser<'source> {
span,
refr: Ref::new(term),
index: Ref::new(index),
eidx: self.next_eidx(),
};
}
_ => break,
@@ -1362,15 +1469,17 @@ impl<'source> Parser<'source> {
if assign.is_none() && is_set_follower {
match rule_ref.as_ref() {
Expr::RefBrack { refr, index, .. }
if matches!(refr.as_ref(), Expr::Var(_)) =>
if matches!(refr.as_ref(), Expr::Var { .. }) =>
{
// Adjust the expression counter since we are discarding the RefBrack expression.
self.eidx -= 1;
return Ok(RuleHead::Set {
span,
refr: refr.clone(),
key: Some(index.clone()),
});
}
Expr::RefDot { refr, .. } if matches!(refr.as_ref(), Expr::Var(_)) => {
Expr::RefDot { refr, .. } if matches!(refr.as_ref(), Expr::Var { .. }) => {
return Ok(RuleHead::Set {
span,
refr: rule_ref,
@@ -1416,7 +1525,11 @@ impl<'source> Parser<'source> {
*self = state;
let stmts = vec![self.parse_literal_stmt()?];
span.end = self.end;
Ok(Query { span, stmts })
Ok(Query {
span,
stmts,
qidx: self.next_qidx(),
})
}
pub fn parse_rule_bodies(&mut self) -> Result<Vec<RuleBody>> {
@@ -1539,6 +1652,7 @@ impl<'source> Parser<'source> {
let query = Ref::new(Query {
span: query_span,
stmts: vec![],
qidx: self.next_qidx(),
});
span.end = self.end;
bodies.push(RuleBody {
@@ -1597,7 +1711,14 @@ impl<'source> Parser<'source> {
refr: rule_ref,
args: args
.into_iter()
.map(|a| Ref::new(Expr::Var(Self::span_and_value(a))))
.map(|a| {
let (span, value) = Self::span_and_value(a);
Ref::new(Expr::Var {
span,
value,
eidx: self.next_eidx(),
})
})
.collect(),
op,
value,
@@ -1769,12 +1890,21 @@ impl<'source> Parser<'source> {
policy.push(Ref::new(self.parse_rule()?));
}
Ok(Module {
let m = Module {
package,
imports,
policy,
rego_v1: self.rego_v1,
})
num_expressions: self.eidx,
num_statements: self.sidx,
num_queries: self.qidx,
};
#[cfg(debug_assertions)]
{
indexchecker::IndexChecker::default().check_module(&m)?;
}
Ok(m)
}
pub fn parse_user_query(&mut self) -> Result<Ref<Query>> {

View File

@@ -219,7 +219,12 @@ pub fn traverse(expr: &Ref<Expr>, f: &mut dyn FnMut(&Ref<Expr>) -> Result<bool>)
return Ok(());
}
match expr.as_ref() {
String(_) | RawString(_) | Number(_) | True(_) | False(_) | Null(_) | Var(_) => (),
Expr::String { .. }
| RawString { .. }
| Number { .. }
| Bool { .. }
| Null { .. }
| Var { .. } => (),
Array { items, .. } | Set { items, .. } => {
for i in items {
@@ -308,23 +313,23 @@ fn gather_assigned_vars(
) -> Result<()> {
traverse(expr, &mut |e| match e.as_ref() {
// Ignore _, input, data.
Var(v) if matches!(v.0.text(), "_" | "input" | "data") => Ok(false),
Var { span: v, .. } if matches!(v.text(), "_" | "input" | "data") => Ok(false),
// Record local var that can shadow input var.
Var(v) if can_shadow => {
scope.locals.insert(v.0.source_str(), v.0.clone());
Var { span: v, .. } if can_shadow => {
scope.locals.insert(v.source_str(), v.clone());
Ok(false)
}
// Record input vars.
Var(v) if var_exists(&v.0, parent_scopes) => {
scope.inputs.insert(v.0.source_str());
Var { span: v, .. } if var_exists(v, parent_scopes) => {
scope.inputs.insert(v.source_str());
Ok(false)
}
// Record local var.
Var(v) => {
scope.unscoped.insert(v.0.source_str());
Var { span: v, .. } => {
scope.unscoped.insert(v.source_str());
Ok(false)
}
@@ -336,10 +341,10 @@ fn gather_assigned_vars(
fn gather_input_vars(expr: &Ref<Expr>, parent_scopes: &[Scope], scope: &mut Scope) -> Result<()> {
traverse(expr, &mut |e| match e.as_ref() {
Var(v)
if !scope.unscoped.contains(&v.0.source_str()) && var_exists(&v.0, parent_scopes) =>
Var { span: v, .. }
if !scope.unscoped.contains(&v.source_str()) && var_exists(v, parent_scopes) =>
{
scope.inputs.insert(v.0.source_str());
scope.inputs.insert(v.source_str());
Ok(false)
}
_ => Ok(true),
@@ -555,8 +560,8 @@ impl Analyzer {
RuleHead::Func { args, assign, .. } => {
for a in args.iter() {
traverse(a, &mut |e| {
if let Var(v) = e.as_ref() {
scope.unscoped.insert(v.0.source_str());
if let Var { span: v, .. } = e.as_ref() {
scope.unscoped.insert(v.source_str());
}
Ok(true)
})?;
@@ -647,10 +652,10 @@ impl Analyzer {
let mut used_vars = vec![];
let mut comprs = vec![];
traverse(expr, &mut |e| match e.as_ref() {
Var(v) if !matches!(v.0.text(), "_" | "input" | "data") => {
let name = v.0.source_str();
Var { span: v, .. } if !matches!(v.text(), "_" | "input" | "data") => {
let name = v.source_str();
let is_extra_arg = match assigned_vars {
Some(vars) => vars.contains(&v.0.source_str()),
Some(vars) => vars.contains(&v.source_str()),
_ => false,
};
@@ -659,20 +664,18 @@ impl Analyzer {
{
if !is_extra_arg {
used_vars.push(name.clone());
first_use.entry(name).or_insert(v.0.clone());
first_use.entry(name).or_insert(v.clone());
}
} else if !scope.inputs.contains(&name) {
bail!(v
.0
.error(format!("use of undefined variable `{name}` is unsafe").as_str()));
bail!(v.error(format!("use of undefined variable `{name}` is unsafe").as_str()));
}
Ok(false)
}
RefBrack { refr, index, .. } => {
traverse(index, &mut |e| match e.as_ref() {
Var(v) => {
let var = v.0.source_str();
Var { span: v, .. } => {
let var = v.source_str();
if scope.locals.contains_key(&var) || scope.unscoped.contains(&var) {
let (rb_used_vars, rb_comprs) =
Self::gather_used_vars_comprs_index_vars(
@@ -765,11 +768,11 @@ impl Analyzer {
) -> Result<Vec<SourceStr>> {
let mut vars = vec![];
traverse(expr, &mut |e| match e.as_ref() {
Var(v) => {
let var = v.0.source_str();
Var { span: v, .. } => {
let var = v.source_str();
if scope.locals.contains_key(&var) {
if check_first_use {
Self::check_first_use(&v.0, first_use)?;
Self::check_first_use(v, first_use)?;
}
vars.push(var);
} else if scope.unscoped.contains(&var) {
@@ -955,8 +958,8 @@ impl Analyzer {
non_vars: &mut Vec<Ref<Expr>>,
) -> Result<()> {
traverse(expr, &mut |e| match e.as_ref() {
Var(v) if scope.locals.contains_key(&v.0.source_str()) => {
vars.push(v.0.source_str());
Var { span: v, .. } if scope.locals.contains_key(&v.source_str()) => {
vars.push(v.source_str());
Ok(false)
}
// TODO: Object key/value

View File

@@ -19,13 +19,13 @@ pub fn get_path_string(refr: &Expr, document: Option<&str>) -> Result<String> {
expr = Some(refr);
}
Some(Expr::RefBrack { refr, index, .. }) => {
if let Expr::String(s) = index.as_ref() {
comps.push(s.0.text());
if let Expr::String { span: s, .. } = index.as_ref() {
comps.push(s.text());
}
expr = Some(refr);
}
Some(Expr::Var(v)) => {
comps.push(v.0.text());
Some(Expr::Var { span: v, .. }) => {
comps.push(v.text());
expr = None;
}
_ => bail!("internal error: not a simple ref {expr:?}"),
@@ -112,7 +112,7 @@ pub fn get_root_var(mut expr: &Expr) -> Result<SourceStr> {
let empty = expr.span().source_str().clone_empty();
loop {
match expr {
Expr::Var(v) => return Ok(v.0.source_str()),
Expr::Var { span: v, .. } => return Ok(v.source_str()),
Expr::RefDot { refr, .. } | Expr::RefBrack { refr, .. } => expr = refr,
_ => return Ok(empty),
}

View File

@@ -3,7 +3,7 @@
cases:
- note: basic
rego: |
rego: |
package test
import future.keywords
@@ -13,48 +13,69 @@ cases:
every a, b in vals { check(a) }
}
}
num_expressions: 14
num_queries: 3
num_statements: 4
policy:
- spec:
head:
compr:
refr:
var: y
eidx: 3
assign:
op: "="
value:
number: 8
eidx: 4
bodies:
- query:
qidx: 2
stmts:
- literal:
- sidx: 3
literal:
every:
value: x
domain:
array:
- number: 2
eidx: 5
eidx: 6
query:
qidx: 1
stmts:
- literal:
- sidx: 0
literal:
expr:
boolexpr:
op: ">"
lhs:
var: x
eidx: 7
rhs:
number: 0
- literal:
eidx: 8
eidx: 9
- sidx: 2
literal:
every:
key: a
value: b
domain:
var: vals
eidx: 10
query:
qidx: 0
stmts:
- literal:
- sidx: 1
literal:
expr:
call:
fcn:
var: check
eidx: 11
params:
- var: a
eidx: 12
eidx: 13

View File

@@ -7,12 +7,16 @@ cases:
package test
x = 1 - 2 * 3 / 4 + 2
num_expressions: 11
num_queries: 0
num_statements: 0
policy:
- spec:
head:
compr:
refr:
var: x
eidx: 1
assign:
op: =
value:
@@ -23,6 +27,7 @@ cases:
op: "-"
lhs:
number: 1
eidx: 2
rhs:
arithexpr:
op: "/"
@@ -31,10 +36,18 @@ cases:
op: "*"
lhs:
number: 2
eidx: 3
rhs:
number: 3
eidx: 4
eidx: 5
rhs:
number: 4
eidx: 6
eidx: 7
eidx: 8
rhs:
number: 2
eidx: 9
eidx: 10
bodies: []

View File

@@ -8,6 +8,9 @@ cases:
x = {1}
y = {2}
z = [ x | y ] #, 5] # in {5}, 6]
num_expressions: 11
num_queries: 1
num_statements: 1
policy:
- --skip--
- --skip--
@@ -16,18 +19,24 @@ cases:
compr:
refr:
var: z
eidx: 7
assign:
op: =
value:
arraycompr:
term:
var: x
eidx: 8
query:
qidx: 0
stmts:
- span: y
literal:
expr:
var: y
eidx: 9
sidx: 0
eidx: 10
bodies: []
- note: case2-array
@@ -36,6 +45,9 @@ cases:
x = {1}
y = {2}
z = [ x | y, 5] # in {5}, 6]
num_expressions: 13
num_queries: 0
num_statements: 0
policy:
- --skip--
- --skip--
@@ -44,6 +56,7 @@ cases:
compr:
refr:
var: z
eidx: 7
assign:
op: =
value:
@@ -52,9 +65,14 @@ cases:
op: "|"
lhs:
var: x
eidx: 8
rhs:
var: y
eidx: 9
eidx: 10
- number: 5
eidx: 11
eidx: 12
bodies: []
- note: case3-compr
@@ -64,6 +82,9 @@ cases:
x = {1}
y = {2}
z = [ x | y, 5 in {5}] #, 6]
num_expressions: 18
num_queries: 1
num_statements: 1
policy:
- --skip--
- --skip--
@@ -72,25 +93,36 @@ cases:
compr:
refr:
var: z
eidx: 10
assign:
op: =
value:
arraycompr:
term:
var: x
eidx: 11
query:
qidx: 0
stmts:
- span: y, 5 in {5}
sidx: 0
literal:
expr:
inexpr:
key:
var: y
eidx: 12
value:
number: 5
eidx: 13
collection:
set:
- number: 5
eidx: 14
eidx: 15
eidx: 16
eidx: 15
eidx: 17
bodies: []
- note: case4-array
@@ -100,6 +132,9 @@ cases:
x = {1}
y = {2}
z = [ x | y, 5 in {5}, 6]
num_expressions: 20
num_queries: 0
num_statements: 0
policy:
- --skip--
- --skip--
@@ -108,6 +143,7 @@ cases:
compr:
refr:
var: z
eidx: 10
assign:
op: =
value:
@@ -116,15 +152,24 @@ cases:
op: "|"
lhs:
var: x
eidx: 11
rhs:
var: y
eidx: 12
eidx: 13
- inexpr:
value:
number: 5
eidx: 14
collection:
set:
- number: 5
eidx: 15
eidx: 16
eidx: 17
- number: 6
eidx: 18
eidx: 19
bodies: []
- note: case5-array
@@ -134,6 +179,9 @@ cases:
x = {1}
y = {2}
z = [ x - {10} | y, 5 in {5}] #, 6]
num_expressions: 22
num_queries: 0
num_statements: 0
policy:
- --skip--
- --skip--
@@ -142,6 +190,7 @@ cases:
compr:
refr:
var: z
eidx: 10
assign:
op: =
value:
@@ -153,17 +202,28 @@ cases:
op: "-"
lhs:
var: x
eidx: 11
rhs:
set:
- number: 10
eidx: 12
eidx: 13
eidx: 14
rhs:
var: y
eidx: 15
eidx: 16
- inexpr:
value:
number: 5
eidx: 17
collection:
set:
- number: 5
eidx: 18
eidx: 19
eidx: 20
eidx: 21
bodies: []
- note: case6-compr
@@ -173,6 +233,9 @@ cases:
x = {1}
y = {2}
z = [ (x - {10}) | y, 5 in {5}] #, 6]
num_expressions: 21
num_queries: 1
num_statements: 1
policy:
- --skip--
- --skip--
@@ -181,6 +244,7 @@ cases:
compr:
refr:
var: z
eidx: 10
assign:
op: =
value:
@@ -190,19 +254,31 @@ cases:
op: "-"
lhs:
var: x
eidx: 11
rhs:
set:
- number: 10
eidx: 12
eidx: 13
eidx: 14
query:
qidx: 0
stmts:
- literal:
- sidx: 0
literal:
expr:
inexpr:
key:
var: y
eidx: 15
value:
number: 5
eidx: 16
collection:
set:
- number: 5
eidx: 17
eidx: 18
eidx: 19
eidx: 20
bodies: []

View File

@@ -17,19 +17,24 @@ cases:
# Nested empty
[[[[[]]]]]
]
num_expressions: 17
num_statements: 0
num_queries: 0
policy:
- spec:
head:
compr:
refr:
var: x
eidx: 1
assign:
span: = {1}
op: "="
value:
set:
- number: 1
eidx: 2
eidx: 3
bodies: --skip--
- spec:
@@ -37,21 +42,34 @@ cases:
compr:
refr:
var: y
eidx: 4
assign:
op: "="
value:
array:
- number: 2.5
eidx: 5
- string: abc
eidx: 6
- array:
- number: 4
eidx: 7
- rawstring: raw
eidx: 8
eidx: 9
- array: []
eidx: 10
- array:
- array:
- array:
- array:
- array: []
eidx: 11
eidx: 12
eidx: 13
eidx: 14
eidx: 15
eidx: 16
bodies: []
- note: trailing-comma
@@ -60,12 +78,16 @@ cases:
x = [1,]
y = [1,2
,]
num_expressions: 8
num_statements: 0
num_queries: 0
policy:
- spec:
head:
compr:
refr:
var: x
eidx: 1
assign:
op: "="
value:
@@ -73,12 +95,15 @@ cases:
span: "[1,]"
values:
- number: 1
eidx: 2
eidx: 3
bodies: []
- spec:
head:
compr:
refr:
var: y
eidx: 4
assign:
op: "="
value:
@@ -86,7 +111,10 @@ cases:
span: "[1,2\n,]"
values:
- number: 1
eidx: 5
- number: 2
eidx: 6
eidx: 7
bodies: []
- note: no-comma

View File

@@ -10,12 +10,16 @@ cases:
# If not the following expressions would evaluate to empty set.
x = {1, 2, 3} | {2} & {4}
y = {2} & {4} | {1, 2, 3}
num_expressions: 23
num_statements: 0
num_queries: 0
policy:
- spec:
head:
compr:
refr:
var: x
eidx: 1
assign:
op: =
value:
@@ -24,23 +28,34 @@ cases:
lhs:
set:
- number: 1
eidx: 2
- number: 2
eidx: 3
- number: 3
eidx: 4
eidx: 5
rhs:
binexpr:
op: "&"
lhs:
set:
- number: 2
eidx: 6
eidx: 7
rhs:
set:
- number: 4
eidx: 8
eidx: 9
eidx: 10
eidx: 11
bodies: []
- spec:
head:
compr:
refr:
var: y
eidx: 12
assign:
op: =
value:
@@ -49,16 +64,26 @@ cases:
rhs:
set:
- number: 1
eidx: 18
- number: 2
eidx: 19
- number: 3
eidx: 20
eidx: 21
lhs:
binexpr:
op: "&"
lhs:
set:
- number: 2
eidx: 13
eidx: 14
rhs:
set:
- number: 4
eidx: 15
eidx: 16
eidx: 17
eidx: 22
bodies: []

View File

@@ -13,13 +13,16 @@ cases:
# different types against object
# different types against set
# strings etc
num_expressions: 9
num_queries: 0
num_statements: 0
policy:
- spec:
head:
compr:
refr:
var: x
eidx: 1
assign:
op: =
value:
@@ -29,15 +32,22 @@ cases:
arithexpr:
op: "+"
lhs:
number: 1
number: 1
eidx: 2
rhs:
number: 2
eidx: 3
eidx: 4
rhs:
arithexpr:
op: "-"
lhs:
number: 3
eidx: 5
rhs:
number: 2
eidx: 6
eidx: 7
eidx: 8
bodies: []

View File

@@ -11,6 +11,9 @@ cases:
# Trailing comma
x = inc(5,)
num_expressions: 13
num_statements: 0
num_queries: 0
policy:
- spec:
head:
@@ -19,30 +22,42 @@ cases:
refbrack:
refr:
var: deny
eidx: 1
index:
call:
fcn:
var: sprintf
eidx: 2
params:
- string: "Hello %v"
eidx: 3
- array:
- string: "world"
eidx: 4
eidx: 5
eidx: 6
eidx: 7
assign:
op: =
value:
number: 1
eidx: 8
bodies: []
- spec:
head:
compr:
refr:
var: x
eidx: 9
assign:
op: "="
value:
call:
fcn:
var: inc
eidx: 10
params:
- number: 5
eidx: 11
eidx: 12
bodies: []

View File

@@ -13,29 +13,38 @@ cases:
# The following will be parsed as
# (5 in [4, 5]) in (set() | {true})
z = 5 in [4, 5] in set() | {true}
num_expressions: 21
num_statements: 0
num_queries: 0
policy:
- spec:
head:
compr:
refr:
var: x
eidx: 4
assign:
op: "="
value:
inexpr:
value:
number: 5
eidx: 5
collection:
array:
- number: 4
eidx: 6
- number: 5
eidx: 7
eidx: 8
eidx: 9
bodies: []
- spec:
head:
compr:
refr:
var: z
eidx: 10
assign:
op: "="
value:
@@ -44,16 +53,26 @@ cases:
inexpr:
value:
number: 5
eidx: 11
collection:
array:
- number: 4
eidx: 12
- number: 5
eidx: 13
eidx: 14
eidx: 15
collection:
binexpr:
op: "|"
lhs:
set: []
eidx: 16
rhs:
set:
- true
- bool: true
eidx: 17
eidx: 18
eidx: 19
eidx: 20
bodies: []

View File

@@ -12,29 +12,37 @@ cases:
# Chained in-exprs
y = 0, 5 in c in d
num_expressions: 17
policy:
- spec:
head:
compr:
refr:
var: x
eidx: 4
assign:
op: "="
value:
inexpr:
key:
number: 0
eidx: 5
value:
number: 5
eidx: 6
collection:
array:
- number: 5
eidx: 7
eidx: 8
eidx: 9
bodies: []
- spec:
head:
compr:
refr:
var: y
eidx: 10
assign:
op: "="
value:
@@ -43,10 +51,16 @@ cases:
inexpr:
key:
number: 0
eidx: 11
value:
number: 5
eidx: 12
collection:
var: c
eidx: 13
eidx: 14
collection:
var: d
eidx: 15
eidx: 16
bodies: []

View File

@@ -47,6 +47,9 @@ cases:
"p" : "q", "r" in "d" : "e"
}
num_expressions: 54
num_statements: 0
num_queries: 0
policy:
- spec:
span: x = {}
@@ -55,18 +58,21 @@ cases:
span: x = {}
refr:
var: x
eidx: 4
assign:
span: = {}
op: =
value:
object:
fields: []
eidx: 5
bodies: []
- spec:
head:
compr:
refr:
var: y
eidx: 6
assign:
op: =
value:
@@ -74,14 +80,18 @@ cases:
fields:
- key:
string: a
eidx: 7
value:
number: 5
eidx: 8
eidx: 9
bodies: []
- spec:
head:
compr:
refr:
var: z
eidx: 10
assign:
op: =
value:
@@ -89,75 +99,121 @@ cases:
fields:
- key:
string: a
eidx: 11
value:
number: 5
eidx: 12
- key:
string: b
eidx: 13
value:
array:
- number: 1
eidx: 14
- number: 2
eidx: 15
- number: 3
eidx: 16
eidx: 17
- key:
string: c
eidx: 18
value:
set:
- number: 4
eidx: 19
- number: 5
eidx: 20
- number : 6
eidx: 21
eidx: 22
- key:
string: d
eidx: 23
value:
object:
fields:
- key:
string: a
eidx: 24
value:
number: 5
eidx: 25
- key:
string: b
eidx: 26
value:
set: []
eidx: 27
eidx: 28
- key:
array:
- number: 1
eidx: 29
- number: 2
eidx: 30
- number: 3
eidx: 31
eidx: 32
value:
number: 4
eidx: 33
- key:
set:
- number: 1
eidx: 34
eidx: 35
value:
number: 2
eidx: 36
- key:
object:
fields:
- key:
string: a
eidx: 37
value:
number: 1
eidx: 38
- key:
string: b
eidx: 39
value:
number: 2
eidx: 40
eidx: 41
value:
rawstring: "hello,\n world"
- key: null
value: false
- key: true
value: true
eidx: 42
- key:
"null": null
eidx: 43
value:
bool: false
eidx: 44
- key:
bool: true
eidx: 45
value:
bool: true
eidx: 46
- key:
string: p
eidx: 47
value:
string: q
eidx: 48
- key:
inexpr:
value:
string: r
eidx: 49
collection:
string: d
eidx: 50
eidx: 51
value:
string: e
eidx: 52
eidx: 53
bodies: []

View File

@@ -8,6 +8,9 @@ cases:
x = {1}
y = {2}
z = { x | y } #, 5} # in {5}, 6}
num_expressions: 11
num_statements: 1
num_queries: 1
policy:
- --skip--
- --skip--
@@ -16,18 +19,24 @@ cases:
compr:
refr:
var: z
eidx: 7
assign:
op: =
value:
setcompr:
term:
var: x
eidx: 8
query:
qidx: 0
stmts:
- span: y
sidx: 0
literal:
expr:
var: y
eidx: 9
eidx: 10
bodies: []
- note: case2-set
@@ -36,6 +45,9 @@ cases:
x = {1}
y = {2}
z = { x | y, 5} # in {5}, 6}
num_expressions: 13
num_statements: 0
num_queries: 0
policy:
- --skip--
- --skip--
@@ -44,6 +56,7 @@ cases:
compr:
refr:
var: z
eidx: 7
assign:
op: =
value:
@@ -52,9 +65,14 @@ cases:
op: "|"
lhs:
var: x
eidx: 8
rhs:
var: y
eidx: 9
eidx: 10
- number: 5
eidx: 11
eidx: 12
bodies: []
- note: case3-compr
@@ -64,6 +82,9 @@ cases:
x = {1}
y = {2}
z = { x | y, 5 in {5}} #, 6}
num_expressions: 18
num_statements: 1
num_queries: 1
policy:
- --skip--
- --skip--
@@ -72,25 +93,35 @@ cases:
compr:
refr:
var: z
eidx: 10
assign:
op: =
value:
setcompr:
term:
var: x
eidx: 11
query:
qidx: 0
stmts:
- span: y, 5 in {5}
sidx: 0
literal:
expr:
inexpr:
key:
var: y
var: y
eidx: 12
value:
number: 5
eidx: 13
collection:
set:
- number: 5
eidx: 14
eidx: 15
eidx: 16
eidx: 17
bodies: []
- note: case4-set
@@ -100,6 +131,9 @@ cases:
x = {1}
y = {2}
z = { x | y, 5 in {5}, 6}
num_expressions: 20
num_statements: 0
num_queries: 0
policy:
- --skip--
- --skip--
@@ -108,6 +142,7 @@ cases:
compr:
refr:
var: z
eidx: 10
assign:
op: =
value:
@@ -116,15 +151,24 @@ cases:
op: "|"
lhs:
var: x
eidx: 11
rhs:
var: y
eidx: 12
eidx: 13
- inexpr:
value:
number: 5
eidx: 14
collection:
set:
- number: 5
eidx: 15
eidx: 16
eidx: 17
- number: 6
eidx: 18
eidx: 19
bodies: []
- note: case5-set
@@ -134,6 +178,9 @@ cases:
x = {1}
y = {2}
z = { x - {10} | y, 5 in {5}} #, 6}
num_expressions: 22
num_statements: 0
num_queries: 0
policy:
- --skip--
- --skip--
@@ -142,6 +189,7 @@ cases:
compr:
refr:
var: z
eidx: 10
assign:
op: =
value:
@@ -153,17 +201,28 @@ cases:
op: "-"
lhs:
var: x
eidx: 11
rhs:
set:
- number: 10
eidx: 12
eidx: 13
eidx: 14
rhs:
var: y
eidx: 15
eidx: 16
- inexpr:
value:
number: 5
eidx: 17
collection:
set:
- number: 5
eidx: 18
eidx: 19
eidx: 20
eidx: 21
bodies: []
- note: case6-compr
@@ -173,6 +232,9 @@ cases:
x = {1}
y = {2}
z = { (x - {10}) | y, 5 in {5}} #, 6}
num_expressions: 21
num_statements: 1
num_queries: 1
policy:
- --skip--
- --skip--
@@ -181,6 +243,7 @@ cases:
compr:
refr:
var: z
eidx: 10
assign:
op: =
value:
@@ -190,19 +253,31 @@ cases:
op: "-"
lhs:
var: x
eidx: 11
rhs:
set:
- number: 10
eidx: 12
eidx: 13
eidx: 14
query:
qidx: 0
stmts:
- literal:
- sidx: 0
literal:
expr:
inexpr:
key:
var: y
eidx: 15
value:
number: 5
eidx: 16
collection:
set:
- number: 5
eidx: 17
eidx: 18
eidx: 19
eidx: 20
bodies: []

View File

@@ -17,19 +17,24 @@ cases:
# Nested empty
{{{{{}}}}}
}
num_expressions: 17
num_statements: 0
num_queries: 0
policy:
- spec:
head:
compr:
refr:
var: x
eidx: 1
assign:
span: = {1}
op: "="
value:
set:
- number: 1
eidx: 2
eidx: 3
bodies: --skip--
- spec:
@@ -37,16 +42,23 @@ cases:
compr:
refr:
var: y
eidx: 4
assign:
op: "="
value:
set:
- number: 2.5
eidx: 5
- string: abc
eidx: 6
- set:
- number: 4
eidx: 7
- rawstring: raw
eidx: 8
eidx: 9
- set: []
eidx: 10
- set:
- set:
- set:
@@ -54,6 +66,12 @@ cases:
- object:
span: "{}"
fields: []
eidx: 11
eidx: 12
eidx: 13
eidx: 14
eidx: 15
eidx: 16
bodies: []
- note: trailing-comma
@@ -62,12 +80,16 @@ cases:
x = {1,}
y = {1,2
,}
num_expressions: 8
num_queries: 0
num_statements: 0
policy:
- spec:
head:
compr:
refr:
var: x
eidx: 1
assign:
op: "="
value:
@@ -75,12 +97,15 @@ cases:
span: "{1,}"
values:
- number: 1
eidx: 2
eidx: 3
bodies: []
- spec:
head:
compr:
refr:
var: y
eidx: 4
assign:
op: "="
value:
@@ -88,16 +113,19 @@ cases:
span: "{1,2\n,}"
values:
- number: 1
eidx: 5
- number: 2
eidx: 6
eidx: 7
bodies: []
- note: no-comma
rego: |
package test
x = {1 2}
error: expecting `}` while parsing set
- note: two-trailing-commas
rego: |
package test

View File

@@ -6,6 +6,7 @@ cases:
rego: |
package test
import future.keywords
num_expressions: 3
imports:
- span: import future.keywords
refr:
@@ -13,7 +14,9 @@ cases:
span: future.keywords
refr:
var: future
eidx: 1
field: keywords
eidx: 2
- note: all
rego: |
@@ -22,6 +25,7 @@ cases:
import future.keywords.if
import
future.keywords.in
num_expressions: 13
imports:
- span: import future.keywords.contains
refr:
@@ -32,8 +36,11 @@ cases:
span: future.keywords
refr:
var: future
eidx: 1
field: keywords
eidx: 2
field: contains
eidx: 3
- span: import future.keywords.every
refr:
refdot:
@@ -43,8 +50,11 @@ cases:
span: future.keywords
refr:
var: future
eidx: 4
field: keywords
eidx: 5
field: every
eidx: 6
- span: import future.keywords.if
refr:
refdot:
@@ -54,8 +64,11 @@ cases:
span: future.keywords
refr:
var: future
eidx: 7
field: keywords
eidx: 8
field: if
eidx: 9
- span: "import\nfuture.keywords.in"
refr:
refdot:
@@ -65,8 +78,11 @@ cases:
span: future.keywords
refr:
var: future
eidx: 10
field: keywords
eidx: 11
field: in
eidx: 12
- note: bracket
rego: |
@@ -74,6 +90,9 @@ cases:
import future["keywords"]["contains"] import future.keywords["every"]
import
future["keywords"].if
num_expressions: 14
num_statements: 0
num_queries: 0
imports:
- span: import future["keywords"]["contains"]
refr:
@@ -84,10 +103,15 @@ cases:
span: future["keywords"]
refr:
var: future
eidx: 1
index:
string: keywords
eidx: 2
eidx: 3
index:
string: contains
eidx: 4
eidx: 5
- span: import future.keywords["every"]
refr:
refbrack:
@@ -97,9 +121,13 @@ cases:
span: future.keywords
refr:
var: future
eidx: 6
field: keywords
eidx: 7
index:
string: every
eidx: 8
eidx: 9
- span: "import\nfuture[\"keywords\"].if"
refr:
refdot:
@@ -109,9 +137,13 @@ cases:
span: future["keywords"]
refr:
var: future
eidx: 10
index:
string: keywords
eidx: 11
eidx: 12
field: if
eidx: 13
- note: as
rego: |
@@ -126,6 +158,9 @@ cases:
import future["keywords"]
#error: "this import shadows previous import of `contains`"
query: data.test
num_expressions: 6
num_queries: 0
num_statements: 0
want_result: {}
- note: shadow/1
@@ -134,6 +169,9 @@ cases:
import future.keywords
import future.keywords.if
#error: "this import shadows previous import of `if`"
num_expressions: 6
num_queries: 0
num_statements: 0
query: data.test
want_result: {}
@@ -144,6 +182,9 @@ cases:
import future.keywords
#error: "this import shadows previous import of `if`"
query: data.test
num_expressions: 6
num_queries: 0
num_statements: 0
want_result: {}
- note: in-as-var
@@ -151,6 +192,9 @@ cases:
package test
import future.keywords.if
in = 5
num_expressions: 6
num_queries: 0
num_statements: 0
- note: in-as-var-imported
rego: |

View File

@@ -7,68 +7,96 @@ cases:
package test
import data
import input
num_expressions: 3
num_statements: 0
num_queries: 0
imports:
- span: import data
refr:
var: data
eidx: 1
- span: import input
refr:
var: input
eidx: 2
- note: input
rego: |
package test
import input
num_expressions: 2
num_statements: 0
num_queries: 0
imports:
- span: import input
refr:
var: input
eidx: 1
- note: dot
rego: |
package test
import input.a
import data.b
num_expressions: 5
num_statements: 0
num_queries: 0
imports:
- span: import input.a
refr:
refdot:
refr:
var: input
eidx: 1
field: a
eidx: 2
- span: import data.b
refr:
refdot:
refr:
var: data
eidx: 3
field: b
eidx: 4
- note: bracket
rego: |
package test
import input["a"]
import data["b"]
num_expressions: 7
num_statements: 0
num_queries: 0
imports:
- span: import input["a"]
refr:
refbrack:
refr:
var: input
eidx: 1
index:
string: a
eidx: 2
eidx: 3
- span: import data["b"]
refr:
refbrack:
refr:
var: data
eidx: 4
index:
string: b
eidx: 5
eidx: 6
- note: multi-dot
rego: |
package test
import input.a.b
import data.c.d
num_expressions: 7
num_statements: 0
num_queries: 0
imports:
- span: import input.a.b
refr:
@@ -79,8 +107,11 @@ cases:
span: input.a
refr:
var: input
eidx: 1
field: a
eidx: 2
field: b
eidx: 3
- span: import data.c.d
refr:
refdot:
@@ -90,8 +121,11 @@ cases:
span: data.c
refr:
var: data
eidx: 4
field: c
eidx: 5
field: d
eidx: 6
policy: []
@@ -100,6 +134,9 @@ cases:
package test
import input["b.c"].d["e.f"].g
import data.a["b.c"].d["e.f"]
num_expressions: 15
num_statements: 0
num_queries: 0
package: --skip--
imports:
- span: import input["b.c"].d["e.f"].g
@@ -117,12 +154,19 @@ cases:
span: input["b.c"]
refr:
var: input
eidx: 1
index:
string: b.c
eidx: 2
eidx: 3
field: d
eidx: 4
index:
string: e.f
eidx: 5
eidx: 6
field: g
eidx: 7
- span: import data.a["b.c"].d["e.f"]
refr:
refbrack:
@@ -138,12 +182,19 @@ cases:
span: data.a
refr:
var: data
eidx: 8
field: a
eidx: 9
index:
string: b.c
eidx: 10
eidx: 11
field: d
eidx: 12
index:
string: e.f
eidx: 13
eidx: 14
- note: same-line
rego: package test import input.a["b"] import data["c"].d
@@ -151,6 +202,10 @@ cases:
span: package test
refr:
var: test
eidx: 0
num_expressions: 9
num_statements: 0
num_queries: 0
imports:
- span: import input.a["b"]
refr:
@@ -161,9 +216,13 @@ cases:
span: input.a
refr:
var: input
eidx: 1
field: a
eidx: 2
index:
string: b
eidx: 3
eidx: 4
- span: import data["c"].d
refr:
refdot:
@@ -173,14 +232,20 @@ cases:
span: data["c"]
refr:
var: data
eidx: 5
index:
string: c
eidx: 6
eidx: 7
field: d
eidx: 8
- note: as
rego: |
package test
import input.x as y
num_expressions: 3
num_statements: 0
num_queries: 0
imports:
- span: import input.x as y
refr:
@@ -188,7 +253,9 @@ cases:
span: input.x
refr:
var: input
eidx: 1
field: x
eidx: 2
as: y
- note: as/newline
@@ -198,6 +265,9 @@ cases:
input.x
as
y
num_expressions: 3
num_statements: 0
num_queries: 0
imports:
- span: "import\ninput.x\nas\ny"
refr:
@@ -205,7 +275,9 @@ cases:
span: input.x
refr:
var: input
eidx: 1
field: x
eidx: 2
as: y
- note: missing-ref

View File

@@ -4,20 +4,31 @@
cases:
- note: single-char
rego: package a
num_expressions: 1
num_statements: 0
num_queries: 0
package:
span: package a
refr:
var: a
eidx: 0
- note: simple
rego: package test
num_expressions: 1
num_statements: 0
num_queries: 0
package:
span: package test
refr:
var: test
eidx: 0
- note: dot
rego: package a.b
num_expressions: 2
num_statements: 0
num_queries: 0
package:
span: package a.b
refr:
@@ -25,10 +36,15 @@ cases:
span: a.b
refr:
var: a
eidx: 0
field: b
eidx: 1
- note: multi-dot
rego: package a.b.c
num_expressions: 3
num_statements: 0
num_queries: 0
package:
span: package a.b.c
refr:
@@ -39,11 +55,17 @@ cases:
span: a.b
refr:
var: a
eidx: 0
field: b
eidx: 1
field: c
eidx: 2
- note: bracket
rego: package a["b"]
num_expressions: 3
num_statements: 0
num_queries: 0
package:
span: package a["b"]
refr:
@@ -51,11 +73,17 @@ cases:
span: a["b"]
refr:
var: a
eidx: 0
index:
string: b
eidx: 1
eidx: 2
- note: multi-bracket
rego: package a["b"]["c.d"]
num_expressions: 5
num_statements: 0
num_queries: 0
package:
span: package a["b"]["c.d"]
refr:
@@ -66,35 +94,50 @@ cases:
span: a["b"]
refr:
var: a
eidx: 0
index:
string: b
eidx: 1
eidx: 2
index:
string: c.d
eidx: 3
eidx: 4
- note: complex
rego: package a["b.c"].d["e.f"].g
num_expressions: 7
num_statements: 0
num_queries: 0
package:
span: package a["b.c"].d["e.f"].g
refr:
refdot:
span: a["b.c"].d["e.f"].g
refr:
refbrack:
span: a["b.c"].d["e.f"]
refr:
refdot:
span: a["b.c"].d
refr:
refbrack:
span: a["b.c"]
refr:
var: a
index:
string: "b.c"
field: d
index:
string: e.f
refbrack:
span: a["b.c"].d["e.f"]
refr:
refdot:
span: a["b.c"].d
refr:
refbrack:
span: a["b.c"]
refr:
var: a
eidx: 0
index:
string: "b.c"
eidx: 1
eidx: 2
field: d
eidx: 3
index:
string: e.f
eidx: 4
eidx: 5
field: g
eidx: 6
- note: missing-package-keyword
rego: packge a

View File

@@ -6,6 +6,9 @@ cases:
rego: |
package test
add(x, y) := 5 sub(x, y) = 5
num_expressions: 9
num_statements: 0
num_queries: 0
package: --skip--
imports:
policy:
@@ -16,14 +19,18 @@ cases:
span: add(x, y) := 5
refr:
var: add
eidx: 1
args:
- var: x
eidx: 2
- var: y
eidx: 3
assign:
span: := 5
op: :=
value:
number: 5
eidx: 4
bodies: []
- spec:
span: sub(x, y) = 5
@@ -32,13 +39,17 @@ cases:
span: sub(x, y) = 5
refr:
var: sub
eidx: 5
args:
- var: x
eidx: 6
- var: y
eidx: 7
assign:
span: = 5
op: =
value:
number: 5
eidx: 8
bodies: []

View File

@@ -12,6 +12,9 @@ cases:
error: unexpected keyword `else`
- note: no-query
num_expressions: 5
num_statements: 2
num_queries: 2
rego: |
package test
@@ -26,21 +29,29 @@ cases:
compr:
refr:
var: x
eidx: 1
assign:
op: "="
value:
number: 10
eidx: 2
bodies:
- query:
qidx: 0
stmts:
- literal:
expr:
false
bool: false
eidx: 3
sidx: 0
- query:
qidx: 1
stmts:
- literal:
expr:
true
bool: true
eidx: 4
sidx: 1
- note: no-else
rego: |
@@ -51,27 +62,38 @@ cases:
} {
true
}
num_expressions: 5
num_statements: 2
num_queries: 2
policy:
- spec:
head:
compr:
refr:
var: x
eidx: 1
assign:
op: "="
value:
number: 10
eidx: 2
bodies:
- query:
qidx: 0
stmts:
- literal:
expr:
false
bool: false
eidx: 3
sidx: 0
- query:
qidx: 1
stmts:
- literal:
expr:
true
bool: true
eidx: 4
sidx: 1
- note: if-no-else
rego: |
@@ -83,27 +105,38 @@ cases:
} {
true
}
num_expressions: 8
num_statements: 2
num_queries: 2
policy:
- spec:
head:
compr:
refr:
var: x
eidx: 4
assign:
op: "="
value:
number: 10
eidx: 5
bodies:
- query:
qidx: 0
stmts:
- literal:
expr:
false
bool: false
eidx: 6
sidx: 0
- query:
qidx: 1
stmts:
- literal:
expr:
true
bool: true
eidx: 7
sidx: 1
- note: rule-named-if
rego: |
@@ -114,33 +147,45 @@ cases:
} {
true
}
num_expressions: 6
num_statements: 2
num_queries: 2
policy:
- spec:
head:
compr:
refr:
var: x
eidx: 1
assign:
op: "="
value:
number: 10
eidx: 2
bodies: []
- spec:
head:
compr:
refr:
var: if
eidx: 3
bodies:
- query:
qidx: 0
stmts:
- literal:
expr:
false
bool: false
eidx: 4
sidx: 0
- query:
qidx: 1
stmts:
- literal:
expr:
true
bool: true
eidx: 5
sidx: 1
- note: query-else
rego: |
@@ -151,27 +196,38 @@ cases:
} else {
true
}
num_expressions: 5
num_queries: 2
num_statements: 2
policy:
- spec:
head:
compr:
refr:
var: x
eidx: 1
assign:
op: "="
value:
number: 10
eidx: 2
bodies:
- query:
qidx: 0
stmts:
- literal:
expr:
false
bool: false
eidx: 3
sidx: 0
- query:
qidx: 1
stmts:
- literal:
expr:
true
bool: true
eidx: 4
sidx: 1
- note: if-literal-else
rego: |
@@ -181,18 +237,24 @@ cases:
x = 10 if 1 < 0 else {
true
}
num_expressions: 10
num_statements: 2
num_queries: 2
policy:
- spec:
head:
compr:
refr:
var: x
eidx: 4
assign:
op: "="
value:
number: 10
eidx: 5
bodies:
- query:
qidx: 0
stmts:
- literal:
expr:
@@ -200,13 +262,20 @@ cases:
op: "<"
lhs:
number: 1
eidx: 6
rhs:
number: 0
eidx: 7
eidx: 8
sidx: 0
- query:
qidx: 1
stmts:
- literal:
expr:
true
bool: true
eidx: 9
sidx: 1
- note: if-literal-else-assign
rego: |
@@ -217,18 +286,24 @@ cases:
x = 10 if 1 < 0 else := 20 {
true
}
num_expressions: 11
num_statements: 2
num_queries: 2
policy:
- spec:
head:
compr:
refr:
var: x
eidx: 4
assign:
op: "="
value:
number: 10
eidx: 5
bodies:
- query:
qidx: 0
stmts:
- literal:
expr:
@@ -236,17 +311,25 @@ cases:
op: "<"
lhs:
number: 1
eidx: 6
rhs:
number: 0
eidx: 7
eidx: 8
sidx: 0
- assign:
op: ":="
value:
number: 20
eidx: 9
query:
qidx: 1
stmts:
- literal:
expr:
true
bool: true
eidx: 10
sidx: 1
- note: contains-else-error
rego: |

View File

@@ -8,6 +8,9 @@ cases:
import future.keywords
deny.a contains 0, "bar" in ["bar1"] if true
num_expressions: 11
num_statements: 1
num_queries: 1
policy:
- spec:
head:
@@ -16,27 +19,37 @@ cases:
refdot:
refr:
var: deny
eidx: 3
field: a
eidx: 4
key:
inexpr:
key:
number: 0
eidx: 5
value:
string: bar
eidx: 6
collection:
array:
- string: bar1
eidx: 7
eidx: 8
eidx: 9
bodies:
- query:
qidx: 0
stmts:
- literal:
expr:
true
bool: true
eidx: 10
sidx: 0
- note: old-syntax
rego: |
package test
import future.keywords.if
# The following are not sets
x1 if true
x2 { true }
@@ -48,31 +61,41 @@ cases:
# The following are not sets
z.a if { true }
z["b"] if { true }
num_expressions: 21
num_statements: 6
num_queries: 6
policy:
- spec:
head:
compr:
refr:
var: x1
eidx: 4
bodies:
- query:
qidx: 0
stmts:
- literal:
expr:
true
bool: true
eidx: 5
sidx: 0
- spec:
head:
compr:
refr:
var: x2
eidx: 6
bodies:
- query:
qidx: 1
stmts:
- literal:
expr:
true
bool: true
eidx: 7
sidx: 1
- spec:
head:
set:
@@ -80,27 +103,37 @@ cases:
refdot:
refr:
var: y
eidx: 8
field: a
eidx: 9
bodies:
- query:
qidx: 2
stmts:
- literal:
expr:
true
bool: true
eidx: 10
sidx: 2
- spec:
head:
set:
refr:
var: y
eidx: 11
key:
string: b
eidx: 12
bodies:
- query:
qidx: 3
stmts:
- literal:
expr:
true
bool: true
eidx: 13
sidx: 3
- spec:
head:
@@ -109,13 +142,18 @@ cases:
refdot:
refr:
var: z
eidx: 14
field: a
eidx: 15
bodies:
- query:
qidx: 4
stmts:
- literal:
expr:
true
bool: true
eidx: 16
sidx: 4
- spec:
head:
@@ -124,12 +162,17 @@ cases:
refbrack:
refr:
var: z
eidx: 17
index:
string: b
eidx: 18
eidx: 19
bodies:
- query:
qidx: 5
stmts:
- literal:
expr:
true
bool: true
eidx: 20
sidx: 5

View File

@@ -24,68 +24,97 @@ cases:
some a, b in d
}
}
num_expressions: 25
num_statements: 6
num_queries: 2
policy:
- spec:
head: --skip--
bodies:
- query:
qidx: 1
stmts:
- span: some a in {1}
sidx: 0
literal:
some-decl:
value:
var: a
eidx: 6
collection:
set:
- number: 1
eidx: 7
eidx: 8
- span: "some a\n , b in r"
sidx: 1
literal:
some-decl:
key:
var: a
eidx: 9
value:
var: b
eidx: 10
collection:
var: r
eidx: 11
- span: "some 5, x in array"
sidx: 2
literal:
some-decl:
key:
number: 5
eidx: 12
value:
var: x
eidx: 13
collection:
var: array
eidx: 14
- span: "some \"hello\", \"world\" in map"
sidx: 3
literal:
some-decl:
key:
string: hello
eidx: 15
value:
string: world
eidx: 16
collection:
var: map
- literal:
eidx: 17
- sidx: 5
literal:
some-decl:
key:
var: p
eidx: 18
value:
var: q
eidx: 19
collection:
setcompr:
term:
var: r
eidx: 20
query:
qidx: 0
stmts:
- literal:
some-decl:
key:
var: a
eidx: 21
value:
var: b
eidx: 22
collection:
var: d
eidx: 23
sidx: 4
eidx: 24
- note: unimported-in
@@ -156,6 +185,9 @@ cases:
[1, 2, 3][a] == 3
y = a
}
num_expressions: 24
num_statements: 4
num_queries: 1
policy:
- spec:
head:
@@ -163,10 +195,12 @@ cases:
span: b := 5
refr:
var: b
eidx: 4
assign:
op: :=
value:
number: 5
eidx: 5
bodies: []
- spec:
head:
@@ -174,28 +208,38 @@ cases:
span: x = y
refr:
var: x
eidx: 6
assign:
op: =
value:
var: y
eidx: 7
bodies:
- query:
qidx: 0
stmts:
- literal:
some-vars:
span: some a
vars:
- a
sidx: 0
- literal:
expr:
inexpr:
span: b in {4, 5}
value:
var: b
eidx: 8
collection:
set:
- number: 4
eidx: 9
- number: 5
eidx: 10
eidx: 11
eidx: 12
sidx: 1
- literal:
expr:
boolexpr:
@@ -207,12 +251,21 @@ cases:
refr:
array:
- number: 1
eidx: 13
- number: 2
eidx: 14
- number: 3
eidx: 15
eidx: 16
index:
var: a
eidx: 17
eidx: 18
rhs:
number: 3
eidx: 19
eidx: 20
sidx: 2
- literal:
expr:
assignexpr:
@@ -220,5 +273,9 @@ cases:
op: =
lhs:
var: y
eidx: 21
rhs:
var: a
eidx: 22
eidx: 23
sidx: 3

View File

@@ -13,11 +13,15 @@ cases:
d,e,
f
}
num_expressions: 3
num_statements: 2
num_queries: 1
policy:
- spec:
head: --skip--
bodies:
- query:
qidx: 0
stmts:
- span: some a
literal:
@@ -25,11 +29,13 @@ cases:
span: some a
vars:
- a
sidx: 0
- span: "some\n d,e,\n f"
literal:
some-vars:
span: "some\n d,e,\n f"
vars: [d, e, f]
sidx: 1
- note: same-line-error
rego: |
@@ -58,7 +64,7 @@ cases:
package test
some y
error: unexpected keyword `some`
- note: some-in-set
rego: |
package test

View File

@@ -101,23 +101,27 @@ fn match_expr_impl(e: &Expr, v: &Value) -> Result<()> {
if skip_value(v) {
return Ok(());
}
match e {
Expr::String(s) => match_span(&s.0, &v["string"]),
Expr::RawString(s) => match_span(&s.0, &v["rawstring"]),
Expr::Number(s) => match_span(&s.0, &v["number"]),
Expr::True(s) => match_span(s, v),
Expr::False(s) => match_span(s, v),
Expr::Null(s) => match_span(s, v),
Expr::Var(s) => match_span(&s.0, &v["var"]),
Expr::Array { span, items } => match_vec(span, items, &v["array"]),
Expr::Set { span, items } => match_vec(span, items, &v["set"]),
Expr::Object { span, fields } => match_object(span, fields, &v["object"]),
Expr::ArrayCompr { span, term, query } => {
Expr::String { span: s, .. } => match_span(s, &v["string"]),
Expr::RawString { span: s, .. } => match_span(s, &v["rawstring"]),
Expr::Number { span: s, .. } => match_span(s, &v["number"]),
Expr::Bool { span: s, .. } => match_span(s, &v["bool"]),
Expr::Null { span: s, .. } => match_span(s, &v["null"]),
Expr::Var { span: s, .. } => match_span(s, &v["var"]),
Expr::Array { span, items, .. } => match_vec(span, items, &v["array"]),
Expr::Set { span, items, .. } => match_vec(span, items, &v["set"]),
Expr::Object { span, fields, .. } => match_object(span, fields, &v["object"]),
Expr::ArrayCompr {
span, term, query, ..
} => {
match_span_opt(span, &v["arraycompr"]["span"])?;
match_expr(term, &v["arraycompr"]["term"])?;
match_query(query, &v["arraycompr"]["query"])
}
Expr::SetCompr { span, term, query } => {
Expr::SetCompr {
span, term, query, ..
} => {
match_span_opt(span, &v["setcompr"]["span"])?;
match_expr(term, &v["setcompr"]["term"])?;
match_query(query, &v["setcompr"]["query"])
@@ -127,28 +131,35 @@ fn match_expr_impl(e: &Expr, v: &Value) -> Result<()> {
key,
value,
query,
..
} => {
match_span_opt(span, &v["objectcompr"]["span"])?;
match_expr(key, &v["objectcompr"]["key"])?;
match_expr(value, &v["objectcompr"]["value"])?;
match_query(query, &v["objectcompr"]["query"])
}
Expr::Call { span, fcn, params } => {
Expr::Call {
span, fcn, params, ..
} => {
match_span_opt(span, &v["call"]["span"])?;
match_expr(fcn, &v["call"]["fcn"])?;
match_vec(span /*dummy*/, params, &v["call"]["params"])
}
Expr::RefDot { span, refr, field } => {
Expr::RefDot {
span, refr, field, ..
} => {
match_span_opt(span, &v["refdot"]["span"])?;
match_expr(refr, &v["refdot"]["refr"])?;
match_span(&field.0, &v["refdot"]["field"])
}
Expr::RefBrack { span, refr, index } => {
Expr::RefBrack {
span, refr, index, ..
} => {
match_span_opt(span, &v["refbrack"]["span"])?;
match_expr(refr, &v["refbrack"]["refr"])?;
match_expr(index, &v["refbrack"]["index"])
}
Expr::UnaryExpr { span, expr } => {
Expr::UnaryExpr { span, expr, .. } => {
match_span_opt(span, &v["span"])?;
my_assert_eq!(
&Value::String("-".into()),
@@ -163,25 +174,33 @@ fn match_expr_impl(e: &Expr, v: &Value) -> Result<()> {
);
match_expr(expr, &v["expr"])
}
Expr::BinExpr { span, op, lhs, rhs } => {
Expr::BinExpr {
span, op, lhs, rhs, ..
} => {
match_span_opt(span, &v["binexpr"]["span"])?;
match_bin_op(span, op, &v["binexpr"]["op"])?;
match_expr(lhs, &v["binexpr"]["lhs"])?;
match_expr(rhs, &v["binexpr"]["rhs"])
}
Expr::ArithExpr { span, op, lhs, rhs } => {
Expr::ArithExpr {
span, op, lhs, rhs, ..
} => {
match_span_opt(span, &v["arithexpr"]["span"])?;
match_arith_op(span, op, &v["arithexpr"]["op"])?;
match_expr(lhs, &v["arithexpr"]["lhs"])?;
match_expr(rhs, &v["arithexpr"]["rhs"])
}
Expr::BoolExpr { span, op, lhs, rhs } => {
Expr::BoolExpr {
span, op, lhs, rhs, ..
} => {
match_span_opt(span, &v["boolexpr"]["span"])?;
match_bool_op(span, op, &v["boolexpr"]["op"])?;
match_expr(lhs, &v["boolexpr"]["lhs"])?;
match_expr(rhs, &v["boolexpr"]["rhs"])
}
Expr::AssignExpr { span, op, lhs, rhs } => {
Expr::AssignExpr {
span, op, lhs, rhs, ..
} => {
match_span_opt(span, &v["assignexpr"]["span"])?;
match_assign_op(span, op, &v["assignexpr"]["op"])?;
match_expr(lhs, &v["assignexpr"]["lhs"])?;
@@ -192,6 +211,7 @@ fn match_expr_impl(e: &Expr, v: &Value) -> Result<()> {
key,
value,
collection,
..
} => {
match_span_opt(span, &v["inexpr"]["span"])?;
match_expr_opt(span, key, &v["inexpr"]["key"])?;
@@ -200,22 +220,45 @@ fn match_expr_impl(e: &Expr, v: &Value) -> Result<()> {
}
#[cfg(feature = "rego-extensions")]
Expr::OrExpr { span, lhs, rhs } => {
Expr::OrExpr { span, lhs, rhs, .. } => {
match_span_opt(span, &v["orexpr"]["span"])?;
match_expr(lhs, &v["orexpr"]["lhs"])?;
match_expr(rhs, &v["orexpr"]["rhs"])
}
}?;
match (e.eidx(), &v["eidx"]) {
(eidx, Value::Number(n)) if n.as_u64() == Some(eidx as u64) => Ok(()),
_ => {
bail!(
"{}",
e.span().message(
"mismatch-error",
format!(
"eidx mismatch: expected {:?}, got {:?}",
v["eidx"],
e.eidx(),
)
.as_str()
)
);
}
}
}
#[allow(clippy::let_and_return)]
fn match_expr(expr: &Expr, v: &Value) -> Result<()> {
match match_expr_impl(expr, v) {
Ok(()) => Ok(()),
Err(e) => bail!(
"{e}\nexpr = {expr:#?}\nv={}\n-----------------------\n",
serde_json::to_string_pretty(v)?
),
}
let r = match_expr_impl(expr, v);
// Uncomment the following lines to print mismatch at each expression
// nesting level.
// if let Err(e) = &r {
// bail!(
// "{e}\nexpr = {expr:#?}\nv={}\n-----------------------\n",
// serde_json::to_string_pretty(v)?
// );
// }
r
}
fn match_with_mod(m: &WithModifier, v: &Value) -> Result<()> {
@@ -231,6 +274,20 @@ fn match_literal_stmt(ls: &LiteralStmt, v: &Value) -> Result<()> {
if skip_value(v) {
return Ok(());
}
match &v["sidx"] {
Value::Number(n) if n.as_u64() == Some(ls.sidx as u64) => (),
_ => {
bail!(
"{}",
ls.span.message(
"mismatch-error",
format!("sidx mismatch: expected {:?}, got {:?}", v["sidx"], ls.sidx).as_str()
)
);
}
}
match_span_opt(&ls.span, &v["span"])?;
match_literal(&ls.literal, &v["literal"])?;
@@ -273,6 +330,19 @@ fn match_literal_stmt(ls: &LiteralStmt, v: &Value) -> Result<()> {
}
fn match_query(q: &Query, v: &Value) -> Result<()> {
match &v["qidx"] {
Value::Number(n) if n.as_u64() == Some(q.qidx as u64) => (),
_ => {
bail!(
"{}",
q.span.message(
"mismatch-error",
format!("qidx mismatch: expected {:?}, got {:?}", v["qidx"], q.qidx).as_str()
)
);
}
}
match_span_opt(&q.span, &v["span"])?;
let stmts = &v["stmts"].as_array();
let stmts = match &stmts {
@@ -622,6 +692,15 @@ struct TestCase {
imports: Option<Vec<Value>>,
policy: Option<Vec<Value>>,
error: Option<String>,
#[serde(default)]
num_expressions: u32,
#[serde(default)]
num_statements: u32,
#[serde(default)]
num_queries: u32,
}
#[derive(Serialize, Deserialize, PartialEq, Debug)]
@@ -644,6 +723,25 @@ fn yaml_test_impl(file: &str) -> Result<()> {
if let Some(e) = &case.error {
bail!("error `{}` not raised by parser.", e);
}
my_assert_eq!(
module.num_expressions,
case.num_expressions,
"mismatch in num_expressions"
);
my_assert_eq!(
module.num_statements,
case.num_statements,
"mismatch in num_statements"
);
my_assert_eq!(
module.num_queries,
case.num_queries,
"mismatch in num_queries"
);
if let Some(p) = &case.package {
match_package(&module.package, p)?;
}