diff --git a/Cargo.lock b/Cargo.lock index ad310563..148b7e63 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -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", ] diff --git a/bindings/ffi/Cargo.lock b/bindings/ffi/Cargo.lock index 57252930..ccfa081a 100644 --- a/bindings/ffi/Cargo.lock +++ b/bindings/ffi/Cargo.lock @@ -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,53 +1488,101 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" + [[package]] name = "windows_aarch64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" + [[package]] name = "windows_i686_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" +[[package]] +name = "windows_i686_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" + [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" + [[package]] name = "windows_i686_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +[[package]] +name = "windows_i686_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" + [[package]] name = "windows_x86_64_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" + [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" + [[package]] name = "windows_x86_64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" + [[package]] name = "winnow" -version = "0.7.10" +version = "0.7.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06928c8748d81b05c9be96aad92e1b6ff01833332f281e8cfca3be4b35fc9ec" +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", diff --git a/bindings/java/Cargo.lock b/bindings/java/Cargo.lock index 10862a81..352dff88 100644 --- a/bindings/java/Cargo.lock +++ b/bindings/java/Cargo.lock @@ -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", diff --git a/bindings/python/Cargo.lock b/bindings/python/Cargo.lock index a6accb49..351342ee 100644 --- a/bindings/python/Cargo.lock +++ b/bindings/python/Cargo.lock @@ -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", diff --git a/bindings/ruby/Cargo.lock b/bindings/ruby/Cargo.lock index 7acff6a8..c4302945 100644 --- a/bindings/ruby/Cargo.lock +++ b/bindings/ruby/Cargo.lock @@ -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", diff --git a/bindings/wasm/Cargo.lock b/bindings/wasm/Cargo.lock index 9d676a10..8fa1cd51 100644 --- a/bindings/wasm/Cargo.lock +++ b/bindings/wasm/Cargo.lock @@ -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", diff --git a/build.rs b/build.rs index 42cf34d5..f98b0dcd 100644 --- a/build.rs +++ b/build.rs @@ -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(()) } diff --git a/src/ast.rs b/src/ast.rs index 394b0d75..96f8107f 100644 --- a/src/ast.rs +++ b/src/ast.rs @@ -106,29 +106,60 @@ pub type Ref = NodeRef; #[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>, + eidx: u32, }, // set Set { span: Span, items: Vec>, + eidx: u32, }, Object { span: Span, fields: Vec<(Span, Ref, Ref)>, + eidx: u32, }, // Comprehensions @@ -136,12 +167,14 @@ pub enum Expr { span: Span, term: Ref, query: Ref, + eidx: u32, }, SetCompr { span: Span, term: Ref, query: Ref, + eidx: u32, }, ObjectCompr { @@ -149,17 +182,20 @@ pub enum Expr { key: Ref, value: Ref, query: Ref, + eidx: u32, }, Call { span: Span, fcn: Ref, params: Vec>, + eidx: u32, }, UnaryExpr { span: Span, expr: Ref, + eidx: u32, }, // ref @@ -167,12 +203,14 @@ pub enum Expr { span: Span, refr: Ref, field: (Span, Value), + eidx: u32, }, RefBrack { span: Span, refr: Ref, index: Ref, + eidx: u32, }, // Infix expressions @@ -181,12 +219,15 @@ pub enum Expr { op: BinOp, lhs: Ref, rhs: Ref, + eidx: u32, }, + BoolExpr { span: Span, op: BoolOp, lhs: Ref, rhs: Ref, + eidx: u32, }, ArithExpr { @@ -194,6 +235,7 @@ pub enum Expr { op: ArithOp, lhs: Ref, rhs: Ref, + eidx: u32, }, AssignExpr { @@ -201,6 +243,7 @@ pub enum Expr { op: AssignOp, lhs: Ref, rhs: Ref, + eidx: u32, }, Membership { @@ -208,6 +251,7 @@ pub enum Expr { key: Option>, value: Ref, collection: Ref, + eidx: u32, }, #[cfg(feature = "rego-extensions")] @@ -215,6 +259,7 @@ pub enum Expr { span: Span, lhs: Ref, rhs: Ref, + 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, + pub sidx: u32, } #[derive(Debug)] @@ -297,6 +376,7 @@ pub struct LiteralStmt { pub struct Query { pub span: Span, pub stmts: Vec, + pub qidx: u32, } #[derive(Debug)] @@ -385,6 +465,12 @@ pub struct Module { #[cfg_attr(feature = "ast", serde(rename(serialize = "rules")))] pub policy: Vec>, 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; diff --git a/src/indexchecker.rs b/src/indexchecker.rs new file mode 100644 index 00000000..b6ab59e4 --- /dev/null +++ b/src/indexchecker.rs @@ -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, + sidx: BTreeSet, + qidx: BTreeSet, +} + +#[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, + 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(()) + } +} diff --git a/src/interpreter.rs b/src/interpreter.rs index aab7f49b..fc991bf7 100644 --- a/src/interpreter.rs +++ b/src/interpreter.rs @@ -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) { 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) -> Result { 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) -> Result { 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, ¶ms[..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> = 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")); diff --git a/src/lib.rs b/src/lib.rs index d41fd0f7..3af030da 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -22,6 +22,7 @@ extern crate std; mod ast; mod builtins; mod engine; +mod indexchecker; mod interpreter; mod lexer; mod number; diff --git a/src/parser.rs b/src/parser.rs index 41099fad..ce51a7b4 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -21,6 +21,13 @@ pub struct Parser<'source> { end: u32, future_keywords: BTreeMap>, 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 { + fn read_number(&mut self, span: Span) -> Result { 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 { 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::(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> { @@ -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> { diff --git a/src/scheduler.rs b/src/scheduler.rs index f80c77d4..16c1d1a9 100644 --- a/src/scheduler.rs +++ b/src/scheduler.rs @@ -219,7 +219,12 @@ pub fn traverse(expr: &Ref, f: &mut dyn FnMut(&Ref) -> Result) 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, 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> { 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>, ) -> 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 diff --git a/src/utils.rs b/src/utils.rs index c60c7fb2..e0ca2d57 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -19,13 +19,13 @@ pub fn get_path_string(refr: &Expr, document: Option<&str>) -> Result { 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 { 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), } diff --git a/tests/parser/cases/every/every.yaml b/tests/parser/cases/every/every.yaml index b81bab0f..686dba60 100644 --- a/tests/parser/cases/every/every.yaml +++ b/tests/parser/cases/every/every.yaml @@ -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 + diff --git a/tests/parser/cases/expressions/arithmetic.yaml b/tests/parser/cases/expressions/arithmetic.yaml index 483178f6..83f76ba2 100644 --- a/tests/parser/cases/expressions/arithmetic.yaml +++ b/tests/parser/cases/expressions/arithmetic.yaml @@ -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: [] diff --git a/tests/parser/cases/expressions/array-compr.yaml b/tests/parser/cases/expressions/array-compr.yaml index 1da6b031..ecfdfbf1 100644 --- a/tests/parser/cases/expressions/array-compr.yaml +++ b/tests/parser/cases/expressions/array-compr.yaml @@ -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: [] diff --git a/tests/parser/cases/expressions/array.yaml b/tests/parser/cases/expressions/array.yaml index bcd84457..012aa346 100644 --- a/tests/parser/cases/expressions/array.yaml +++ b/tests/parser/cases/expressions/array.yaml @@ -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 diff --git a/tests/parser/cases/expressions/bin.yaml b/tests/parser/cases/expressions/bin.yaml index c1aa0244..94f5f751 100644 --- a/tests/parser/cases/expressions/bin.yaml +++ b/tests/parser/cases/expressions/bin.yaml @@ -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: [] - + diff --git a/tests/parser/cases/expressions/bool.yaml b/tests/parser/cases/expressions/bool.yaml index 4ae55036..545f409f 100644 --- a/tests/parser/cases/expressions/bool.yaml +++ b/tests/parser/cases/expressions/bool.yaml @@ -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: [] diff --git a/tests/parser/cases/expressions/call.yaml b/tests/parser/cases/expressions/call.yaml index 52983e90..c9cde60e 100644 --- a/tests/parser/cases/expressions/call.yaml +++ b/tests/parser/cases/expressions/call.yaml @@ -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: [] diff --git a/tests/parser/cases/expressions/in.yaml b/tests/parser/cases/expressions/in.yaml index fc742c39..b52358ef 100644 --- a/tests/parser/cases/expressions/in.yaml +++ b/tests/parser/cases/expressions/in.yaml @@ -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: [] diff --git a/tests/parser/cases/expressions/membership.yaml b/tests/parser/cases/expressions/membership.yaml index 5c3183f1..8e48af02 100644 --- a/tests/parser/cases/expressions/membership.yaml +++ b/tests/parser/cases/expressions/membership.yaml @@ -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: [] diff --git a/tests/parser/cases/expressions/object.yaml b/tests/parser/cases/expressions/object.yaml index 25892e5a..fd5ac32e 100644 --- a/tests/parser/cases/expressions/object.yaml +++ b/tests/parser/cases/expressions/object.yaml @@ -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: [] diff --git a/tests/parser/cases/expressions/set-compr.yaml b/tests/parser/cases/expressions/set-compr.yaml index dec0fe7b..cbf7780e 100644 --- a/tests/parser/cases/expressions/set-compr.yaml +++ b/tests/parser/cases/expressions/set-compr.yaml @@ -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: [] diff --git a/tests/parser/cases/expressions/set.yaml b/tests/parser/cases/expressions/set.yaml index 0a432420..7d8e0458 100644 --- a/tests/parser/cases/expressions/set.yaml +++ b/tests/parser/cases/expressions/set.yaml @@ -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 diff --git a/tests/parser/cases/import/future.yaml b/tests/parser/cases/import/future.yaml index 3f635e51..f538d995 100644 --- a/tests/parser/cases/import/future.yaml +++ b/tests/parser/cases/import/future.yaml @@ -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: | diff --git a/tests/parser/cases/import/import.yaml b/tests/parser/cases/import/import.yaml index 3cbf2f3d..b62fe355 100644 --- a/tests/parser/cases/import/import.yaml +++ b/tests/parser/cases/import/import.yaml @@ -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 diff --git a/tests/parser/cases/package/package.yaml b/tests/parser/cases/package/package.yaml index a3db6747..0d20250c 100644 --- a/tests/parser/cases/package/package.yaml +++ b/tests/parser/cases/package/package.yaml @@ -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 diff --git a/tests/parser/cases/rules/basic.yaml b/tests/parser/cases/rules/basic.yaml index 0025628d..b76b82da 100644 --- a/tests/parser/cases/rules/basic.yaml +++ b/tests/parser/cases/rules/basic.yaml @@ -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: [] - + diff --git a/tests/parser/cases/rules/else.yaml b/tests/parser/cases/rules/else.yaml index 2d0c85c3..1f7c4a96 100644 --- a/tests/parser/cases/rules/else.yaml +++ b/tests/parser/cases/rules/else.yaml @@ -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: | diff --git a/tests/parser/cases/rules/set.yaml b/tests/parser/cases/rules/set.yaml index 9e52a040..a3fed7c5 100644 --- a/tests/parser/cases/rules/set.yaml +++ b/tests/parser/cases/rules/set.yaml @@ -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 diff --git a/tests/parser/cases/some/some.in.yaml b/tests/parser/cases/some/some.in.yaml index ef471907..479d4d74 100644 --- a/tests/parser/cases/some/some.in.yaml +++ b/tests/parser/cases/some/some.in.yaml @@ -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 diff --git a/tests/parser/cases/some/some.vars.yaml b/tests/parser/cases/some/some.vars.yaml index 699b6b98..e3a294d4 100644 --- a/tests/parser/cases/some/some.vars.yaml +++ b/tests/parser/cases/some/some.vars.yaml @@ -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 diff --git a/tests/parser/mod.rs b/tests/parser/mod.rs index fadf2d64..00a26e63 100644 --- a/tests/parser/mod.rs +++ b/tests/parser/mod.rs @@ -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>, policy: Option>, error: Option, + + #[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)?; }