From 6dbae123151c35aad2e3699c3241be2d22cb8726 Mon Sep 17 00:00:00 2001 From: Jeff Date: Fri, 23 Feb 2024 07:40:01 -0500 Subject: [PATCH] Experiment with new parser --- Cargo.lock | 1980 +- Cargo.toml | 39 +- README.md | 100 - build.rs | 17 - docs/assets/debugging.png | Bin 38656 -> 0 bytes docs/assets/example_0.png | Bin 68418 -> 0 bytes docs/assets/syntax_error.png | Bin 32357 -> 0 bytes docs/assets/type_error.png | Bin 18241 -> 0 bytes docs/language.md | 515 - examples/assets/jq_data.json | 7883 ----- examples/assets/seaCreatures.json | 6 - examples/async.ds | 19 - examples/async_commands.ds | 17 - examples/async_download.ds | 20 - examples/clue_solver.ds | 53 - examples/download.ds | 10 - examples/fibonacci.ds | 9 - examples/fizzbuzz.ds | 18 - examples/guessing_game.ds | 26 - examples/hello_world.ds | 1 - examples/jq_data.ds | 12 - examples/random.ds | 13 - examples/sea_creatures.ds | 19 - scripts/bench.fish | 35 - scripts/build_debug.fish | 8 - scripts/build_release.fish | 8 - scripts/test.fish | 9 - src/abstract_tree/as.rs | 132 - src/abstract_tree/assignment.rs | 186 - src/abstract_tree/assignment_operator.rs | 62 - src/abstract_tree/block.rs | 170 - src/abstract_tree/command.rs | 76 - src/abstract_tree/enum_defintion.rs | 92 - src/abstract_tree/enum_pattern.rs | 70 - src/abstract_tree/expression.rs | 120 - src/abstract_tree/for.rs | 153 - src/abstract_tree/function_call.rs | 202 - src/abstract_tree/function_expression.rs | 91 - src/abstract_tree/function_node.rs | 179 - src/abstract_tree/identifier.rs | 167 - src/abstract_tree/if_else.rs | 160 - src/abstract_tree/index.rs | 134 - src/abstract_tree/index_assignment.rs | 96 - src/abstract_tree/index_expression.rs | 98 - src/abstract_tree/logic.rs | 95 - src/abstract_tree/logic_operator.rs | 93 - src/abstract_tree/map_node.rs | 117 - src/abstract_tree/match.rs | 145 - src/abstract_tree/match_pattern.rs | 64 - src/abstract_tree/math.rs | 74 - src/abstract_tree/math_operator.rs | 69 - src/abstract_tree/mod.rs | 178 - src/abstract_tree/new.rs | 45 - src/abstract_tree/statement.rs | 202 - src/abstract_tree/struct_definition.rs | 120 - src/abstract_tree/type.rs | 394 - src/abstract_tree/type_definition.rs | 73 - src/abstract_tree/type_specification.rs | 56 - src/abstract_tree/value_node.rs | 357 - src/abstract_tree/while.rs | 64 - src/built_in_functions/fs.rs | 59 - src/built_in_functions/io.rs | 56 - src/built_in_functions/json.rs | 77 - src/built_in_functions/mod.rs | 204 - src/built_in_functions/str.rs | 585 - src/built_in_identifiers.rs | 51 - src/built_in_type_definitions.rs | 56 - src/built_in_types.rs | 29 - src/built_in_values.rs | 204 - src/context/mod.rs | 395 - src/context/usage_counter.rs | 74 - src/context/value_data.rs | 8 - src/error/mod.rs | 110 - src/error/runtime_error.rs | 193 - src/error/rw_lock_error.rs | 30 - src/error/syntax_error.rs | 126 - src/error/validation_error.rs | 283 - src/interpret.rs | 157 - src/lib.rs | 174 +- src/main.rs | 407 - src/value/enum_instance.rs | 40 - src/value/function.rs | 50 - src/value/list.rs | 119 - src/value/map.rs | 90 - src/value/mod.rs | 885 - src/value/struct_instance.rs | 45 - tests/as.rs | 53 - tests/assignment.rs | 57 - tests/block.rs | 32 - tests/built_in_string_functions.rs | 49 - tests/built_in_type_definitions.rs | 71 - tests/built_in_values.rs | 31 - tests/commands.rs | 14 - tests/dust_examples.rs | 81 - tests/enums.rs | 88 - tests/for_loop.rs | 99 - tests/format.rs | 57 - tests/functions.rs | 136 - tests/if_else.rs | 61 - tests/index.rs | 41 - tests/logic.rs | 8 - tests/match.rs | 50 - tests/root.rs | 29 - tests/structs.rs | 58 - tests/types.rs | 85 - tests/value.rs | 159 - tests/while.rs | 14 - tree-sitter-dust/.prettierignore | 1 - tree-sitter-dust/.prettierrc | 5 - tree-sitter-dust/corpus/as.txt | 58 - tree-sitter-dust/corpus/assignment.txt | 88 - tree-sitter-dust/corpus/async.txt | 79 - tree-sitter-dust/corpus/blocks.txt | 58 - tree-sitter-dust/corpus/commands.txt | 161 - tree-sitter-dust/corpus/comments.txt | 49 - tree-sitter-dust/corpus/enums.txt | 129 - tree-sitter-dust/corpus/examples.txt | 80 - tree-sitter-dust/corpus/for.txt | 72 - tree-sitter-dust/corpus/functions.txt | 249 - tree-sitter-dust/corpus/identifiers.txt | 28 - tree-sitter-dust/corpus/if_else.txt | 274 - tree-sitter-dust/corpus/index.txt | 117 - tree-sitter-dust/corpus/lists.txt | 50 - tree-sitter-dust/corpus/logic.txt | 103 - tree-sitter-dust/corpus/maps.txt | 119 - tree-sitter-dust/corpus/match.txt | 74 - tree-sitter-dust/corpus/pipe.txt | 42 - tree-sitter-dust/corpus/range.txt | 14 - tree-sitter-dust/corpus/statements.txt | 145 - tree-sitter-dust/corpus/structure.txt | 73 - tree-sitter-dust/corpus/types.txt | 96 - tree-sitter-dust/corpus/values.txt | 159 - tree-sitter-dust/corpus/while.txt | 70 - tree-sitter-dust/grammar.js | 559 - tree-sitter-dust/highlights.scm | 71 - tree-sitter-dust/package-lock.json | 50 - tree-sitter-dust/package.json | 25 - tree-sitter-dust/src/grammar.json | 1738 - tree-sitter-dust/src/node-types.json | 1173 - tree-sitter-dust/src/parser.c | 34980 -------------------- tree-sitter-dust/src/tree_sitter/parser.h | 224 - 141 files changed, 185 insertions(+), 61959 deletions(-) delete mode 100644 README.md delete mode 100644 build.rs delete mode 100644 docs/assets/debugging.png delete mode 100644 docs/assets/example_0.png delete mode 100644 docs/assets/syntax_error.png delete mode 100644 docs/assets/type_error.png delete mode 100644 docs/language.md delete mode 100644 examples/assets/jq_data.json delete mode 100644 examples/assets/seaCreatures.json delete mode 100644 examples/async.ds delete mode 100644 examples/async_commands.ds delete mode 100644 examples/async_download.ds delete mode 100644 examples/clue_solver.ds delete mode 100644 examples/download.ds delete mode 100644 examples/fibonacci.ds delete mode 100644 examples/fizzbuzz.ds delete mode 100644 examples/guessing_game.ds delete mode 100644 examples/hello_world.ds delete mode 100644 examples/jq_data.ds delete mode 100644 examples/random.ds delete mode 100644 examples/sea_creatures.ds delete mode 100755 scripts/bench.fish delete mode 100755 scripts/build_debug.fish delete mode 100755 scripts/build_release.fish delete mode 100755 scripts/test.fish delete mode 100644 src/abstract_tree/as.rs delete mode 100644 src/abstract_tree/assignment.rs delete mode 100644 src/abstract_tree/assignment_operator.rs delete mode 100644 src/abstract_tree/block.rs delete mode 100644 src/abstract_tree/command.rs delete mode 100644 src/abstract_tree/enum_defintion.rs delete mode 100644 src/abstract_tree/enum_pattern.rs delete mode 100644 src/abstract_tree/expression.rs delete mode 100644 src/abstract_tree/for.rs delete mode 100644 src/abstract_tree/function_call.rs delete mode 100644 src/abstract_tree/function_expression.rs delete mode 100644 src/abstract_tree/function_node.rs delete mode 100644 src/abstract_tree/identifier.rs delete mode 100644 src/abstract_tree/if_else.rs delete mode 100644 src/abstract_tree/index.rs delete mode 100644 src/abstract_tree/index_assignment.rs delete mode 100644 src/abstract_tree/index_expression.rs delete mode 100644 src/abstract_tree/logic.rs delete mode 100644 src/abstract_tree/logic_operator.rs delete mode 100644 src/abstract_tree/map_node.rs delete mode 100644 src/abstract_tree/match.rs delete mode 100644 src/abstract_tree/match_pattern.rs delete mode 100644 src/abstract_tree/math.rs delete mode 100644 src/abstract_tree/math_operator.rs delete mode 100644 src/abstract_tree/mod.rs delete mode 100644 src/abstract_tree/new.rs delete mode 100644 src/abstract_tree/statement.rs delete mode 100644 src/abstract_tree/struct_definition.rs delete mode 100644 src/abstract_tree/type.rs delete mode 100644 src/abstract_tree/type_definition.rs delete mode 100644 src/abstract_tree/type_specification.rs delete mode 100644 src/abstract_tree/value_node.rs delete mode 100644 src/abstract_tree/while.rs delete mode 100644 src/built_in_functions/fs.rs delete mode 100644 src/built_in_functions/io.rs delete mode 100644 src/built_in_functions/json.rs delete mode 100644 src/built_in_functions/mod.rs delete mode 100644 src/built_in_functions/str.rs delete mode 100644 src/built_in_identifiers.rs delete mode 100644 src/built_in_type_definitions.rs delete mode 100644 src/built_in_types.rs delete mode 100644 src/built_in_values.rs delete mode 100644 src/context/mod.rs delete mode 100644 src/context/usage_counter.rs delete mode 100644 src/context/value_data.rs delete mode 100644 src/error/mod.rs delete mode 100644 src/error/runtime_error.rs delete mode 100644 src/error/rw_lock_error.rs delete mode 100644 src/error/syntax_error.rs delete mode 100644 src/error/validation_error.rs delete mode 100644 src/interpret.rs delete mode 100644 src/main.rs delete mode 100644 src/value/enum_instance.rs delete mode 100644 src/value/function.rs delete mode 100644 src/value/list.rs delete mode 100644 src/value/map.rs delete mode 100644 src/value/mod.rs delete mode 100644 src/value/struct_instance.rs delete mode 100644 tests/as.rs delete mode 100644 tests/assignment.rs delete mode 100644 tests/block.rs delete mode 100644 tests/built_in_string_functions.rs delete mode 100644 tests/built_in_type_definitions.rs delete mode 100644 tests/built_in_values.rs delete mode 100644 tests/commands.rs delete mode 100644 tests/dust_examples.rs delete mode 100644 tests/enums.rs delete mode 100644 tests/for_loop.rs delete mode 100644 tests/format.rs delete mode 100644 tests/functions.rs delete mode 100644 tests/if_else.rs delete mode 100644 tests/index.rs delete mode 100644 tests/logic.rs delete mode 100644 tests/match.rs delete mode 100644 tests/root.rs delete mode 100644 tests/structs.rs delete mode 100644 tests/types.rs delete mode 100644 tests/value.rs delete mode 100644 tests/while.rs delete mode 100644 tree-sitter-dust/.prettierignore delete mode 100644 tree-sitter-dust/.prettierrc delete mode 100644 tree-sitter-dust/corpus/as.txt delete mode 100644 tree-sitter-dust/corpus/assignment.txt delete mode 100644 tree-sitter-dust/corpus/async.txt delete mode 100644 tree-sitter-dust/corpus/blocks.txt delete mode 100644 tree-sitter-dust/corpus/commands.txt delete mode 100644 tree-sitter-dust/corpus/comments.txt delete mode 100644 tree-sitter-dust/corpus/enums.txt delete mode 100644 tree-sitter-dust/corpus/examples.txt delete mode 100644 tree-sitter-dust/corpus/for.txt delete mode 100644 tree-sitter-dust/corpus/functions.txt delete mode 100644 tree-sitter-dust/corpus/identifiers.txt delete mode 100644 tree-sitter-dust/corpus/if_else.txt delete mode 100644 tree-sitter-dust/corpus/index.txt delete mode 100644 tree-sitter-dust/corpus/lists.txt delete mode 100644 tree-sitter-dust/corpus/logic.txt delete mode 100644 tree-sitter-dust/corpus/maps.txt delete mode 100644 tree-sitter-dust/corpus/match.txt delete mode 100644 tree-sitter-dust/corpus/pipe.txt delete mode 100644 tree-sitter-dust/corpus/range.txt delete mode 100644 tree-sitter-dust/corpus/statements.txt delete mode 100644 tree-sitter-dust/corpus/structure.txt delete mode 100644 tree-sitter-dust/corpus/types.txt delete mode 100644 tree-sitter-dust/corpus/values.txt delete mode 100644 tree-sitter-dust/corpus/while.txt delete mode 100644 tree-sitter-dust/grammar.js delete mode 100644 tree-sitter-dust/highlights.scm delete mode 100644 tree-sitter-dust/package-lock.json delete mode 100644 tree-sitter-dust/package.json delete mode 100644 tree-sitter-dust/src/grammar.json delete mode 100644 tree-sitter-dust/src/node-types.json delete mode 100644 tree-sitter-dust/src/parser.c delete mode 100644 tree-sitter-dust/src/tree_sitter/parser.h diff --git a/Cargo.lock b/Cargo.lock index 51e4517..612dc6d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,26 +2,11 @@ # It is not intended for manual editing. version = 3 -[[package]] -name = "addr2line" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - [[package]] name = "ahash" -version = "0.8.7" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77c3a9648d43b9cd48db467b3f87fdd6e146bcc88ab0180006cef2179fe11d01" +checksum = "d713b3834d76b85304d4d525563c1276e2e30dc97cc67bfb4585a4a29fc2c89f" dependencies = [ "cfg-if", "once_cell", @@ -29,15 +14,6 @@ dependencies = [ "zerocopy", ] -[[package]] -name = "aho-corasick" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" -dependencies = [ - "memchr", -] - [[package]] name = "allocator-api2" version = "0.2.16" @@ -45,136 +21,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" [[package]] -name = "android-tzdata" -version = "0.1.1" +name = "ariadne" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +checksum = "dd002a6223f12c7a95cdd4b1cb3a0149d22d37f7a9ecdb2cb691a071fe236c29" dependencies = [ - "libc", + "unicode-width", + "yansi", ] -[[package]] -name = "anstream" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d664a92ecae85fd0a7392615844904654d1d5f5514837f471ddef4a057aba1b6" -dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "utf8parse", -] - -[[package]] -name = "anstyle" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" - -[[package]] -name = "anstyle-parse" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" -dependencies = [ - "utf8parse", -] - -[[package]] -name = "anstyle-query" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" -dependencies = [ - "windows-sys 0.52.0", -] - -[[package]] -name = "anstyle-wincon" -version = "3.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" -dependencies = [ - "anstyle", - "windows-sys 0.52.0", -] - -[[package]] -name = "autocfg" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" - -[[package]] -name = "backtrace" -version = "0.3.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" -dependencies = [ - "addr2line", - "cc", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", -] - -[[package]] -name = "base64" -version = "0.21.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" -dependencies = [ - "serde", -] - -[[package]] -name = "block" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" - -[[package]] -name = "bumpalo" -version = "3.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" - -[[package]] -name = "bytes" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" - [[package]] name = "cc" -version = "1.0.83" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" -dependencies = [ - "libc", -] +checksum = "7f9fa1897e4325be0d68d48df6aa1a71ac2ed4d27723887e7754192705350730" [[package]] name = "cfg-if" @@ -183,426 +43,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] -name = "chrono" -version = "0.4.32" +name = "chumsky" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41daef31d7a747c5c847246f36de49ced6f7403b4cdabc807a97b5cc184cda7a" +checksum = "8eebd66744a15ded14960ab4ccdbfb51ad3b81f51f3f04a80adac98c985396c9" dependencies = [ - "android-tzdata", - "iana-time-zone", - "num-traits", - "serde", - "windows-targets 0.52.0", -] - -[[package]] -name = "clap" -version = "4.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcfab8ba68f3668e89f6ff60f5b205cea56aa7b769451a59f34b8682f51c056d" -dependencies = [ - "clap_builder", - "clap_derive", -] - -[[package]] -name = "clap_builder" -version = "4.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb7fb5e4e979aec3be7791562fcba452f94ad85e954da024396433e0e25a79e9" -dependencies = [ - "anstream", - "anstyle", - "clap_lex", - "strsim", -] - -[[package]] -name = "clap_derive" -version = "4.4.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "clap_lex" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" - -[[package]] -name = "clipboard" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25a904646c0340239dcf7c51677b33928bf24fdf424b79a57909c0109075b2e7" -dependencies = [ - "clipboard-win", - "objc", - "objc-foundation", - "objc_id", - "x11-clipboard", -] - -[[package]] -name = "clipboard-win" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3a093d6fed558e5fe24c3dfc85a68bb68f1c824f440d3ba5aca189e2998786b" -dependencies = [ - "winapi", -] - -[[package]] -name = "colorchoice" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" - -[[package]] -name = "colored" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbf2150cce219b664a8a70df7a1f933836724b503f8a413af9365b4dcc4d90b8" -dependencies = [ - "lazy_static", - "windows-sys 0.48.0", -] - -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" - -[[package]] -name = "crossbeam-deque" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fca89a0e215bab21874660c67903c5f143333cab1da83d041c7ded6053774751" -dependencies = [ - "cfg-if", - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e3681d554572a651dda4186cd47240627c3d0114d45a95f6ad27f2f22e7548d" -dependencies = [ - "autocfg", - "cfg-if", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3a430a770ebd84726f584a90ee7f020d28db52c6d02138900f22341f866d39c" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "crossterm" -version = "0.27.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f476fe445d41c9e991fd07515a6f463074b782242ccf4a5b7b1d1012e70824df" -dependencies = [ - "bitflags 2.4.1", - "crossterm_winapi", - "libc", - "mio", - "parking_lot", - "serde", - "signal-hook", - "signal-hook-mio", - "winapi", -] - -[[package]] -name = "crossterm_winapi" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b" -dependencies = [ - "winapi", -] - -[[package]] -name = "csv" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac574ff4d437a7b5ad237ef331c17ccca63c46479e5b5453eb8e10bb99a759fe" -dependencies = [ - "csv-core", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "csv-core" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5efa2b3d7902f4b634a20cae3c9c4e6209dc4779feb6863329607560143efa70" -dependencies = [ - "memchr", + "hashbrown", + "stacker", ] [[package]] name = "dust-lang" -version = "0.4.2" +version = "0.5.0" dependencies = [ - "cc", - "clap", - "colored", - "crossterm", - "csv", - "enum-iterator", - "env_logger", - "getrandom", - "humantime", - "libc", - "log", - "lyneate", - "nu-ansi-term", - "rand", - "rayon", - "reedline", - "reqwest", - "serde", - "serde_json", - "stanza", - "toml", - "tree-sitter", - "wasm-bindgen-futures", -] - -[[package]] -name = "either" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" - -[[package]] -name = "encoding_rs" -version = "0.8.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "enum-iterator" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7add3873b5dd076766ee79c8e406ad1a472c385476b9e38849f8eec24f1be689" -dependencies = [ - "enum-iterator-derive", -] - -[[package]] -name = "enum-iterator-derive" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eecf8589574ce9b895052fa12d69af7a233f99e6107f5cb8dd1044f2a17bfdcb" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "env_logger" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95b3f3e67048839cb0d0781f445682a35113da7121f7c949db0e2be96a4fbece" -dependencies = [ - "humantime", - "is-terminal", - "log", - "regex", - "termcolor", -] - -[[package]] -name = "equivalent" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" - -[[package]] -name = "errno" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "fallible-iterator" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" - -[[package]] -name = "fallible-streaming-iterator" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" - -[[package]] -name = "fastrand" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" - -[[package]] -name = "fd-lock" -version = "3.0.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef033ed5e9bad94e55838ca0ca906db0e043f517adda0c8b79c7a8c66c93c1b5" -dependencies = [ - "cfg-if", - "rustix", - "windows-sys 0.48.0", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - -[[package]] -name = "form_urlencoded" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "futures-channel" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" -dependencies = [ - "futures-core", -] - -[[package]] -name = "futures-core" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" - -[[package]] -name = "futures-io" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" - -[[package]] -name = "futures-sink" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" - -[[package]] -name = "futures-task" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" - -[[package]] -name = "futures-util" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" -dependencies = [ - "futures-core", - "futures-io", - "futures-task", - "memchr", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "getrandom" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" -dependencies = [ - "cfg-if", - "js-sys", - "libc", - "wasi", - "wasm-bindgen", -] - -[[package]] -name = "gimli" -version = "0.28.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" - -[[package]] -name = "h2" -version = "0.3.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d6250322ef6e60f93f9a2162799302cd6f68f79f6e5d85c8c16f14d1d958178" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http", - "indexmap", - "slab", - "tokio", - "tokio-util", - "tracing", + "ariadne", + "chumsky", ] [[package]] @@ -615,368 +70,11 @@ dependencies = [ "allocator-api2", ] -[[package]] -name = "hashlink" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7" -dependencies = [ - "hashbrown", -] - -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - -[[package]] -name = "hermit-abi" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" - -[[package]] -name = "http" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http-body" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" -dependencies = [ - "bytes", - "http", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" - -[[package]] -name = "httpdate" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" - -[[package]] -name = "humantime" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" - -[[package]] -name = "hyper" -version = "0.14.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", - "want", -] - -[[package]] -name = "hyper-tls" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" -dependencies = [ - "bytes", - "hyper", - "native-tls", - "tokio", - "tokio-native-tls", -] - -[[package]] -name = "iana-time-zone" -version = "0.1.59" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6a67363e2aa4443928ce15e57ebae94fd8949958fd1223c4cfc0cd473ad7539" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "wasm-bindgen", - "windows-core", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -dependencies = [ - "cc", -] - -[[package]] -name = "idna" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" -dependencies = [ - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "indexmap" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" -dependencies = [ - "equivalent", - "hashbrown", -] - -[[package]] -name = "ipnet" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" - -[[package]] -name = "is-terminal" -version = "0.4.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bad00257d07be169d870ab665980b06cdb366d792ad690bf2e76876dc503455" -dependencies = [ - "hermit-abi", - "rustix", - "windows-sys 0.52.0", -] - -[[package]] -name = "itertools" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25db6b064527c5d482d0423354fcd07a89a2dfe07b67892e62411946db7f07b0" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" - -[[package]] -name = "js-sys" -version = "0.3.66" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cee9c64da59eae3b50095c18d3e74f8b73c0b86d2792824ff01bbce68ba229ca" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" - [[package]] name = "libc" -version = "0.2.151" +version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" - -[[package]] -name = "libsqlite3-sys" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afc22eff61b133b115c6e8c74e818c628d6d5e7a502afea6f64dee076dd94326" -dependencies = [ - "cc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "linux-raw-sys" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456" - -[[package]] -name = "lock_api" -version = "0.4.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" - -[[package]] -name = "lyneate" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db93f0347ea71252796f5c6a61f2b75ed8434635ab2ad84238837a89125fa5e3" -dependencies = [ - "colored", - "widestring", -] - -[[package]] -name = "malloc_buf" -version = "0.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" -dependencies = [ - "libc", -] - -[[package]] -name = "memchr" -version = "2.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" - -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "miniz_oxide" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" -dependencies = [ - "adler", -] - -[[package]] -name = "mio" -version = "0.8.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" -dependencies = [ - "libc", - "log", - "wasi", - "windows-sys 0.48.0", -] - -[[package]] -name = "native-tls" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" -dependencies = [ - "lazy_static", - "libc", - "log", - "openssl", - "openssl-probe", - "openssl-sys", - "schannel", - "security-framework", - "security-framework-sys", - "tempfile", -] - -[[package]] -name = "nu-ansi-term" -version = "0.49.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c073d3c1930d0751774acf49e66653acecb416c3a54c6ec095a9b11caddb5a68" -dependencies = [ - "windows-sys 0.48.0", -] - -[[package]] -name = "num-traits" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" -dependencies = [ - "autocfg", -] - -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "objc" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" -dependencies = [ - "malloc_buf", -] - -[[package]] -name = "objc-foundation" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9" -dependencies = [ - "block", - "objc", - "objc_id", -] - -[[package]] -name = "objc_id" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" -dependencies = [ - "objc", -] - -[[package]] -name = "object" -version = "0.32.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" -dependencies = [ - "memchr", -] +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" [[package]] name = "once_cell" @@ -984,883 +82,75 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" -[[package]] -name = "openssl" -version = "0.10.62" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cde4d2d9200ad5909f8dac647e29482e07c3a35de8a13fce7c9c7747ad9f671" -dependencies = [ - "bitflags 2.4.1", - "cfg-if", - "foreign-types", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", -] - -[[package]] -name = "openssl-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "openssl-probe" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" - -[[package]] -name = "openssl-sys" -version = "0.9.98" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1665caf8ab2dc9aef43d1c0023bd904633a6a05cb30b0ad59bec2ae986e57a7" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "parking_lot" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-targets 0.48.5", -] - -[[package]] -name = "percent-encoding" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" - -[[package]] -name = "pin-project-lite" -version = "0.2.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "pkg-config" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69d3587f8a9e599cc7ec2c00e331f71c4e69a5f9a4b8a6efd5b07466b9736f9a" - -[[package]] -name = "ppv-lite86" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" - [[package]] name = "proc-macro2" -version = "1.0.73" +version = "1.0.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dd5e8a1f1029c43224ad5898e50140c2aebb1705f19e67c918ebf5b9e797fe1" +checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" dependencies = [ "unicode-ident", ] +[[package]] +name = "psm" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5787f7cda34e3033a72192c018bc5883100330f362ef279a8cbccfce8bb4e874" +dependencies = [ + "cc", +] + [[package]] name = "quote" -version = "1.0.34" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22a37c9326af5ed140c86a46655b5278de879853be5573c01df185b6f49a580a" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" dependencies = [ "proc-macro2", ] [[package]] -name = "rand" -version = "0.8.5" +name = "stacker" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +checksum = "c886bd4480155fd3ef527d45e9ac8dd7118a898a46530b7b94c3e21866259fce" dependencies = [ + "cc", + "cfg-if", "libc", - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom", -] - -[[package]] -name = "rayon" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c27db03db7734835b3f53954b534c91069375ce6ccaa2e065441e07d9b6cdb1" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", -] - -[[package]] -name = "redox_syscall" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "reedline" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f4e89a0f80909b3ca4bca9759ed37e4bfddb6f5d2ffb1b4ceb2b1638a3e1eb" -dependencies = [ - "chrono", - "clipboard", - "crossterm", - "fd-lock", - "itertools", - "nu-ansi-term", - "rusqlite", - "serde", - "serde_json", - "strip-ansi-escapes", - "strum", - "strum_macros", - "thiserror", - "unicode-segmentation", - "unicode-width", -] - -[[package]] -name = "regex" -version = "1.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" - -[[package]] -name = "reqwest" -version = "0.11.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37b1ae8d9ac08420c66222fb9096fc5de435c3c48542bc5336c51892cffafb41" -dependencies = [ - "base64", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "hyper", - "hyper-tls", - "ipnet", - "js-sys", - "log", - "mime", - "native-tls", - "once_cell", - "percent-encoding", - "pin-project-lite", - "serde", - "serde_json", - "serde_urlencoded", - "system-configuration", - "tokio", - "tokio-native-tls", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "winreg", -] - -[[package]] -name = "rusqlite" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "549b9d036d571d42e6e85d1c1425e2ac83491075078ca9a15be021c56b1641f2" -dependencies = [ - "bitflags 2.4.1", - "fallible-iterator", - "fallible-streaming-iterator", - "hashlink", - "libsqlite3-sys", - "smallvec", -] - -[[package]] -name = "rustc-demangle" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" - -[[package]] -name = "rustix" -version = "0.38.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72e572a5e8ca657d7366229cdde4bd14c4eb5499a9573d4d366fe1b599daa316" -dependencies = [ - "bitflags 2.4.1", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.52.0", -] - -[[package]] -name = "rustversion" -version = "1.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" - -[[package]] -name = "ryu" -version = "1.0.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" - -[[package]] -name = "schannel" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" -dependencies = [ - "windows-sys 0.52.0", -] - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "security-framework" -version = "2.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "serde" -version = "1.0.193" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.193" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "serde_json" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb0652c533506ad7a2e353cce269330d6afd8bdfb6d75e0ace5b35aacbd7b9e9" -dependencies = [ - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serde_spanned" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "signal-hook" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801" -dependencies = [ - "libc", - "signal-hook-registry", -] - -[[package]] -name = "signal-hook-mio" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29ad2e15f37ec9a6cc544097b78a1ec90001e9f71b81338ca39f430adaca99af" -dependencies = [ - "libc", - "mio", - "signal-hook", -] - -[[package]] -name = "signal-hook-registry" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" -dependencies = [ - "libc", -] - -[[package]] -name = "slab" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] - -[[package]] -name = "smallvec" -version = "1.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" - -[[package]] -name = "socket2" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" -dependencies = [ - "libc", - "windows-sys 0.48.0", -] - -[[package]] -name = "stanza" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d230b987a5b524a015ded47fed54c5177598a71c90508acee1c5d0b4c955f74" - -[[package]] -name = "strip-ansi-escapes" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55ff8ef943b384c414f54aefa961dd2bd853add74ec75e7ac74cf91dba62bcfa" -dependencies = [ - "vte", -] - -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - -[[package]] -name = "strum" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" - -[[package]] -name = "strum_macros" -version = "0.25.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "rustversion", - "syn", + "psm", + "winapi", ] [[package]] name = "syn" -version = "2.0.44" +version = "2.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92d27c2c202598d05175a6dd3af46824b7f747f8d8e9b14c623f19fa5069735d" +checksum = "74f1bdc9872430ce9b75da68329d1c1746faf50ffac5f19e02b71e37ff881ffb" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] -[[package]] -name = "system-configuration" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "system-configuration-sys", -] - -[[package]] -name = "system-configuration-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "tempfile" -version = "3.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01ce4141aa927a6d1bd34a041795abd0db1cccba5d5f24b009f694bdf3a1f3fa" -dependencies = [ - "cfg-if", - "fastrand", - "redox_syscall", - "rustix", - "windows-sys 0.52.0", -] - -[[package]] -name = "termcolor" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff1bc3d3f05aff0403e8ac0d92ced918ec05b666a43f83297ccef5bea8a3d449" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "thiserror" -version = "1.0.53" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2cd5904763bad08ad5513ddbb12cf2ae273ca53fa9f68e843e236ec6dfccc09" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.53" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dcf4a824cce0aeacd6f38ae6f24234c8e80d68632338ebaa1443b5df9e29e19" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "tinyvec" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - -[[package]] -name = "tokio" -version = "1.35.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c89b4efa943be685f629b149f53829423f8f5531ea21249408e8e2f8671ec104" -dependencies = [ - "backtrace", - "bytes", - "libc", - "mio", - "num_cpus", - "pin-project-lite", - "socket2", - "windows-sys 0.48.0", -] - -[[package]] -name = "tokio-native-tls" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" -dependencies = [ - "native-tls", - "tokio", -] - -[[package]] -name = "tokio-util" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", - "tracing", -] - -[[package]] -name = "toml" -version = "0.8.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1a195ec8c9da26928f773888e0742ca3ca1040c6cd859c919c9f59c1954ab35" -dependencies = [ - "serde", - "serde_spanned", - "toml_datetime", - "toml_edit", -] - -[[package]] -name = "toml_datetime" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" -dependencies = [ - "serde", -] - -[[package]] -name = "toml_edit" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d34d383cd00a163b4a5b85053df514d45bc330f6de7737edfe0a93311d1eaa03" -dependencies = [ - "indexmap", - "serde", - "serde_spanned", - "toml_datetime", - "winnow", -] - -[[package]] -name = "tower-service" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" - -[[package]] -name = "tracing" -version = "0.1.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" -dependencies = [ - "pin-project-lite", - "tracing-core", -] - -[[package]] -name = "tracing-core" -version = "0.1.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" -dependencies = [ - "once_cell", -] - -[[package]] -name = "tree-sitter" -version = "0.20.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e747b1f9b7b931ed39a548c1fae149101497de3c1fc8d9e18c62c1a66c683d3d" -dependencies = [ - "cc", - "regex", -] - -[[package]] -name = "try-lock" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - -[[package]] -name = "unicode-bidi" -version = "0.3.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f2528f27a9eb2b21e69c95319b30bd0efd85d09c379741b0f78ea1d86be2416" - [[package]] name = "unicode-ident" version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" -[[package]] -name = "unicode-normalization" -version = "0.1.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unicode-segmentation" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" - [[package]] name = "unicode-width" version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" -[[package]] -name = "url" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", -] - -[[package]] -name = "utf8parse" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" - -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - [[package]] name = "version_check" version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" -[[package]] -name = "vte" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5022b5fbf9407086c180e9557be968742d839e68346af7792b8592489732197" -dependencies = [ - "utf8parse", - "vte_generate_state_changes", -] - -[[package]] -name = "vte_generate_state_changes" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d257817081c7dffcdbab24b9e62d2def62e2ff7d00b1c20062551e6cccc145ff" -dependencies = [ - "proc-macro2", - "quote", -] - -[[package]] -name = "want" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasm-bindgen" -version = "0.2.89" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ed0d4f68a3015cc185aff4db9506a015f4b96f95303897bfa23f846db54064e" -dependencies = [ - "cfg-if", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.89" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b56f625e64f3a1084ded111c4d5f477df9f8c92df113852fa5a374dbda78826" -dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.39" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac36a15a220124ac510204aec1c3e5db8a22ab06fd6706d881dc6149f8ed9a12" -dependencies = [ - "cfg-if", - "js-sys", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.89" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0162dbf37223cd2afce98f3d0785506dcb8d266223983e4b5b525859e6e182b2" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.89" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.89" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f" - -[[package]] -name = "web-sys" -version = "0.3.66" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50c24a44ec86bb68fbecd1b3efed7e85ea5621b39b35ef2766b66cd984f8010f" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "widestring" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "653f141f39ec16bba3c5abe400a0c60da7468261cc2cbf36805022876bc721a8" - [[package]] name = "winapi" version = "0.3.9" @@ -1877,15 +167,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" -[[package]] -name = "winapi-util" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" -dependencies = [ - "winapi", -] - [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" @@ -1893,183 +174,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] -name = "windows-core" -version = "0.52.0" +name = "yansi" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" -dependencies = [ - "windows-targets 0.52.0", -] - -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.5", -] - -[[package]] -name = "windows-sys" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" -dependencies = [ - "windows-targets 0.52.0", -] - -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", -] - -[[package]] -name = "windows-targets" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" -dependencies = [ - "windows_aarch64_gnullvm 0.52.0", - "windows_aarch64_msvc 0.52.0", - "windows_i686_gnu 0.52.0", - "windows_i686_msvc 0.52.0", - "windows_x86_64_gnu 0.52.0", - "windows_x86_64_gnullvm 0.52.0", - "windows_x86_64_msvc 0.52.0", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" - -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - -[[package]] -name = "windows_i686_gnu" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" - -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - -[[package]] -name = "windows_i686_msvc" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" - -[[package]] -name = "winnow" -version = "0.5.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97a4882e6b134d6c28953a387571f1acdd3496830d5e36c5e3a1075580ea641c" -dependencies = [ - "memchr", -] - -[[package]] -name = "winreg" -version = "0.50.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] - -[[package]] -name = "x11-clipboard" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89bd49c06c9eb5d98e6ba6536cf64ac9f7ee3a009b2f53996d405b3944f6bcea" -dependencies = [ - "xcb", -] - -[[package]] -name = "xcb" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e917a3f24142e9ff8be2414e36c649d47d6cc2ba81f16201cdef96e533e02de" -dependencies = [ - "libc", - "log", -] +checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" [[package]] name = "zerocopy" diff --git a/Cargo.toml b/Cargo.toml index 03c74ff..a4bf0a9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,16 +1,11 @@ [package] name = "dust-lang" description = "General purpose programming language" -version = "0.4.2" +version = "0.5.0" repository = "https://git.jeffa.io/jeff/dust.git" edition = "2021" license = "MIT" authors = ["Jeff Anderson"] -default-run = "dust" - -[[bin]] -name = "dust" -path = "src/main.rs" [profile.dev] opt-level = 1 @@ -18,33 +13,5 @@ opt-level = 1 opt-level = 3 [dependencies] -clap = { version = "4.4.4", features = ["derive"] } -csv = "1.2.2" -libc = "0.2.148" -log = "0.4.20" -rand = "0.8.5" -rayon = "1.8.0" -reqwest = { version = "0.11.20", features = ["blocking", "json"] } -serde = { version = "1.0.188", features = ["derive"] } -serde_json = "1.0.107" -toml = "0.8.1" -tree-sitter = "0.20.10" -enum-iterator = "1.4.1" -env_logger = "0.10" -reedline = { version = "0.28.0", features = ["clipboard", "sqlite"] } -crossterm = "0.27.0" -nu-ansi-term = "0.49.0" -humantime = "2.1.0" -stanza = "0.5.1" -colored = "2.1.0" -lyneate = "0.2.1" - -[target.'cfg(not(target_arch = "wasm32"))'.dependencies] -env_logger = "0.10" - -[target.'cfg(target_arch = "wasm32")'.dependencies] -getrandom = { version = "0.2", features = ["js"] } -wasm-bindgen-futures = "0.4" - -[build-dependencies] -cc = "1.0" +ariadne = "0.4.0" +chumsky = "0.9.3" diff --git a/README.md b/README.md deleted file mode 100644 index 98432d4..0000000 --- a/README.md +++ /dev/null @@ -1,100 +0,0 @@ -# Dust - -High-level programming language with effortless concurrency, automatic memory management, type safety and strict error handling. - -![Dust version of an example from The Rust Programming Language.](https://git.jeffa.io/jeff/dust/raw/branch/main/docs/assets/example_0.png) - - -- [Dust](#dust) - - [Features](#features) - - [Easy to Read and Write](#easy-to-read-and-write) - - [Effortless Concurrency](#effortless-concurrency) - - [Helpful Errors](#helpful-errors) - - [Static analysis](#static-analysis) - - [Debugging](#debugging) - - [Automatic Memory Management](#automatic-memory-management) - - [Error Handling](#error-handling) - - [Installation and Usage](#installation-and-usage) - - -## Features - -### Easy to Read and Write - -Dust has simple, easy-to-learn syntax. - -```js -output('Hello world!') -``` - -### Effortless Concurrency - -Write multi-threaded code as easily as you would write code for a single thread. - -```js -async { - output('Will this one print first?') - output('Or will this one?') - output('Who knows! Each "output" will run in its own thread!') -} -``` - -### Helpful Errors - -Dust shows you exactly where your code went wrong and suggests changes. - -![Example of syntax error output.](https://git.jeffa.io/jeff/dust/raw/branch/main/docs/assets/syntax_error.png) - -### Static analysis - -Your code is always validated for safety before it is run. - -![Example of type error output.](https://git.jeffa.io/jeff/dust/raw/branch/main/docs/assets/type_error.png) - -Dust - -### Debugging - -Just set the environment variable `DUST_LOG=info` and Dust will tell you exactly what your code is doing while it's doing it. If you set `DUST_LOG=trace`, it will output detailed logs about parsing, abstraction, validation, memory management and runtime. Here are some of the logs from the end of a simple [fizzbuzz example](https://git.jeffa.io/jeff/dust/src/branch/main/examples/fizzbuzz.ds). - -![Example of debug output.](https://git.jeffa.io/jeff/dust/raw/branch/main/docs/assets/debugging.png) - -### Automatic Memory Management - -Thanks to static analysis, Dust knows exactly how many times each variable is used. This allows Dust to free memory as soon as the variable will no longer be used, without any help from the user. - -### Error Handling - -Runtime errors are no problem with Dust. The `Result` type represents the output of an operation that might fail. The user must decide what to do in the case of an error. - -```dust -match io:stdin() { - Result::Ok(input) -> output("We read this input: " + input) - Result::Error(message) -> output("We got this error: " + message) -} -``` - -## Installation and Usage - -There are two ways to compile Dust. **It is best to clone the repository and compile the latest code**, otherwise the program may be a different version than the one shown on GitHub. Either way, you must have `rustup`, `cmake` and a C compiler installed. - -To install from the git repository: - -```fish -git clone https://git.jeffa.io/jeff/dust -cd dust -cargo run --release -``` - -To install with cargo: - -```fish -cargo install dust-lang -dust -``` - -## Benchmarks - -## Development Status - -Currently, Dust is being prepared for version 1.0. Until then, there may be breaking changes to the language and CLI. diff --git a/build.rs b/build.rs deleted file mode 100644 index d885190..0000000 --- a/build.rs +++ /dev/null @@ -1,17 +0,0 @@ -fn main() { - let src_dir = std::path::Path::new("tree-sitter-dust/src"); - let mut c_config = cc::Build::new(); - - c_config.include(src_dir); - c_config - .flag_if_supported("-Wno-unused-parameter") - .flag_if_supported("-Wno-unused-but-set-variable") - .flag_if_supported("-Wno-trigraphs"); - - let parser_path = src_dir.join("parser.c"); - - c_config.file(&parser_path); - c_config.compile("parser"); - - println!("cargo:rerun-if-changed={}", parser_path.to_str().unwrap()); -} diff --git a/docs/assets/debugging.png b/docs/assets/debugging.png deleted file mode 100644 index 592d8d06510bbb790ae4e26017c3d30bfccbd34c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38656 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 DQWW3A diff --git a/docs/assets/example_0.png b/docs/assets/example_0.png deleted file mode 100644 index bfcbb06f34659e68be43b0a98082814dc9a6da2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68418 zcmb@u1yq$^yY3BwAOQqtYs9g2cTcY}0yH%NCbIv1UbZdhlk|99_q zf8X9?oHNdm!C=L+p7lI4?s?z8>zew@N{c*si2o1)0pW?5sNhEggnMD&*XjWZc;!v` zk2LTH+3tgw!UOQn{ek{>@Ep%x=##y?m7%?pj;#TLk)@S|0gauWt$~51ow1cY45^tH z97OZ`AOTwg9eWci%a;l!76u4X-~j{2OJM`umyGm`%rEIVI2qVEnHgWoO1%`4SHR01 zr$az^i6AEUUcotWcizcaLGkY5@LUpqD~U7%3-g1-2eFsPA7G!Jw$`0h?het^?Sr3a zMP)|~r}Le>{G68852(Jp9(99}Rfs-B%LrfC>A$)A{`f2Ds^)su&y>mI18)8GevTBo zp*W_LS_}KZeO~gfPd_|(^;P!$A_Niqefr^hLI`Qt@0Xr_VA&}`|H<{^$B);{?-H$) zJRp|SCA>QQjT?xgV;?VW%E^fEm5r*%>OvA6<|w4&B~L;>?Gh2@tHmFr%=nw6gD?swJ{I$EmL zd9P-vPtICbXCyhsHVko+d^b!~`)xtn{Z;QySI3&OvP0;|BmA$fIH{sCQr@Gghxco>R8x+OE8(EBjDD5aG2g@d!~T7F_gW$yeuZr6gAsV<3i8;qE^E6Zpq!wf5kIHHi@89!sRa?I1xpnueG~04@ zo@_iHt6oI-Nx2^%Z%S)ucregQmz$qI$*9oK&~Ui7R&0`#X7?#lP*p`GjNOsDHPyp7 zXVURwW#`}^wwf9jtwt|WOY4Y#UY>YIF`pfkf7vMJ@uD7uG#L-ew?}v;2$3-{`N5Pt zG)XSS&1qK-Y-vohqaSSKUR|Hgm@tjP_t9OfT1gxbv zh~8?f84@^ofA79iP*yC12CQii^@aqG7?YBb-S?h)_J*r)KEXz^zAs*z8DFLG=+TKQ zkLCi8KR$QlwA12H7yK53j4YFAGz;6KI6q%+Wd^cYSa5K7`o{Hue*bn_;N6XLlW*9M zgg7BF{gb8C3sm1w`x|;%+M)|oWV08_`Cohl=;I{y4fPSUVN3ira;ebC?Ccb)vjMB! z_T0!Q>~gaW=|X`Q`~m_pPm5r|C`4%#02XPeF7Z zJn4y5CEsdCJBIi5iN|psJL;|om)Nvj(FSf`Ns_a9;G(zzy59d?)@o zgos0M{gN3Ba$GLYG$n@0?N$*lX=_m{1Wo5Hmg5z0w}%HOy31W8rVEC@Hb>ggN&F+q zA4NsIFrTj(YCGWc@R%?gx$XfKld*nFO`?dTR8osg)!w)(+mFf z`dy-olmkodMz~6uHLnEr;Ko5KQXaH#U@$Gli@&@Jgq}8IX4``nUIcFLxmt%ab#QUh zO)flL=zA1zGuX=a6U{sa_LF8WbhqHcTlRA{lRVDX7bPZbPRy*VAY!H0Xo+_={u!A` zV&I$9*ow%urk;HfXshu!n=@QfpPxf}1nXndqS;8Q-q4}PjUO-~i>z<}f$cb3S(75e zi3A*SF-Bed`{_oJ8%!AzJ?fGp)EpVORjuVEWFU0ke}x=TisVP*4bpVA8){UP;t#!j z9jlOl00Pjxoo!6O5PJtAT8BfR4k z@R==qhstYW=LfLlCUezhVa#sJ{j6F}E(!`90s^%>Drzw?u~+o;2#uODN7GEtu}xFD z<0Z+JJZk&hrz&LxNn0mL^<#!4@WbfqAe=WhNT3-B=bHVFH<%DCFA}tkDiu{!Iwq-$ z6OBC&S`a|g)?8Lr_Bo5e%-pzUIRYX-NQQ-vEv?@y z8a_mh^c0uySLTg+Z*Tlyj1(aoBDg4Cjk{+qE>auosxS zt}NQ4ZrJ?}l6k{@&u2WzGcBW#hpXBK1fVvN;9n3(P|(fS{{dZpd%%dIU~xmWo$QF5K)9WhSNnb zj?KWk)XkrII|5V?YHHo+>8Vh(w6yF3RZk?)$n^5`2dmk<#?Ak&|C9;ntzV{h2Bzng zeerN}%yqReD)K|%ah*yy*T1LU&pk9_)yx1d)R&U26V_mL8`MDd^DXr_c9r6_6YQ!p z2^U2W5uwP-OK3X1zPK709v*&$M#{Wb)qK^!lRn}tU2NI4SG&se*q>;S$PTvRuKJKd zhLDNkzUo+6p_*la5RCWP6c_u?$sLe){Oar!j$n7-q|dzw${3vUMLmZZ_1B1*g~($h=dzAVTn1k)Z24?M@gv5-G zkLUfUW||c6zN+J7wYWehTH4wYg1;Z(J{uo%KU#KEP*S2)#fmJFLl`sc&w&2~6LMy7 zUt=57e1yd^k94$kB<#x<_n%t{muqdL^N`D9Jom$CT_{xK*$hP@q8!6>?A7w+dPw}@ z%=`Q*!=c86?mG|w%(z6*Niqrw5*K;l6a&zT%F6U6X&2~X-0ZM1Gf2n2dGWtQD19S* zb5Q7IReqr{Kj*TX*<9h=m>uI3fDv^wM|cb`zUwShY&I{j$T2teRQ}xO^v>GBu6~dj z0-xCms?J;p8WK3Y{m7Js!#FfnFN3^h@NIQt!|b`;bzXjcf^KEG{0)Akog($0Mv~De ztoxeBWL)`#PAiEBo4D2cJ;Ux|`LQo8?QZ|+(-vb!)>(qsD2K3Vr+JZIn+)cks+C6K ze;UqP+ns|&Q*L3viioVJhBCZ+GZxoyj+KC#ni@nzyyrZ~Nz#6r#Ty}X&7HHynqxQZ zo`o5iSz*yL_K#AhYS=ra;(J%Os*hUh;gdA857E)cc61H>=7tzvzrI&b%=4D2A!FMi zsrHF{GhbhOE)&}0$1mBL10`H)2Y4Us?Cem|P#U&5(G0Z>^b9INqOotmy>(1vU2Y); z2TQj^wF^*#wMJyH&5V*r9)tm15mIZ0WA3}pt&&N+5vOL8_Tv5M!NCaQ<8R^6f;Dx> z2e;!c@ipSr!JlialAJbQGO#EfJb0+H`?V)gQoJs;Z8@oySaS!gmU9e~U&{lif0|3l zmRq{tO=A+nJH`T2n1jNhuRqFvuknEf$sxAEz8%_vrq+|hEjy_YUJJSIVE zqC-;2v$SHCJoL&8yF&mKPI%iZnx@A1Oyy*+ZlOvb@FON92mu!_L4?( zj;NeV0YlN&yfjgo61I8{g-xe znPwkE%-b|(Sy!OjorUH5#>8f9U>SNbO^2BzEn*-vmMjFqp5a`O@EhuAy3Ew3U^UBT zEDVfuY=%H$Cf`N)AsMmfu8q_+xn-bGepzKD%N?SWa{0{E)E8+HYtaY8_L;gG8c7|9 z_Y@SB<&~9x52=$L(jNg5xLi7nU@rIL@Y}O;ajAXrWdFQ4GlK$_F=uCX1RPrZkIKqJ zjeKrTmD$(^$xe_!3dCV9Pe z@eFhX+C%gXea1MeC#$Qg#&<8CadC0oLqdvATFj~dxrxVOa?;$`^|O7iO$O-{?%?cf z9Gz!j8Oah#9!-jFoaHn$8#-0Gq>#Pm%ed!cE((&Cc&Z8kEJ`PD|pEl!uu=?EM-AuqaSx&r%LUv9Xmi$8P2g7 zcf7$UG5Ixk%C{?oNKgAj8|CqjW&2UIV~(JC8=moq|m{-E?%GnJE|RP9(a;y1|BG;dk`|XH#cEg!~w8Zufiy4$saQQ@p6_d_i#}LqgIi z6Th%q+UI38Uoqh>Z%uP@a+sN#nhb?zX(g6cJN-OD@zfEfe*eC8?zrX60CD}zIjBcP z#l&=A`$T~W>`^*4hrgTGi`8_1jk?}KEn%Wir_-W5j(ZOqG;j}hitwm^dLSVSHU`EJ z_Qq$8kn9+?>O~i}QwIkHg~(EmK9plr!j`5+x2<`KFKF_H^q!;44DQU1s z_L!XN$M#kaw|)aKwBFG2B6>ed?|e$Y_k&H-rBsDS{3=s_ZftCHy3_!v&6k4SruQ*E z{?{ zv}9CFC|Ag(g|f%OViE=>sd=sBEc@1_F3uim8>=_e&aIuthS%o3AhT;?+88p3E$OkK=fZ)-uk9# zC8TI@U#tt=Zh!7vwPW(vFLT>Z;PZuGd1AIpfg_w`Bi;STKXnwM5qu8d}KBM=fM<>ckP7)ik*93}9^(R3ZSsflrt;pT4qbaChx zU;Vc&RE^{?T?&(V+;j~Lqzr^=qapW7Oy=>0Ndw90-+rykS4Om+yv6vPJpzg~>r(mW zHiyHrl#R|waE0{r-WUxfj+Ut+*xK5bmX>Dbm4!z}J~uTp8{Ro3P2mxcmM&V~L;KU2 zRVLAbC@3h;o?~`iR@f;hIrewZf`u2vXvC$J9T5O6zI_uS8jb$jkO`n`($n7ny7W;= z^%p3|Ds##d!ScHQDHc)nx2|I)t--6R8UYb zevzPJFZr0sG9d^62;uZ+5j|g}vjvJL_2_Y(-4@KoArP~LqQ7646qVFCMjfp{Z_#PN z&cRjgFs3RlF3$Wgzqa?t*4B=8)QbN(SG5JSyVb+l+4ZB6Qg4>SVt7i-;;X&CLv=#M z-r+2Ra_n$>t1TBxx>wvYlz9qxIQzN=izC82%P#&N}a#vcyRFWk|HZM5m;+oS8MTg7F*Fo>gOF z{<-)rg?L=OyS7&TS()RphtHt{DcZJa|>1I}bs$ugb}J`=RaEr6ELFgGf9ZH;f*i!U*SVcVWKs z*nfOn!ESdmjCDs8m*t@{o6|(mWmWpGn~}}`Fa4wq++1IRLi@W%^f;pI6HiW#1-sgZ z>t)#UmE5P7Eii~!17EfI9*>~Ha$V;u8K@8C)x134{kr8qxOl3=)^?zfL{A3Zv?Mvk@2Arz zc8}{P$eg_XCr3w})iKT6lNto&nBtQup10QwI!E?%b38f4#Vfm85$@NgRL94yt?wlh zIen6Oo4}x#2ZM1zW0u2qGj!XtVlsM^k3`seVjSSeTSVA~VwDzU<>eg{6TuQOM+nx|_Gx)}Wdbwz zoHt9eaiiD=p^O@2uWSe*5XIf8rb5VuUuV$IrH{N6GReEE-F0jdo#UV;2@n4uF8(m+ z$rF5$vz3g=9slpUGOF7gRMh!(oPmOCbA)}xe&-}hI$1Rhsez)5fO`pyHXSN+1-7YU<;ccI1d2K|^5_gfn#X z=QuA+7Y0K<2Lv#s>MVm$J-2<_*yg%2N$pKTFzINkpZ2D!Oqn8d zxMFA0n0eUPxZ-Wj1oy?}5E}Z{la@zxjfS3cef1Q?$(rwOE(8=$$pVR`b`QeXIqGFq zR9Yv3c0@Tx>~Zg6hPeIe{U{K^kWdas&8+T~SRA`L?oFlE^cPIq9bi0$UYBS4<1s!~ zt0#_(eqL@lFqx5^nV^TqXM-u{;|JZ`{Mw_RkyGL=aD8rjB6@uMT!f4~oZa%Z3kS!$ zi%p-MGppSTvDiT2s!E$28eW~pFV+lpXUnrY?64@L$PJANd3N_GDQVO4%F=}5exu6d z(C+~O)F=XPaG01r9bOuNIGE7K&dF{)yUT%$@=aUMOhU@x#YXth(H>hbhL04ew`wks zCCRbiiRYXkeha}$tj+g!r|QkP64)%YCw4hb_V_|wiW|*6=jZBSWT48cUT9!co|zp4 z@QT{w*EL9ve$SfHs;aE4x_Ei9uIZ9}F1t9D@{OlYpZ5d00SHA@AqB^?{E%KWUz z_FTVamhIIzWd{Rw(($C4*A3FW+_!XZn2tZl z-yEW?uB|WaOg^HclX>_kfZcQVQ~A}=(GkcJrnsi6XR@o_nn;M@WzHlJh%feeT%Q@t zW#l@$x`0)yCNymDC^JQu89$*CvQRgpiKncL<9R#xX#FUYjI7~!sF`g?-l$n-Hb1+u zlFahL8YF>|rs9mZD1vfIsvkxV-vko!U`LF!`&Q<2*xb}W_vVN*Q=;~Q>PJsi0vsfJ zYN%D(Dh?k^bMp;Ec5wDW6+Y zKdH?w&E`)!TsvLLs+snl11MAFyf8Z(ur$1o$T5912T3h0Z4V)q0GbYfrR2x%_=xXc z4fLL%!P)>602PNJz|vs4f3P;jtsY9AEtvDb;Qjr?NSdtFpv_4?SteVV|0OGHZ*%?b zLTwOT^c_Z$bQh7+yiauqMgpt52*`RIDp`K)$dx5U1?OUeoVTa1$8fSr%3QrZzCVx| z3dO?3Czvfr%unC~tH$Me{#wKF8TVrpf$~~>HeF;i{}oY=n0}}X@6ti52dK)Y$_}}j z?o7Wyog)LmfRiPVnLAhpD9~Els_#)VXjeSk7i|FSf(bw%JxD9rY!ICn8#M^YpFeLA za6UgV7`tLABoCboQ0Ymuvbwdgx6P`{+j{C^Z2W+jSd);?^#LfXWvxZ?8BkGCbu28T zRK&y*ZcT&2t1L;ACyZH?dH#D6-oTh8z5o;Njf{#);Ijf^Tm_!IQKL-Mc)GsD*8j|- zEL6Z?9vIkrE=wp4aT!V=hWNhS0u_3Gx z5fK4FK{Sd{Q5hK-PjPX*HH#@OckvV#zowdmY~|6#goTBn@uz$j{Zg#T4$$Ag8a@HO zYU9yIF+2p&IRKT!V=&bI2RsGS>EIZHKYPr^8csZzGK64kS3H?|>t=0lPrCE#8wg-G z?P60i)1~=Ak4!PUq<=Ow1@FzO@{%y=<5se;yt~qGx}41d%m(pu>pElGiU`2?7xv2{ z>sC(E(t}@x1ffuQ9S21U!x|kq9Qbck^S!C^vG!W=A82F zTm9Y>wcH}PWI?LwLGdmHpob~CHy-thjiO=@E;-Siydq^TnC^H6)(V3ZTF?N`y(KPP zkWn=70zS(z07)g5&bGV1f!|q>&-V#QPi_Pa*3YW9c=BX=sjSJdsWz+Y`k*|i#U6?S z5Z?1J?y_-Zb@dmBQi8(5;faX_Zw<)|ivE)WU$N4CG@&-kv}x7}U2f!BV{0ZMJp3N>{8k!G(kU+(3gMNY(maIVq{spG zznaU$;dVvphfb(1tMHh|^#mc(!icOwRT&H|2q(&3Nc|{_I<@L5jd-U9jZ}Dd29`(< zdy20Y|5Ly@!2lK*McX?U=H%p*J8grmt?V?>8|D1V3jit!pKWB!7H#@i)O$c={yFB< zPs8*COg_6v+j2TadMe-0VOcOj*ntT5s8Kldh0!Ih2xP5fXU5Tl*3!H z1T11`UsN~`E;OO)JoC7`>o>v2S50p<)D$zd9y9&`i6lZ$P|(17o{x`SKtP|VS$=7?70r(Fo2@#K*>sTM3cL<*|4%|EIk)dSaIL<5PN_LR0$q*o~+vy_x27swHhhM+?f=s7q^R@^Qk1*396IDPXUY#0V z*`ZC(48b^PgLIK&Z4M*$R+UHZq+(a7c13P_+=q{j zrVr+~39dR>byr0JhEut=*dgiH>yr6UT&;UOF)X<~vjIH{%MQCwtXryYa1H_BLXeVnKXUL z%D}G0X5}#+Nv8_WULiAe_4tXX8ImS$Dt{HJW?r~CS_m9!0uZ6Fn2lV(xvU$58OsJx z8LVv_+5mVQig|ahrETmHC_g&#*OP;SSe)k1Uy^Hg9A(mM_jGrgS8YIrXa5!DuC83g zC4NjFX!O}F+m)3Mz?F|YCvEo{iOD>a%c|byisV-c^*BzL@{Iog%N?ew#YRFBV3hpY zFI8~pSl#+NAVJ%v7O;e9*L}kLrkg;ZiVO`}B)qMOl=%Q<4-|fL?Fic}K_1nn|5;sD zmJ=wQZFZK5`4l&B#CTQxNW~j_Bbt!YIrROA6dPi*(x(*qPN~>mV4xIgBC={P@w;AK zl&$Yf$c#%9a$%#2hyclH!LVV?zyNrE*xdTB;xo!BGGe`dY6I{zFw0B-HWo;BgNdef z8~PL99tob2v~RYT?ltuYhu{gg|H6GpyH^0%PP!}KR5Ij)a77>wx+n%O zNO-u?^LtBgZ{4)Xy|Xi(5+$3~5rcZCJzf5BZC&3^24>pi_-!gj*i>(6x`bS&wa5BA0H&WPMOq(g0F!U3iwZgfQY)h3++w4Erho(1m)!w zWfc{nH);-TMTkAeiJ^D=rBA!I5$4XSGFDZjq@cjBElcmO*QHC3dvI`IYLg#))(c|# zLHCM`4Rq=mH#avLY&IkShq2%79_)772lSQ=?d7|U4xx*S3+QZLN<+S5xfV7K-w#d1 z&nG9R7A*dO1PtM6zrHA8J@5t-w7V|UW&XO`!|RM0xCIz3I%&-38$O4nW1>BIl-*P` zsBZW_$pEZcPnw*DEJ0^6y6cY((MCVVf$nUCD9eyw_j@&~Ko{9;5kLip_87fmb~b?{EA#EPFxhm%RH`SA}|2DdSCqc>c$Ag z>+l}=Y*2Ij(7@nwv|L2z*ICZYvit6bkzJSfL(YGtq^hbFG9U#>E&#foyZi0$(hfj6 z+#um2+cGs8x5m8!eaWc6Z{g1B>WOH3SR?B^l62)jkXTOP>lqP11zr>};P>h2X)?By z7wZ@ARWB?l`3`U;gV`WYf8)7PzZYC1P&ggP82y(!(~WurKDsC?OPit~vA(!OUD_aN zS;*fPb6G^fSOx_@lA9wGRAgGsSzN5ZW|V(*h(KmRNtymNyf$^UvBB(G=}J)0_WTwj z%>L#9h-k?7{d5`QJ~f@l^G{!Eh~fPalWO=o|BIMJMJ&$(lb6^rv9gd8?{QRGaox!S z+3>%z;&NXtSou=fPT`QMg%L|+`(td@2^#K;_>~1 z0SDYrcK3*K-dWv-7AUb6X|&Ol8#0;pJ4=$krKK{q5i)W!*aliBHI2bsd+w$^=aFss zrEAB=`Xp?=(Z>cWoADhjF}0bQscBwqY+P%+m1^>sGsByt;RT)5wF*i1FJJB*Vm!7y z9v%kr&~Go-Y}RQZuh;Zhp_;Xw6NTx)Q{Q&tk7UDoQ&In5uJYU(KCQ;FsI$7 zy@LXQUUwW3Z(3{VNjhw@mu$i$o%~O=Pzx(tyD@SSnVE+M@>& z4)$KO4A(dxPic8#S%Sh8uX@1ns6x%y+?*8Dd}0*AjJD&Sz&z_28d4q?RyBS2?fzw; zsHh;kO>9DnZB@poC++^gS%tb47xkZ1nlzbVg+lY3I4dS9D*B_G=3s_N_0O@b?x6vl zHATLWTvCuRpPKgc^z6=6`P)Qf*$mxcl-VDC_*>)40|{*gl8*~-ON9XABnZZHyTYTu zzylBjxlaFuVe!B~k5ZH%)$iJ#EVBOz8Eoy#mk&)UhaAA1`0AAnH*iIbhQCJNueTji z15u02;LDdUwHu#B;!jtO7W=U2WZho{$DikBo>o*>z0K6;%D4Hq7zS!9mA2w@73=BK z2_u@Sa#e9%l;7G)g=1^VFuxg_?A}|a#dD?`*URcly{!TUU3T57+$dSD8>P~*a zH_dG`_Il>KwDL!V?!$D8#e}?)mnrFfXVsStH5@#bC&hTrNUZMa8ydcxnk85!?${30 z7S6vSHZr2HEi0d@6sT9@bErsQSl`e2cMK*Iua!ho*Xet@Q*?bZIXQPHaKrvdO^wOk zncKDTMbwKmc1|v=X)6Ta3d~5}sX6{;#hhGLX3Kkh;*~@kLuT0-Tc5tqs>~IkF& z5*Xp>S>8ow2CJpIy82YL@-1EEgH%CaCISrpOTEY#teSOv5^&UChv|N5w;CrYs@!SU z7nDO!{&kPx{~;LtBTfCEs!IRH(f^UB;>p5R$R#@$7q#-Y|LQ+%Sz?&e6x@lS3m(He zg%vr{e>5t4yLi&DWshrlAcJ%S;QZ&y*c4&3w6vi5U;D7`LIeFP1F<0nM05l6$bcUN zrp#lYzx{giy5hUU-&5&<&wz?{bz@CdSs4I<2f)fS@|yOK#5NM75-E7L!-s$>LIJdI zlopVzM*RGHW#@)+nA3l3A(?;Nr*HnsX6-Ux2B+t{?9=I*0A~fhEu=9F#Z7w
n} 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 O4^%{2xIj?r{r>@pIRG30 diff --git a/docs/assets/syntax_error.png b/docs/assets/syntax_error.png deleted file mode 100644 index 6e0048e99257b8b0be87d8f987cb6a3f001c50af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32357 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 ZR~k=^KH#wyfFs~h#6_fp^98kk{x5h2caH!7 diff --git a/docs/assets/type_error.png b/docs/assets/type_error.png deleted file mode 100644 index 9773be27939f602194ec72ab270d19382a3d8ec3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18241 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 -- [Dust Language Reference](#dust-language-reference) - - [Root](#root) - - [Values](#values) - - [Boolean](#boolean) - - [Integer](#integer) - - [Float](#float) - - [Range](#range) - - [String](#string) - - [List](#list) - - [Map](#map) - - [Function](#function) - - [Option](#option) - - [Structure](#structure) - - [Types](#types) - - [Basic Types](#basic-types) - - [Number](#number) - - [Any](#any) - - [None](#none) - - [List Type](#list-type) - - [Map Type](#map-type) - - [Iter](#iter) - - [Function Type](#function-type) - - [Option Type](#option-type) - - [Custom Types](#custom-types) - - [Statements](#statements) - - [Assignment](#assignment) - - [Blocks](#blocks) - - [Synchronous Blocks](#synchronous-blocks) - - [Asynchronous Blocks](#asynchronous-blocks) - - [Break](#break) - - [For Loop](#for-loop) - - [While Loop](#while-loop) - - [If/Else](#ifelse) - - [Match](#match) - - [Pipe](#pipe) - - [Expression](#expression) - - [Expressions](#expressions) - - [Identifier](#identifier) - - [Index](#index) - - [Logic](#logic) - - [Math](#math) - - [Value](#value) - - [New](#new) - - [Command](#command) - - [Built-In Values](#built-in-values) - - [Comments](#comments) - - -## Root - -The root node represents all of the source code. It is a sequence of [statements](#statements) that -are executed synchronously, in order. The output of the program is always the result of the final -statement or the first error encountered. - -## Values - -There are ten kinds of value in Dust. Some are very simple and are parsed directly from the source -code, some are collections and others are used in special ways, like functions and structures. All -values can be assinged to an [identifier](#identifiers). - -Dust does not have a null type. Absent values are represented with the `none` value, which is a -kind of [option](#option). You may not create a variable without a value and no variable can ever -be in an 'undefined' state during execution. - -### Boolean - -Booleans are true or false. They are represented by the literal tokens `true` and `false`. - -### Integer - -Integers are whole numbers that may be positive, negative or zero. Internally, an integer is a -signed 64-bit value. - -```dust -42 -``` - -Integers always **overflow** when their maximum or minimum value is reached. Overflowing means that -if the value is too high or low for the 64-bit integer, it will wrap around. You can use the built- -in values `int:max` and `int:min` to get the highest and lowest possible values. - -```dust -assert_equal(int:max + 1, int:min) -assert_equal(int:min - 1, int:max) -``` - -### Float - -A float is a numeric value with a decimal. Floats are 64-bit and, like integers, will **overflow** -at their bounds. - -```dust -42.0 -``` - -### Range - -A range represents a contiguous sequence of integers. Dust ranges are **inclusive** so both the high -and low bounds will be represented. - -```dust -0..100 -``` - -### String - -A string is a **utf-8** sequence used to represent text. Strings can be wrapped in single or double quotes as well as backticks. - -```dust -'42' -"42" -`42` -'forty-two' -``` - -### List - -A list is **collection** of values stored as a sequence and accessible by [indexing](#index) their position with an integer. Lists indexes begin at zero for the first item. - -```dust -[ 42 'forty-two' ] -[ 123, 'one', 'two', 'three' ] -``` - -Note that the commas are optional, including trailing commas. - -```dust -[1 2 3 4 5]:2 -# Output: 3 -``` - -### Map - -Maps are flexible collections with arbitrary **key-value pairs**, similar to JSON objects. A map is -created with a pair of curly braces and its entries are variables declared inside those braces. Map -contents can be accessed using a colon `:`. Commas may optionally be included after the key-value -pairs. - -```dust -reminder = { - message = "Buy milk" - tags = ["groceries", "home"] -} - -reminder:message -# Output: Buy milk -``` - -Internally a map is represented by a B-tree. The implicit advantage of using a B-tree instead of a -hash map is that a B-tree is sorted and therefore can be easily compared to another. Maps are also -used by the interpreter as the data structure for holding variables. You can even inspect the active -**execution context** by calling the built-in `context()` function. - -The map stores each [identifier](#identifiers)'s key with a value and the value's type. For internal -use by the interpreter, a type can be set to a key without a value. This makes it possible to check -the types of values before they are computed. - -### Function - -A function encapsulates a section of the abstract tree so that it can be run seperately and with -different arguments. The function body is a [block](#block), so adding `async` will cause the body -to run like any other `async` block. Unlike some languages, there are no concepts like futures or -async functions in Dust. - -Functions are **first-class values** in Dust, so they can be assigned to variables like any other -value. - -```dust -# This simple function has no arguments and no return value. -say_hi = () { - output("hi") # The "output" function is a built-in that prints to stdout. -} - -# This function has one argument and will return a value. -add_one = (number ) { - number + 1 -} - -say_hi() -assert_equal(add_one(3), 4) -``` - -Functions can also be **anonymous**. This is useful for using **callbacks** (i.e. functions that are -called by another function). - -```dust -# Use a callback to retain only the numeric characters in a string. -str:retain( - 'a1b2c3' - (char ) { - is_some(int:parse(char)) - } -) -``` - -### Option - -An option represents a value that may not be present. It has two variants: **some** and **none**. - -```dust -say_something = (message ) { - either_or(message, "hiya") -} - -say_something(some("goodbye")) -# goodbye - -say_something(none) -# hiya -``` - -Dust includes built-in functions to work with option values: `is_none`, `is_some` and `either_or`. - -### Structure - -A structure is a **concrete type value**. It is a value, like any other, and can be [assigned] -(#assignment) to an [identifier](#identifier). It can then be instantiated as a [map](#map) that -will only allow the variables present in the structure. Default values may be provided for each -variable in the structure, which will be propagated to the map it creates. Values without defaults -must be given a value during instantiation. - -```dust -struct User { - name - email - id = generate_id() -} - -bob = new User { - name = "Bob" - email = "bob@example.com" -} - -# The variable "bob" is a structured map. -``` - -A map created by using [new](#new) is called a **structured map**. In other languages it may be -called a "homomorphic mapped type". Dust will generate errors if you try to set any values on the -structured map that are not allowed by the structure. - -## Types - -Dust enforces strict type checking. To make the language easier to write, **type inference** is used -to allow variables to be declared without specifying the type. Instead, the interpreter will figure -it out and set the strictest type possible. - -To make the type-setting syntax easier to distinguish from the rest of your code, a **type -specification** is wrapped in pointed brackets. So variable assignment using types looks like this: - -```dust -my_float = 666.0 -``` - -### Basic Types - -The simple types, and their notation are: - -- boolean `bool` -- integer `int` -- float `float` -- string `str` - -### Number - -The `num` type may represent a value of type `int` or `float`. - -### Any - -The `any` type does not enforce type bounds. - -### None - -The `none` type indicates that no value should be found after executing the statement or block, with -one expection: the `none` variant of the `option` type. - -### List Type - -A list's contents can be specified to create type-safe lists. The `list(str)` type would only allow -string values. Writing `list` without the parentheses and content type is equivalent to writing -`list(any)`. - -### Map Type - -The `map` type is unstructured and can hold any key-value pair. - -### Iter - -The `iter` type refers to types that can be used with a [for loop](#for-loop). These include `list`, -`range`, `string` and `map`. - -### Function Type - -A function's type specification is more complex than other types. A function value must always have -its arguments and return type specified when the **function value** is created. - -```dust -my_function = (number , text ) { - output(number) - output(text) -} -``` - -But what if we need to specify a **function type** without creating the function value? This is -necessary when using callbacks or defining structures that have functions set at instantiation. - -```dust -use_adder = (adder <(int) -> int>, number ) -> { - adder(number) -} - -use_adder( - (i ) { i + 2 } - 40 -) - -# Output: 42 -``` - -```dust -struct Message { - send_n_times <(str, int) -> none> -} - -stdout_message = new Message { - send_n_times = (content , n ) { - for _ in 0..n { - output(content) - } - } -} -``` - -### Option Type - -The `option(type)` type is expected to be either `some(value)` or `none`. The type of the value -inside the `some` is always specified. - -```dust -result = none - -for file in fs:read_dir("./") { - if file:size > 100 { - result = some(file:path) - break - } -} - -output(result) -``` - -```dust -get_line_break_index(text ) { - str:find(text, '\n') -} -``` - -### Custom Types - -Custom types such as **structures** are referenced by their variable identifier. - -```dust -File = struct { - path - size - type -} - -print_file_info(file ) { - info = file:path - + '\n' - + file:size - + '\n' - + file:type - - output(info) -} -``` - -## Statements - -TODO - -### Assignment - -TODO - -### Blocks - -TODO - -#### Synchronous Blocks - -TODO - -#### Asynchronous Blocks - -```dust -# An async block will run each statement in its own thread. -async { - output(random_integer()) - output(random_float()) - output(random_boolean()) -} -``` - -```dust -data = async { - output("Reading a file...") - read("examples/assets/faithful.csv") -} -``` - -### Break - -TODO - -### For Loop - -TODO - -```dust -list = [ 1, 2, 3 ] - -for number in list { - output(number + 1) -} -``` - -### While Loop - -TODO - -A **while** loop continues until a predicate is false. - -```dust -i = 0 -while i < 10 { - output(i) - i += 1 -} -``` - -### If/Else - -TODO - -### Match - -TODO - -### Pipe - -TODO - -### Expression - -TODO - -## Expressions - -TODO - -#### Identifier - -TODO - -#### Index - -TODO - -#### Logic - -TODO - -#### Math - -TODO - -#### Value - -TODO - -#### New - -TODO - -#### Command - -TODO - -## Built-In Values - -TODO - -## Comments - -TODO diff --git a/examples/assets/jq_data.json b/examples/assets/jq_data.json deleted file mode 100644 index 3af11de..0000000 --- a/examples/assets/jq_data.json +++ /dev/null @@ -1,7883 +0,0 @@ -[ - { - "sha": "e85e3582330af543f1a7b293c6b9b27f342670a2", - "node_id": "C_kwDOAE3WVdoAKGU4NWUzNTgyMzMwYWY1NDNmMWE3YjI5M2M2YjliMjdmMzQyNjcwYTI", - "commit": { - "author": { - "name": "Emanuele Torre", - "email": "torreemanuele6@gmail.com", - "date": "2023-10-21T21:27:40Z" - }, - "committer": { - "name": "Nico Williams", - "email": "nico@cryptonector.com", - "date": "2023-10-22T15:51:24Z" - }, - "message": "Fix possible uninitialised value dereference if jq_init() fails\n\nIf jq_init() fails, goto out would try to free input_state which is\nuninitialised. I initialised input_state to NULL to fix the problem.\n\nRef: https://github.com/jqlang/jq/pull/2934#discussion_r1367795641\n\nReported-By: Klemens Nanni ", - "tree": { - "sha": "4351e7fb171a17f6a632c2e2e93d2bd8afad9b25", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/4351e7fb171a17f6a632c2e2e93d2bd8afad9b25" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/e85e3582330af543f1a7b293c6b9b27f342670a2", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/e85e3582330af543f1a7b293c6b9b27f342670a2", - "html_url": "https://github.com/jqlang/jq/commit/e85e3582330af543f1a7b293c6b9b27f342670a2", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/e85e3582330af543f1a7b293c6b9b27f342670a2/comments", - "author": { - "login": "emanuele6", - "id": 20175435, - "node_id": "MDQ6VXNlcjIwMTc1NDM1", - "avatar_url": "https://avatars.githubusercontent.com/u/20175435?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/emanuele6", - "html_url": "https://github.com/emanuele6", - "followers_url": "https://api.github.com/users/emanuele6/followers", - "following_url": "https://api.github.com/users/emanuele6/following{/other_user}", - "gists_url": "https://api.github.com/users/emanuele6/gists{/gist_id}", - "starred_url": "https://api.github.com/users/emanuele6/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/emanuele6/subscriptions", - "organizations_url": "https://api.github.com/users/emanuele6/orgs", - "repos_url": "https://api.github.com/users/emanuele6/repos", - "events_url": "https://api.github.com/users/emanuele6/events{/privacy}", - "received_events_url": "https://api.github.com/users/emanuele6/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "7ab117a483e127006f30efa818a7a8281077ec72", - "url": "https://api.github.com/repos/jqlang/jq/commits/7ab117a483e127006f30efa818a7a8281077ec72", - "html_url": "https://github.com/jqlang/jq/commit/7ab117a483e127006f30efa818a7a8281077ec72" - } - ] - }, - { - "sha": "7ab117a483e127006f30efa818a7a8281077ec72", - "node_id": "C_kwDOAE3WVdoAKDdhYjExN2E0ODNlMTI3MDA2ZjMwZWZhODE4YTdhODI4MTA3N2VjNzI", - "commit": { - "author": { - "name": "Klemens Nanni", - "email": "kn@openbsd.org", - "date": "2023-10-21T20:59:20Z" - }, - "committer": { - "name": "Nico Williams", - "email": "nico@cryptonector.com", - "date": "2023-10-22T04:30:36Z" - }, - "message": "Defer heap variable initialisation after pledge\n\nOtherwise `AGRS` and `program_arguments` remain allocated/unfreed in the\nearly (extremely unlikely) pledge(2) failure case.\n\nMove their allocation before jq_init(), the first case of jumping to\n`out` where they are cleaned up, where it also seems to logically fit\nbetter than above between function entry, locale setup and OpenBSD\nspecific pledge.", - "tree": { - "sha": "2849e59b0b0cabc7858c168691b27b9d66d34409", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/2849e59b0b0cabc7858c168691b27b9d66d34409" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/7ab117a483e127006f30efa818a7a8281077ec72", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/7ab117a483e127006f30efa818a7a8281077ec72", - "html_url": "https://github.com/jqlang/jq/commit/7ab117a483e127006f30efa818a7a8281077ec72", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/7ab117a483e127006f30efa818a7a8281077ec72/comments", - "author": { - "login": "klemensn", - "id": 91517496, - "node_id": "U_kgDOBXRyOA", - "avatar_url": "https://avatars.githubusercontent.com/u/91517496?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/klemensn", - "html_url": "https://github.com/klemensn", - "followers_url": "https://api.github.com/users/klemensn/followers", - "following_url": "https://api.github.com/users/klemensn/following{/other_user}", - "gists_url": "https://api.github.com/users/klemensn/gists{/gist_id}", - "starred_url": "https://api.github.com/users/klemensn/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/klemensn/subscriptions", - "organizations_url": "https://api.github.com/users/klemensn/orgs", - "repos_url": "https://api.github.com/users/klemensn/repos", - "events_url": "https://api.github.com/users/klemensn/events{/privacy}", - "received_events_url": "https://api.github.com/users/klemensn/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "77dcaf3fdc9a23c2a318da4f4a944143748e5961", - "url": "https://api.github.com/repos/jqlang/jq/commits/77dcaf3fdc9a23c2a318da4f4a944143748e5961", - "html_url": "https://github.com/jqlang/jq/commit/77dcaf3fdc9a23c2a318da4f4a944143748e5961" - } - ] - }, - { - "sha": "77dcaf3fdc9a23c2a318da4f4a944143748e5961", - "node_id": "C_kwDOAE3WVdoAKDc3ZGNhZjNmZGM5YTIzYzJhMzE4ZGE0ZjRhOTQ0MTQzNzQ4ZTU5NjE", - "commit": { - "author": { - "name": "Klemens Nanni", - "email": "kn@openbsd.org", - "date": "2023-10-21T07:33:42Z" - }, - "committer": { - "name": "Nico Williams", - "email": "nico@cryptonector.com", - "date": "2023-10-22T04:30:36Z" - }, - "message": "Remove unused mkstemp()\n\nb82c231 \"Remove -i option (#704)\" removed its last usage in 2015.\n\nSpotted while looking for code could potentially write/create/modify files.", - "tree": { - "sha": "b829a668abb68d7788a850082cdc6f6ba576d9c2", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/b829a668abb68d7788a850082cdc6f6ba576d9c2" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/77dcaf3fdc9a23c2a318da4f4a944143748e5961", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/77dcaf3fdc9a23c2a318da4f4a944143748e5961", - "html_url": "https://github.com/jqlang/jq/commit/77dcaf3fdc9a23c2a318da4f4a944143748e5961", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/77dcaf3fdc9a23c2a318da4f4a944143748e5961/comments", - "author": { - "login": "klemensn", - "id": 91517496, - "node_id": "U_kgDOBXRyOA", - "avatar_url": "https://avatars.githubusercontent.com/u/91517496?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/klemensn", - "html_url": "https://github.com/klemensn", - "followers_url": "https://api.github.com/users/klemensn/followers", - "following_url": "https://api.github.com/users/klemensn/following{/other_user}", - "gists_url": "https://api.github.com/users/klemensn/gists{/gist_id}", - "starred_url": "https://api.github.com/users/klemensn/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/klemensn/subscriptions", - "organizations_url": "https://api.github.com/users/klemensn/orgs", - "repos_url": "https://api.github.com/users/klemensn/repos", - "events_url": "https://api.github.com/users/klemensn/events{/privacy}", - "received_events_url": "https://api.github.com/users/klemensn/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "f1bfd0c518473ab439eff4d56441ce165d8bd0ca", - "url": "https://api.github.com/repos/jqlang/jq/commits/f1bfd0c518473ab439eff4d56441ce165d8bd0ca", - "html_url": "https://github.com/jqlang/jq/commit/f1bfd0c518473ab439eff4d56441ce165d8bd0ca" - } - ] - }, - { - "sha": "f1bfd0c518473ab439eff4d56441ce165d8bd0ca", - "node_id": "C_kwDOAE3WVdoAKGYxYmZkMGM1MTg0NzNhYjQzOWVmZjRkNTY0NDFjZTE2NWQ4YmQwY2E", - "commit": { - "author": { - "name": "Klemens Nanni", - "email": "kn@openbsd.org", - "date": "2023-10-21T06:54:48Z" - }, - "committer": { - "name": "Nico Williams", - "email": "nico@cryptonector.com", - "date": "2023-10-22T04:30:36Z" - }, - "message": "Restrict systems operations on OpenBSD\n\nUse pledge(2)[0] to limit jq(1) to reading files.\nIt does not change files and only writes to standard output/error.\nIt never deals with TTY, network, process management or other subsystems.\n\nThis is to reduce jq's attack surface and potential damage.\n\nOpenBSD is carrying a local patch[1] in its official jq port/package\nsince 2016. An improved version:\n\n- drop no longer needed \"getpw\" promise\n f1c4947 \"Avoid getpwuid for static linking\" removed getpwuid(3) usage\n- pledge before jq_init() to simplify the error path\n- use perror(3) to print errno(2)\n\nNo behaviour change in tests or real world usage observed on\nOpenBSD/amd64 7.4.\n\n0: https://man.openbsd.org/pledge.2\n1: https://cvsweb.openbsd.org/cgi-bin/cvsweb/ports/textproc/jq/patches/patch-main_c", - "tree": { - "sha": "79daf6be1ce5507992825da6f283dcec2509692d", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/79daf6be1ce5507992825da6f283dcec2509692d" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/f1bfd0c518473ab439eff4d56441ce165d8bd0ca", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/f1bfd0c518473ab439eff4d56441ce165d8bd0ca", - "html_url": "https://github.com/jqlang/jq/commit/f1bfd0c518473ab439eff4d56441ce165d8bd0ca", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/f1bfd0c518473ab439eff4d56441ce165d8bd0ca/comments", - "author": { - "login": "klemensn", - "id": 91517496, - "node_id": "U_kgDOBXRyOA", - "avatar_url": "https://avatars.githubusercontent.com/u/91517496?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/klemensn", - "html_url": "https://github.com/klemensn", - "followers_url": "https://api.github.com/users/klemensn/followers", - "following_url": "https://api.github.com/users/klemensn/following{/other_user}", - "gists_url": "https://api.github.com/users/klemensn/gists{/gist_id}", - "starred_url": "https://api.github.com/users/klemensn/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/klemensn/subscriptions", - "organizations_url": "https://api.github.com/users/klemensn/orgs", - "repos_url": "https://api.github.com/users/klemensn/repos", - "events_url": "https://api.github.com/users/klemensn/events{/privacy}", - "received_events_url": "https://api.github.com/users/klemensn/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "9de0e26ce613f7e534b2ff3a92ad0d06d329efab", - "url": "https://api.github.com/repos/jqlang/jq/commits/9de0e26ce613f7e534b2ff3a92ad0d06d329efab", - "html_url": "https://github.com/jqlang/jq/commit/9de0e26ce613f7e534b2ff3a92ad0d06d329efab" - } - ] - }, - { - "sha": "9de0e26ce613f7e534b2ff3a92ad0d06d329efab", - "node_id": "C_kwDOAE3WVdoAKDlkZTBlMjZjZTYxM2Y3ZTUzNGIyZmYzYTkyYWQwZDA2ZDMyOWVmYWI", - "commit": { - "author": { - "name": "Emanuele Torre", - "email": "torreemanuele6@gmail.com", - "date": "2023-10-12T20:05:08Z" - }, - "committer": { - "name": "Nico Williams", - "email": "nico@cryptonector.com", - "date": "2023-10-12T20:32:23Z" - }, - "message": "Generate links in man page\n\nSome [foo](bar) links were added to manual.yml without updating\nbuild_manpage.py to make it generate roff for \"a\" tags.\n\nFixes #2930", - "tree": { - "sha": "fd4ad0a70b09c07a820a39bfa41f937e567c8538", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/fd4ad0a70b09c07a820a39bfa41f937e567c8538" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/9de0e26ce613f7e534b2ff3a92ad0d06d329efab", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/9de0e26ce613f7e534b2ff3a92ad0d06d329efab", - "html_url": "https://github.com/jqlang/jq/commit/9de0e26ce613f7e534b2ff3a92ad0d06d329efab", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/9de0e26ce613f7e534b2ff3a92ad0d06d329efab/comments", - "author": { - "login": "emanuele6", - "id": 20175435, - "node_id": "MDQ6VXNlcjIwMTc1NDM1", - "avatar_url": "https://avatars.githubusercontent.com/u/20175435?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/emanuele6", - "html_url": "https://github.com/emanuele6", - "followers_url": "https://api.github.com/users/emanuele6/followers", - "following_url": "https://api.github.com/users/emanuele6/following{/other_user}", - "gists_url": "https://api.github.com/users/emanuele6/gists{/gist_id}", - "starred_url": "https://api.github.com/users/emanuele6/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/emanuele6/subscriptions", - "organizations_url": "https://api.github.com/users/emanuele6/orgs", - "repos_url": "https://api.github.com/users/emanuele6/repos", - "events_url": "https://api.github.com/users/emanuele6/events{/privacy}", - "received_events_url": "https://api.github.com/users/emanuele6/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "c10cbbff34b25f447d45d1a997cf8606769875c8", - "url": "https://api.github.com/repos/jqlang/jq/commits/c10cbbff34b25f447d45d1a997cf8606769875c8", - "html_url": "https://github.com/jqlang/jq/commit/c10cbbff34b25f447d45d1a997cf8606769875c8" - } - ] - }, - { - "sha": "c10cbbff34b25f447d45d1a997cf8606769875c8", - "node_id": "C_kwDOAE3WVdoAKGMxMGNiYmZmMzRiMjVmNDQ3ZDQ1ZDFhOTk3Y2Y4NjA2NzY5ODc1Yzg", - "commit": { - "author": { - "name": "Gaelan Steele", - "email": "gbs@canishe.com", - "date": "2020-04-28T20:45:53Z" - }, - "committer": { - "name": "Nico Williams", - "email": "nico@cryptonector.com", - "date": "2023-10-08T17:32:22Z" - }, - "message": "Remove undefined behavior caught by LLVM 10 UBSAN.", - "tree": { - "sha": "bce6cc824440155be70b090198290a098bcb1870", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/bce6cc824440155be70b090198290a098bcb1870" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/c10cbbff34b25f447d45d1a997cf8606769875c8", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/c10cbbff34b25f447d45d1a997cf8606769875c8", - "html_url": "https://github.com/jqlang/jq/commit/c10cbbff34b25f447d45d1a997cf8606769875c8", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/c10cbbff34b25f447d45d1a997cf8606769875c8/comments", - "author": { - "login": "Gaelan", - "id": 4495750, - "node_id": "MDQ6VXNlcjQ0OTU3NTA=", - "avatar_url": "https://avatars.githubusercontent.com/u/4495750?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/Gaelan", - "html_url": "https://github.com/Gaelan", - "followers_url": "https://api.github.com/users/Gaelan/followers", - "following_url": "https://api.github.com/users/Gaelan/following{/other_user}", - "gists_url": "https://api.github.com/users/Gaelan/gists{/gist_id}", - "starred_url": "https://api.github.com/users/Gaelan/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/Gaelan/subscriptions", - "organizations_url": "https://api.github.com/users/Gaelan/orgs", - "repos_url": "https://api.github.com/users/Gaelan/repos", - "events_url": "https://api.github.com/users/Gaelan/events{/privacy}", - "received_events_url": "https://api.github.com/users/Gaelan/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "6b6feaffbbb258e9a6aed3495cb4e5100dd8ce84", - "url": "https://api.github.com/repos/jqlang/jq/commits/6b6feaffbbb258e9a6aed3495cb4e5100dd8ce84", - "html_url": "https://github.com/jqlang/jq/commit/6b6feaffbbb258e9a6aed3495cb4e5100dd8ce84" - } - ] - }, - { - "sha": "6b6feaffbbb258e9a6aed3495cb4e5100dd8ce84", - "node_id": "C_kwDOAE3WVdoAKDZiNmZlYWZmYmJiMjU4ZTlhNmFlZDM0OTVjYjRlNTEwMGRkOGNlODQ", - "commit": { - "author": { - "name": "Emanuele Torre", - "email": "torreemanuele6@gmail.com", - "date": "2023-10-05T13:37:44Z" - }, - "committer": { - "name": "Emanuele Torre", - "email": "torreemanuele6@gmail.com", - "date": "2023-10-05T13:37:44Z" - }, - "message": "Revert \"Revert \"od -c => od -tc: od -c is an XSI extension...\"\n\nThis reverts commit 0e70f7a57e08b6229c41ab98d1d9a9bca46625be.\n\nThere is no reason to revert this change.\n\nIn #2922, I only disagreed with the commit message suggesting that\n LC_CTYPE=C od -t c is equivalent to od -c\n\nThe only documented differences are that -tc is required to be\ninfluenced by -N and -j, while -c is not, and that -c is required to\nonly support a subset of the backslash sequences that -tc should\nsupport.", - "tree": { - "sha": "d80081308ad45e142abdde86f074fc8cbadd2ea8", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/d80081308ad45e142abdde86f074fc8cbadd2ea8" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/6b6feaffbbb258e9a6aed3495cb4e5100dd8ce84", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/6b6feaffbbb258e9a6aed3495cb4e5100dd8ce84", - "html_url": "https://github.com/jqlang/jq/commit/6b6feaffbbb258e9a6aed3495cb4e5100dd8ce84", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/6b6feaffbbb258e9a6aed3495cb4e5100dd8ce84/comments", - "author": { - "login": "emanuele6", - "id": 20175435, - "node_id": "MDQ6VXNlcjIwMTc1NDM1", - "avatar_url": "https://avatars.githubusercontent.com/u/20175435?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/emanuele6", - "html_url": "https://github.com/emanuele6", - "followers_url": "https://api.github.com/users/emanuele6/followers", - "following_url": "https://api.github.com/users/emanuele6/following{/other_user}", - "gists_url": "https://api.github.com/users/emanuele6/gists{/gist_id}", - "starred_url": "https://api.github.com/users/emanuele6/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/emanuele6/subscriptions", - "organizations_url": "https://api.github.com/users/emanuele6/orgs", - "repos_url": "https://api.github.com/users/emanuele6/repos", - "events_url": "https://api.github.com/users/emanuele6/events{/privacy}", - "received_events_url": "https://api.github.com/users/emanuele6/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "emanuele6", - "id": 20175435, - "node_id": "MDQ6VXNlcjIwMTc1NDM1", - "avatar_url": "https://avatars.githubusercontent.com/u/20175435?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/emanuele6", - "html_url": "https://github.com/emanuele6", - "followers_url": "https://api.github.com/users/emanuele6/followers", - "following_url": "https://api.github.com/users/emanuele6/following{/other_user}", - "gists_url": "https://api.github.com/users/emanuele6/gists{/gist_id}", - "starred_url": "https://api.github.com/users/emanuele6/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/emanuele6/subscriptions", - "organizations_url": "https://api.github.com/users/emanuele6/orgs", - "repos_url": "https://api.github.com/users/emanuele6/repos", - "events_url": "https://api.github.com/users/emanuele6/events{/privacy}", - "received_events_url": "https://api.github.com/users/emanuele6/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "0e70f7a57e08b6229c41ab98d1d9a9bca46625be", - "url": "https://api.github.com/repos/jqlang/jq/commits/0e70f7a57e08b6229c41ab98d1d9a9bca46625be", - "html_url": "https://github.com/jqlang/jq/commit/0e70f7a57e08b6229c41ab98d1d9a9bca46625be" - } - ] - }, - { - "sha": "0e70f7a57e08b6229c41ab98d1d9a9bca46625be", - "node_id": "C_kwDOAE3WVdoAKDBlNzBmN2E1N2UwOGI2MjI5YzQxYWI5OGQxZDlhOWJjYTQ2NjI1YmU", - "commit": { - "author": { - "name": "Nicolas Williams", - "email": "nico@cryptonector.com", - "date": "2023-10-05T03:28:24Z" - }, - "committer": { - "name": "Nicolas Williams", - "email": "nico@cryptonector.com", - "date": "2023-10-05T03:28:24Z" - }, - "message": "Revert \"od -c => od -tc: od -c is an XSI extension equivalent to LC_CTYPE=C od -tc and not universally available\"\n\nThis reverts commit 0bce9fb8ed0fbaeba0901ff9778756e4e037cd47.", - "tree": { - "sha": "674325b10323dae990841d4e7d84541e5a58acf1", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/674325b10323dae990841d4e7d84541e5a58acf1" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/0e70f7a57e08b6229c41ab98d1d9a9bca46625be", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/0e70f7a57e08b6229c41ab98d1d9a9bca46625be", - "html_url": "https://github.com/jqlang/jq/commit/0e70f7a57e08b6229c41ab98d1d9a9bca46625be", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/0e70f7a57e08b6229c41ab98d1d9a9bca46625be/comments", - "author": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "0bce9fb8ed0fbaeba0901ff9778756e4e037cd47", - "url": "https://api.github.com/repos/jqlang/jq/commits/0bce9fb8ed0fbaeba0901ff9778756e4e037cd47", - "html_url": "https://github.com/jqlang/jq/commit/0bce9fb8ed0fbaeba0901ff9778756e4e037cd47" - } - ] - }, - { - "sha": "0bce9fb8ed0fbaeba0901ff9778756e4e037cd47", - "node_id": "C_kwDOAE3WVdoAKDBiY2U5ZmI4ZWQwZmJhZWJhMDkwMWZmOTc3ODc1NmU0ZTAzN2NkNDc", - "commit": { - "author": { - "name": "наб", - "email": "nabijaczleweli@nabijaczleweli.xyz", - "date": "2023-10-04T18:52:03Z" - }, - "committer": { - "name": "Nico Williams", - "email": "nico@cryptonector.com", - "date": "2023-10-04T22:46:13Z" - }, - "message": "od -c => od -tc: od -c is an XSI extension equivalent to LC_CTYPE=C od -tc and not universally available", - "tree": { - "sha": "d80081308ad45e142abdde86f074fc8cbadd2ea8", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/d80081308ad45e142abdde86f074fc8cbadd2ea8" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/0bce9fb8ed0fbaeba0901ff9778756e4e037cd47", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/0bce9fb8ed0fbaeba0901ff9778756e4e037cd47", - "html_url": "https://github.com/jqlang/jq/commit/0bce9fb8ed0fbaeba0901ff9778756e4e037cd47", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/0bce9fb8ed0fbaeba0901ff9778756e4e037cd47/comments", - "author": { - "login": "nabijaczleweli", - "id": 6709544, - "node_id": "MDQ6VXNlcjY3MDk1NDQ=", - "avatar_url": "https://avatars.githubusercontent.com/u/6709544?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nabijaczleweli", - "html_url": "https://github.com/nabijaczleweli", - "followers_url": "https://api.github.com/users/nabijaczleweli/followers", - "following_url": "https://api.github.com/users/nabijaczleweli/following{/other_user}", - "gists_url": "https://api.github.com/users/nabijaczleweli/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nabijaczleweli/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nabijaczleweli/subscriptions", - "organizations_url": "https://api.github.com/users/nabijaczleweli/orgs", - "repos_url": "https://api.github.com/users/nabijaczleweli/repos", - "events_url": "https://api.github.com/users/nabijaczleweli/events{/privacy}", - "received_events_url": "https://api.github.com/users/nabijaczleweli/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "4ebd21e1ebcac6f59b0ed1ea09f56385756f268c", - "url": "https://api.github.com/repos/jqlang/jq/commits/4ebd21e1ebcac6f59b0ed1ea09f56385756f268c", - "html_url": "https://github.com/jqlang/jq/commit/4ebd21e1ebcac6f59b0ed1ea09f56385756f268c" - } - ] - }, - { - "sha": "4ebd21e1ebcac6f59b0ed1ea09f56385756f268c", - "node_id": "C_kwDOAE3WVdoAKDRlYmQyMWUxZWJjYWM2ZjU5YjBlZDFlYTA5ZjU2Mzg1NzU2ZjI2OGM", - "commit": { - "author": { - "name": "Emanuele Torre", - "email": "torreemanuele6@gmail.com", - "date": "2023-10-03T02:39:42Z" - }, - "committer": { - "name": "Nico Williams", - "email": "nico@cryptonector.com", - "date": "2023-10-04T05:00:46Z" - }, - "message": "Allow passing the inline jq script before --\n\njq previously only allowed passing the inline script before -- (as if\nthey were options) even though one would expect the inline script to be\na positional argument.\n\nSince jq previously also refused to run with a usage error if the script\nwas passed after -- (It was not assuming . as script as it does when\nno arguments are passed), and positional arguments are allowed before --\nand even before other options, it should not be a breaking change to\nchange that weird behaviour, and allow the script to appear after --.\n\nIt also simplifies the option parsing code a bunch.\n\nFixes #2918", - "tree": { - "sha": "674325b10323dae990841d4e7d84541e5a58acf1", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/674325b10323dae990841d4e7d84541e5a58acf1" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/4ebd21e1ebcac6f59b0ed1ea09f56385756f268c", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/4ebd21e1ebcac6f59b0ed1ea09f56385756f268c", - "html_url": "https://github.com/jqlang/jq/commit/4ebd21e1ebcac6f59b0ed1ea09f56385756f268c", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/4ebd21e1ebcac6f59b0ed1ea09f56385756f268c/comments", - "author": { - "login": "emanuele6", - "id": 20175435, - "node_id": "MDQ6VXNlcjIwMTc1NDM1", - "avatar_url": "https://avatars.githubusercontent.com/u/20175435?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/emanuele6", - "html_url": "https://github.com/emanuele6", - "followers_url": "https://api.github.com/users/emanuele6/followers", - "following_url": "https://api.github.com/users/emanuele6/following{/other_user}", - "gists_url": "https://api.github.com/users/emanuele6/gists{/gist_id}", - "starred_url": "https://api.github.com/users/emanuele6/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/emanuele6/subscriptions", - "organizations_url": "https://api.github.com/users/emanuele6/orgs", - "repos_url": "https://api.github.com/users/emanuele6/repos", - "events_url": "https://api.github.com/users/emanuele6/events{/privacy}", - "received_events_url": "https://api.github.com/users/emanuele6/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "7f547827e47b5ade563a293329deb4226496d72f", - "url": "https://api.github.com/repos/jqlang/jq/commits/7f547827e47b5ade563a293329deb4226496d72f", - "html_url": "https://github.com/jqlang/jq/commit/7f547827e47b5ade563a293329deb4226496d72f" - } - ] - }, - { - "sha": "7f547827e47b5ade563a293329deb4226496d72f", - "node_id": "C_kwDOAE3WVdoAKDdmNTQ3ODI3ZTQ3YjVhZGU1NjNhMjkzMzI5ZGViNDIyNjQ5NmQ3MmY", - "commit": { - "author": { - "name": "Thomas Bozeman th026106", - "email": "thomas.bozeman@digitalglobe.com", - "date": "2023-10-03T17:50:08Z" - }, - "committer": { - "name": "Emanuele Torre", - "email": "torreemanuele6@gmail.com", - "date": "2023-10-03T20:48:12Z" - }, - "message": "Simplify `pick` example\n\nOld pick example included input array in command line, making `input` confusing\nand redundant.", - "tree": { - "sha": "7918c86308a5d0caffc97b76a7a120e3023b37cd", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/7918c86308a5d0caffc97b76a7a120e3023b37cd" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/7f547827e47b5ade563a293329deb4226496d72f", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/7f547827e47b5ade563a293329deb4226496d72f", - "html_url": "https://github.com/jqlang/jq/commit/7f547827e47b5ade563a293329deb4226496d72f", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/7f547827e47b5ade563a293329deb4226496d72f/comments", - "author": null, - "committer": { - "login": "emanuele6", - "id": 20175435, - "node_id": "MDQ6VXNlcjIwMTc1NDM1", - "avatar_url": "https://avatars.githubusercontent.com/u/20175435?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/emanuele6", - "html_url": "https://github.com/emanuele6", - "followers_url": "https://api.github.com/users/emanuele6/followers", - "following_url": "https://api.github.com/users/emanuele6/following{/other_user}", - "gists_url": "https://api.github.com/users/emanuele6/gists{/gist_id}", - "starred_url": "https://api.github.com/users/emanuele6/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/emanuele6/subscriptions", - "organizations_url": "https://api.github.com/users/emanuele6/orgs", - "repos_url": "https://api.github.com/users/emanuele6/repos", - "events_url": "https://api.github.com/users/emanuele6/events{/privacy}", - "received_events_url": "https://api.github.com/users/emanuele6/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "6b5a18f0369eb765c1c9542cc886d389dac66c50", - "url": "https://api.github.com/repos/jqlang/jq/commits/6b5a18f0369eb765c1c9542cc886d389dac66c50", - "html_url": "https://github.com/jqlang/jq/commit/6b5a18f0369eb765c1c9542cc886d389dac66c50" - } - ] - }, - { - "sha": "6b5a18f0369eb765c1c9542cc886d389dac66c50", - "node_id": "C_kwDOAE3WVdoAKDZiNWExOGYwMzY5ZWI3NjVjMWM5NTQyY2M4ODZkMzg5ZGFjNjZjNTA", - "commit": { - "author": { - "name": "Emanuele Torre", - "email": "torreemanuele6@gmail.com", - "date": "2023-09-28T03:32:41Z" - }, - "committer": { - "name": "Nico Williams", - "email": "nico@cryptonector.com", - "date": "2023-09-28T03:54:23Z" - }, - "message": "Actually use number correctly casted from double to int as index\n\nThe code was using (int)jv_number_value(k) instead of (int)didx.\n\nfollow-up from 0e067ef93605493060392f0999be27694146fca4\n\nUseless assignments to didx detected by clang-tidy.", - "tree": { - "sha": "f6c0c52994f63bfab8ead77191d226a99c90176c", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/f6c0c52994f63bfab8ead77191d226a99c90176c" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/6b5a18f0369eb765c1c9542cc886d389dac66c50", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/6b5a18f0369eb765c1c9542cc886d389dac66c50", - "html_url": "https://github.com/jqlang/jq/commit/6b5a18f0369eb765c1c9542cc886d389dac66c50", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/6b5a18f0369eb765c1c9542cc886d389dac66c50/comments", - "author": { - "login": "emanuele6", - "id": 20175435, - "node_id": "MDQ6VXNlcjIwMTc1NDM1", - "avatar_url": "https://avatars.githubusercontent.com/u/20175435?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/emanuele6", - "html_url": "https://github.com/emanuele6", - "followers_url": "https://api.github.com/users/emanuele6/followers", - "following_url": "https://api.github.com/users/emanuele6/following{/other_user}", - "gists_url": "https://api.github.com/users/emanuele6/gists{/gist_id}", - "starred_url": "https://api.github.com/users/emanuele6/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/emanuele6/subscriptions", - "organizations_url": "https://api.github.com/users/emanuele6/orgs", - "repos_url": "https://api.github.com/users/emanuele6/repos", - "events_url": "https://api.github.com/users/emanuele6/events{/privacy}", - "received_events_url": "https://api.github.com/users/emanuele6/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "8206bc8fd2302715cb0948a4468996aecc3c5f7a", - "url": "https://api.github.com/repos/jqlang/jq/commits/8206bc8fd2302715cb0948a4468996aecc3c5f7a", - "html_url": "https://github.com/jqlang/jq/commit/8206bc8fd2302715cb0948a4468996aecc3c5f7a" - } - ] - }, - { - "sha": "8206bc8fd2302715cb0948a4468996aecc3c5f7a", - "node_id": "C_kwDOAE3WVdoAKDgyMDZiYzhmZDIzMDI3MTVjYjA5NDhhNDQ2ODk5NmFlY2MzYzVmN2E", - "commit": { - "author": { - "name": "Emanuele Torre", - "email": "torreemanuele6@gmail.com", - "date": "2023-09-28T01:25:55Z" - }, - "committer": { - "name": "Nico Williams", - "email": "nico@cryptonector.com", - "date": "2023-09-28T02:52:23Z" - }, - "message": "main.c: Remove unused EXIT_STATUS_EXACT option\n\nIn process there is a suspicious options |= EXIT_STATUS_EXACT that\nis run when the jq script is terminated by halt, or halt_error.\n\nThat line of code acutally does nothing because options is a local\nargument variable, and is not passed as a pointer. It was probably meant\nto be a *options |= EXIT_STATUS_EXACT with the options argument\npassed as a int*.\n\nIn any case, we do not want to run the code in main() that was supposed\nto run if EXIT_STATUS_EXACT is set (but didn't since it is never added\nto options); as far as I can tell, we only want to run that code when\nthe --exit-status/-e option is passed.\n\nSo I removed EXIT_STATUS_EXACT completely, and the useless assignment,\ninstead of fixing it since it was not used for anything else.\n\nUseless assignment detected by clang-tidy.", - "tree": { - "sha": "ff28bcbd96d90790fb95176521aed93a7594e31b", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/ff28bcbd96d90790fb95176521aed93a7594e31b" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/8206bc8fd2302715cb0948a4468996aecc3c5f7a", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/8206bc8fd2302715cb0948a4468996aecc3c5f7a", - "html_url": "https://github.com/jqlang/jq/commit/8206bc8fd2302715cb0948a4468996aecc3c5f7a", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/8206bc8fd2302715cb0948a4468996aecc3c5f7a/comments", - "author": { - "login": "emanuele6", - "id": 20175435, - "node_id": "MDQ6VXNlcjIwMTc1NDM1", - "avatar_url": "https://avatars.githubusercontent.com/u/20175435?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/emanuele6", - "html_url": "https://github.com/emanuele6", - "followers_url": "https://api.github.com/users/emanuele6/followers", - "following_url": "https://api.github.com/users/emanuele6/following{/other_user}", - "gists_url": "https://api.github.com/users/emanuele6/gists{/gist_id}", - "starred_url": "https://api.github.com/users/emanuele6/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/emanuele6/subscriptions", - "organizations_url": "https://api.github.com/users/emanuele6/orgs", - "repos_url": "https://api.github.com/users/emanuele6/repos", - "events_url": "https://api.github.com/users/emanuele6/events{/privacy}", - "received_events_url": "https://api.github.com/users/emanuele6/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "623ace27e881c0daa43c73201f8131cf8b9c2cec", - "url": "https://api.github.com/repos/jqlang/jq/commits/623ace27e881c0daa43c73201f8131cf8b9c2cec", - "html_url": "https://github.com/jqlang/jq/commit/623ace27e881c0daa43c73201f8131cf8b9c2cec" - } - ] - }, - { - "sha": "623ace27e881c0daa43c73201f8131cf8b9c2cec", - "node_id": "C_kwDOAE3WVdoAKDYyM2FjZTI3ZTg4MWMwZGFhNDNjNzMyMDFmODEzMWNmOGI5YzJjZWM", - "commit": { - "author": { - "name": "Emanuele Torre", - "email": "torreemanuele6@gmail.com", - "date": "2023-09-28T01:20:49Z" - }, - "committer": { - "name": "Nico Williams", - "email": "nico@cryptonector.com", - "date": "2023-09-28T02:50:44Z" - }, - "message": "Remove a bunch of unused variables, and useless assignments\n\nDetected by clang-tidy.", - "tree": { - "sha": "e139d865c8d85ebfc912b0e58a7b852eaff38b97", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/e139d865c8d85ebfc912b0e58a7b852eaff38b97" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/623ace27e881c0daa43c73201f8131cf8b9c2cec", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/623ace27e881c0daa43c73201f8131cf8b9c2cec", - "html_url": "https://github.com/jqlang/jq/commit/623ace27e881c0daa43c73201f8131cf8b9c2cec", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/623ace27e881c0daa43c73201f8131cf8b9c2cec/comments", - "author": { - "login": "emanuele6", - "id": 20175435, - "node_id": "MDQ6VXNlcjIwMTc1NDM1", - "avatar_url": "https://avatars.githubusercontent.com/u/20175435?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/emanuele6", - "html_url": "https://github.com/emanuele6", - "followers_url": "https://api.github.com/users/emanuele6/followers", - "following_url": "https://api.github.com/users/emanuele6/following{/other_user}", - "gists_url": "https://api.github.com/users/emanuele6/gists{/gist_id}", - "starred_url": "https://api.github.com/users/emanuele6/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/emanuele6/subscriptions", - "organizations_url": "https://api.github.com/users/emanuele6/orgs", - "repos_url": "https://api.github.com/users/emanuele6/repos", - "events_url": "https://api.github.com/users/emanuele6/events{/privacy}", - "received_events_url": "https://api.github.com/users/emanuele6/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "2b709727a9654eee3f36399b5fc6b0f83396e7a7", - "url": "https://api.github.com/repos/jqlang/jq/commits/2b709727a9654eee3f36399b5fc6b0f83396e7a7", - "html_url": "https://github.com/jqlang/jq/commit/2b709727a9654eee3f36399b5fc6b0f83396e7a7" - } - ] - }, - { - "sha": "2b709727a9654eee3f36399b5fc6b0f83396e7a7", - "node_id": "C_kwDOAE3WVdoAKDJiNzA5NzI3YTk2NTRlZWUzZjM2Mzk5YjVmYzZiMGY4MzM5NmU3YTc", - "commit": { - "author": { - "name": "Emanuele Torre", - "email": "torreemanuele6@gmail.com", - "date": "2023-09-28T01:19:53Z" - }, - "committer": { - "name": "Nico Williams", - "email": "nico@cryptonector.com", - "date": "2023-09-28T02:50:44Z" - }, - "message": "Remove unused nref accumulator in block_bind_library\n\ndetected as a warning compiling jq with clang.", - "tree": { - "sha": "4c97efc9b2cd295fe7a89da3e9171120b1c2ccc8", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/4c97efc9b2cd295fe7a89da3e9171120b1c2ccc8" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/2b709727a9654eee3f36399b5fc6b0f83396e7a7", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/2b709727a9654eee3f36399b5fc6b0f83396e7a7", - "html_url": "https://github.com/jqlang/jq/commit/2b709727a9654eee3f36399b5fc6b0f83396e7a7", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/2b709727a9654eee3f36399b5fc6b0f83396e7a7/comments", - "author": { - "login": "emanuele6", - "id": 20175435, - "node_id": "MDQ6VXNlcjIwMTc1NDM1", - "avatar_url": "https://avatars.githubusercontent.com/u/20175435?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/emanuele6", - "html_url": "https://github.com/emanuele6", - "followers_url": "https://api.github.com/users/emanuele6/followers", - "following_url": "https://api.github.com/users/emanuele6/following{/other_user}", - "gists_url": "https://api.github.com/users/emanuele6/gists{/gist_id}", - "starred_url": "https://api.github.com/users/emanuele6/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/emanuele6/subscriptions", - "organizations_url": "https://api.github.com/users/emanuele6/orgs", - "repos_url": "https://api.github.com/users/emanuele6/repos", - "events_url": "https://api.github.com/users/emanuele6/events{/privacy}", - "received_events_url": "https://api.github.com/users/emanuele6/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "07149397d13642d8104b30eb824be74cc8fac44d", - "url": "https://api.github.com/repos/jqlang/jq/commits/07149397d13642d8104b30eb824be74cc8fac44d", - "html_url": "https://github.com/jqlang/jq/commit/07149397d13642d8104b30eb824be74cc8fac44d" - } - ] - }, - { - "sha": "07149397d13642d8104b30eb824be74cc8fac44d", - "node_id": "C_kwDOAE3WVdoAKDA3MTQ5Mzk3ZDEzNjQyZDgxMDRiMzBlYjgyNGJlNzRjYzhmYWM0NGQ", - "commit": { - "author": { - "name": "itchyny", - "email": "itchyny@cybozu.co.jp", - "date": "2023-09-26T13:03:39Z" - }, - "committer": { - "name": "Nico Williams", - "email": "nico@cryptonector.com", - "date": "2023-09-26T17:53:44Z" - }, - "message": "Reject U+001F in string literals (fix #2909)", - "tree": { - "sha": "6cb986d2167c9965ea1dddcac7f2bba27f0cbcad", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/6cb986d2167c9965ea1dddcac7f2bba27f0cbcad" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/07149397d13642d8104b30eb824be74cc8fac44d", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/07149397d13642d8104b30eb824be74cc8fac44d", - "html_url": "https://github.com/jqlang/jq/commit/07149397d13642d8104b30eb824be74cc8fac44d", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/07149397d13642d8104b30eb824be74cc8fac44d/comments", - "author": { - "login": "itchyny", - "id": 375258, - "node_id": "MDQ6VXNlcjM3NTI1OA==", - "avatar_url": "https://avatars.githubusercontent.com/u/375258?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/itchyny", - "html_url": "https://github.com/itchyny", - "followers_url": "https://api.github.com/users/itchyny/followers", - "following_url": "https://api.github.com/users/itchyny/following{/other_user}", - "gists_url": "https://api.github.com/users/itchyny/gists{/gist_id}", - "starred_url": "https://api.github.com/users/itchyny/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/itchyny/subscriptions", - "organizations_url": "https://api.github.com/users/itchyny/orgs", - "repos_url": "https://api.github.com/users/itchyny/repos", - "events_url": "https://api.github.com/users/itchyny/events{/privacy}", - "received_events_url": "https://api.github.com/users/itchyny/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "e526df15fe083b174e292da1eb4236b7e9101de4", - "url": "https://api.github.com/repos/jqlang/jq/commits/e526df15fe083b174e292da1eb4236b7e9101de4", - "html_url": "https://github.com/jqlang/jq/commit/e526df15fe083b174e292da1eb4236b7e9101de4" - } - ] - }, - { - "sha": "e526df15fe083b174e292da1eb4236b7e9101de4", - "node_id": "C_kwDOAE3WVdoAKGU1MjZkZjE1ZmUwODNiMTc0ZTI5MmRhMWViNDIzNmI3ZTkxMDFkZTQ", - "commit": { - "author": { - "name": "itchyny", - "email": "itchyny@cybozu.co.jp", - "date": "2023-09-26T17:49:07Z" - }, - "committer": { - "name": "GitHub", - "email": "noreply@github.com", - "date": "2023-09-26T17:49:07Z" - }, - "message": "Correct typo in README.md: compilation (#2912)", - "tree": { - "sha": "dc11882bcfe811351ce9ee4bed9f83167b43c03c", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/dc11882bcfe811351ce9ee4bed9f83167b43c03c" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/e526df15fe083b174e292da1eb4236b7e9101de4", - "comment_count": 0, - "verification": { - "verified": true, - "reason": "valid", - "signature": "-----BEGIN PGP SIGNATURE-----\n\nwsBcBAABCAAQBQJlExmTCRBK7hj4Ov3rIwAAyEQIAKLm8vD6Ishr7yIXh5NjANI1\n5FQJPwnEWwI8d0V0w//+pRwxj45GaTYTela5yOtGhr+Ofr/iVWVw+EzTkPgWuReS\n5tbFzz1IWA4s8TVrGgkFvIrg5JfvjPwmVS9oSvO0c9Q5MOJ+uc/g96txxBzwPFti\ntZI4zuSIw6xhY9DcSrvMBd5VrO8fn9R7DcIf0jwHaJL+FGZzf57LBGOw2Ux2SWUY\ntNYpa6hT4QgpSOXxfOoQUFpDmxAvx3l54GxdWdQV5wbseD+BByJu5kGN/bIDoIMP\nGcY5LM/iRSVwKuFXHWpIZRtfAl+iGLfITBn/6pTTCT/R6y3v+vXl1P/VNxKi2cQ=\n=5/wp\n-----END PGP SIGNATURE-----\n", - "payload": "tree dc11882bcfe811351ce9ee4bed9f83167b43c03c\nparent 8f81668014f4df2654aa9ab674b5498aa9446441\nauthor itchyny 1695750547 +0900\ncommitter GitHub 1695750547 +0200\n\nCorrect typo in README.md: compilation (#2912)\n\n" - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/e526df15fe083b174e292da1eb4236b7e9101de4", - "html_url": "https://github.com/jqlang/jq/commit/e526df15fe083b174e292da1eb4236b7e9101de4", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/e526df15fe083b174e292da1eb4236b7e9101de4/comments", - "author": { - "login": "itchyny", - "id": 375258, - "node_id": "MDQ6VXNlcjM3NTI1OA==", - "avatar_url": "https://avatars.githubusercontent.com/u/375258?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/itchyny", - "html_url": "https://github.com/itchyny", - "followers_url": "https://api.github.com/users/itchyny/followers", - "following_url": "https://api.github.com/users/itchyny/following{/other_user}", - "gists_url": "https://api.github.com/users/itchyny/gists{/gist_id}", - "starred_url": "https://api.github.com/users/itchyny/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/itchyny/subscriptions", - "organizations_url": "https://api.github.com/users/itchyny/orgs", - "repos_url": "https://api.github.com/users/itchyny/repos", - "events_url": "https://api.github.com/users/itchyny/events{/privacy}", - "received_events_url": "https://api.github.com/users/itchyny/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "web-flow", - "id": 19864447, - "node_id": "MDQ6VXNlcjE5ODY0NDQ3", - "avatar_url": "https://avatars.githubusercontent.com/u/19864447?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/web-flow", - "html_url": "https://github.com/web-flow", - "followers_url": "https://api.github.com/users/web-flow/followers", - "following_url": "https://api.github.com/users/web-flow/following{/other_user}", - "gists_url": "https://api.github.com/users/web-flow/gists{/gist_id}", - "starred_url": "https://api.github.com/users/web-flow/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/web-flow/subscriptions", - "organizations_url": "https://api.github.com/users/web-flow/orgs", - "repos_url": "https://api.github.com/users/web-flow/repos", - "events_url": "https://api.github.com/users/web-flow/events{/privacy}", - "received_events_url": "https://api.github.com/users/web-flow/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "8f81668014f4df2654aa9ab674b5498aa9446441", - "url": "https://api.github.com/repos/jqlang/jq/commits/8f81668014f4df2654aa9ab674b5498aa9446441", - "html_url": "https://github.com/jqlang/jq/commit/8f81668014f4df2654aa9ab674b5498aa9446441" - } - ] - }, - { - "sha": "8f81668014f4df2654aa9ab674b5498aa9446441", - "node_id": "C_kwDOAE3WVdoAKDhmODE2NjgwMTRmNGRmMjY1NGFhOWFiNjc0YjU0OThhYTk0NDY0NDE", - "commit": { - "author": { - "name": "taoky", - "email": "taoky99@outlook.com", - "date": "2023-09-22T00:18:41Z" - }, - "committer": { - "name": "GitHub", - "email": "noreply@github.com", - "date": "2023-09-22T00:18:41Z" - }, - "message": "Fix the default colors to use 39, the default foreground color (#2904)", - "tree": { - "sha": "223b8e8db917ea45390102bfff4c9b34b00e2563", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/223b8e8db917ea45390102bfff4c9b34b00e2563" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/8f81668014f4df2654aa9ab674b5498aa9446441", - "comment_count": 0, - "verification": { - "verified": true, - "reason": "valid", - "signature": "-----BEGIN PGP SIGNATURE-----\n\nwsBcBAABCAAQBQJlDN1hCRBK7hj4Ov3rIwAAqqwIACweocODkDgM90mr1OFE0LHi\n61jMtGZEUvy/pscOxHlRR99A5Z+1C4c5rvMYt/dnZRVAOoyczTt9i/YGpZ/+7iYM\nOQnCr41EbvsWWN/lpfvcbFPCGP8OLgwdSMb76/JJroT50jWieEBFYJkqaoU884wS\nM9C714Cobo3KkCL4lyveB6obqOiOdufM5pjOPaa9m28UOWEew0HGgHT6eXR+/+cy\nQGbwHiuAYoPOSOWc5zkaWTNWcS5DxSGuNHlZphXG5FdSK3H2kN2bGTyYUEndYzZq\nVOlECUNy9qTmoqq/5Nj+ZWLNWxcpo16SYa8ZYqjjMkbKUhcu792A7bZMdzdoufw=\n=3nf1\n-----END PGP SIGNATURE-----\n", - "payload": "tree 223b8e8db917ea45390102bfff4c9b34b00e2563\nparent de1c10ca8a5e333102a00bfcb06ff98f40c774c3\nauthor taoky 1695341921 +0800\ncommitter GitHub 1695341921 +0900\n\nFix the default colors to use 39, the default foreground color (#2904)\n\n" - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/8f81668014f4df2654aa9ab674b5498aa9446441", - "html_url": "https://github.com/jqlang/jq/commit/8f81668014f4df2654aa9ab674b5498aa9446441", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/8f81668014f4df2654aa9ab674b5498aa9446441/comments", - "author": { - "login": "taoky", - "id": 2109893, - "node_id": "MDQ6VXNlcjIxMDk4OTM=", - "avatar_url": "https://avatars.githubusercontent.com/u/2109893?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/taoky", - "html_url": "https://github.com/taoky", - "followers_url": "https://api.github.com/users/taoky/followers", - "following_url": "https://api.github.com/users/taoky/following{/other_user}", - "gists_url": "https://api.github.com/users/taoky/gists{/gist_id}", - "starred_url": "https://api.github.com/users/taoky/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/taoky/subscriptions", - "organizations_url": "https://api.github.com/users/taoky/orgs", - "repos_url": "https://api.github.com/users/taoky/repos", - "events_url": "https://api.github.com/users/taoky/events{/privacy}", - "received_events_url": "https://api.github.com/users/taoky/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "web-flow", - "id": 19864447, - "node_id": "MDQ6VXNlcjE5ODY0NDQ3", - "avatar_url": "https://avatars.githubusercontent.com/u/19864447?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/web-flow", - "html_url": "https://github.com/web-flow", - "followers_url": "https://api.github.com/users/web-flow/followers", - "following_url": "https://api.github.com/users/web-flow/following{/other_user}", - "gists_url": "https://api.github.com/users/web-flow/gists{/gist_id}", - "starred_url": "https://api.github.com/users/web-flow/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/web-flow/subscriptions", - "organizations_url": "https://api.github.com/users/web-flow/orgs", - "repos_url": "https://api.github.com/users/web-flow/repos", - "events_url": "https://api.github.com/users/web-flow/events{/privacy}", - "received_events_url": "https://api.github.com/users/web-flow/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "de1c10ca8a5e333102a00bfcb06ff98f40c774c3", - "url": "https://api.github.com/repos/jqlang/jq/commits/de1c10ca8a5e333102a00bfcb06ff98f40c774c3", - "html_url": "https://github.com/jqlang/jq/commit/de1c10ca8a5e333102a00bfcb06ff98f40c774c3" - } - ] - }, - { - "sha": "de1c10ca8a5e333102a00bfcb06ff98f40c774c3", - "node_id": "C_kwDOAE3WVdoAKGRlMWMxMGNhOGE1ZTMzMzEwMmEwMGJmY2IwNmZmOThmNDBjNzc0YzM", - "commit": { - "author": { - "name": "dependabot[bot]", - "email": "49699333+dependabot[bot]@users.noreply.github.com", - "date": "2023-09-18T09:20:43Z" - }, - "committer": { - "name": "GitHub", - "email": "noreply@github.com", - "date": "2023-09-18T09:20:43Z" - }, - "message": "Bump docker/setup-qemu-action from 2 to 3 (#2900)\n\nBumps [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action) from 2 to 3.\r\n- [Release notes](https://github.com/docker/setup-qemu-action/releases)\r\n- [Commits](https://github.com/docker/setup-qemu-action/compare/v2...v3)\r\n\r\n---\r\nupdated-dependencies:\r\n- dependency-name: docker/setup-qemu-action\r\n dependency-type: direct:production\r\n update-type: version-update:semver-major\r\n...\r\n\r\nSigned-off-by: dependabot[bot] \r\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>", - "tree": { - "sha": "a9ae5a8adc5c344000884a4c5876e806265e867f", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/a9ae5a8adc5c344000884a4c5876e806265e867f" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/de1c10ca8a5e333102a00bfcb06ff98f40c774c3", - "comment_count": 0, - "verification": { - "verified": true, - "reason": "valid", - "signature": "-----BEGIN PGP SIGNATURE-----\n\nwsBcBAABCAAQBQJlCBZrCRBK7hj4Ov3rIwAADRUIAJU/fKComvCurTD2RzT4Ynzr\n2ANEOsvaNZlc5o/OfwInsbh+fLA/aFzCWn7kjdPe34q5C2o0npXw/zENL7WwwqbN\nJu1QpCLNNpqbMW1qQEOwxc6lag9dM3Zf4/DUkD3Is7SDKc0QgUHGM5ZmojHShvY/\nmcVZNVF1FskEncWmD+6WGRWzgyu/lFKNiGkxlYULElRUJRKUSYh7j7Fe+Mj88X4l\nwqqLBRGYAUkTAddXwyGSn4Nn/MJRTzmHw7vnv95N2h0lzYrECTAr7fKcWedcu/qR\n2n192nZC5suwYOKK1QNUI1KXzoWfWV5eROJrkkfVJyami2NcND4917TX4k5dFdk=\n=6tsc\n-----END PGP SIGNATURE-----\n", - "payload": "tree a9ae5a8adc5c344000884a4c5876e806265e867f\nparent a5afeea0a63ced3f192c2c93586496a247860931\nauthor dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> 1695028843 +0900\ncommitter GitHub 1695028843 +0900\n\nBump docker/setup-qemu-action from 2 to 3 (#2900)\n\nBumps [docker/setup-qemu-action](https://github.com/docker/setup-qemu-action) from 2 to 3.\r\n- [Release notes](https://github.com/docker/setup-qemu-action/releases)\r\n- [Commits](https://github.com/docker/setup-qemu-action/compare/v2...v3)\r\n\r\n---\r\nupdated-dependencies:\r\n- dependency-name: docker/setup-qemu-action\r\n dependency-type: direct:production\r\n update-type: version-update:semver-major\r\n...\r\n\r\nSigned-off-by: dependabot[bot] \r\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>" - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/de1c10ca8a5e333102a00bfcb06ff98f40c774c3", - "html_url": "https://github.com/jqlang/jq/commit/de1c10ca8a5e333102a00bfcb06ff98f40c774c3", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/de1c10ca8a5e333102a00bfcb06ff98f40c774c3/comments", - "author": { - "login": "dependabot[bot]", - "id": 49699333, - "node_id": "MDM6Qm90NDk2OTkzMzM=", - "avatar_url": "https://avatars.githubusercontent.com/in/29110?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/dependabot%5Bbot%5D", - "html_url": "https://github.com/apps/dependabot", - "followers_url": "https://api.github.com/users/dependabot%5Bbot%5D/followers", - "following_url": "https://api.github.com/users/dependabot%5Bbot%5D/following{/other_user}", - "gists_url": "https://api.github.com/users/dependabot%5Bbot%5D/gists{/gist_id}", - "starred_url": "https://api.github.com/users/dependabot%5Bbot%5D/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/dependabot%5Bbot%5D/subscriptions", - "organizations_url": "https://api.github.com/users/dependabot%5Bbot%5D/orgs", - "repos_url": "https://api.github.com/users/dependabot%5Bbot%5D/repos", - "events_url": "https://api.github.com/users/dependabot%5Bbot%5D/events{/privacy}", - "received_events_url": "https://api.github.com/users/dependabot%5Bbot%5D/received_events", - "type": "Bot", - "site_admin": false - }, - "committer": { - "login": "web-flow", - "id": 19864447, - "node_id": "MDQ6VXNlcjE5ODY0NDQ3", - "avatar_url": "https://avatars.githubusercontent.com/u/19864447?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/web-flow", - "html_url": "https://github.com/web-flow", - "followers_url": "https://api.github.com/users/web-flow/followers", - "following_url": "https://api.github.com/users/web-flow/following{/other_user}", - "gists_url": "https://api.github.com/users/web-flow/gists{/gist_id}", - "starred_url": "https://api.github.com/users/web-flow/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/web-flow/subscriptions", - "organizations_url": "https://api.github.com/users/web-flow/orgs", - "repos_url": "https://api.github.com/users/web-flow/repos", - "events_url": "https://api.github.com/users/web-flow/events{/privacy}", - "received_events_url": "https://api.github.com/users/web-flow/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "a5afeea0a63ced3f192c2c93586496a247860931", - "url": "https://api.github.com/repos/jqlang/jq/commits/a5afeea0a63ced3f192c2c93586496a247860931", - "html_url": "https://github.com/jqlang/jq/commit/a5afeea0a63ced3f192c2c93586496a247860931" - } - ] - }, - { - "sha": "a5afeea0a63ced3f192c2c93586496a247860931", - "node_id": "C_kwDOAE3WVdoAKGE1YWZlZWEwYTYzY2VkM2YxOTJjMmM5MzU4NjQ5NmEyNDc4NjA5MzE", - "commit": { - "author": { - "name": "dependabot[bot]", - "email": "49699333+dependabot[bot]@users.noreply.github.com", - "date": "2023-09-18T09:20:20Z" - }, - "committer": { - "name": "GitHub", - "email": "noreply@github.com", - "date": "2023-09-18T09:20:20Z" - }, - "message": "Bump docker/setup-buildx-action from 2 to 3 (#2901)\n\nBumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 2 to 3.\r\n- [Release notes](https://github.com/docker/setup-buildx-action/releases)\r\n- [Commits](https://github.com/docker/setup-buildx-action/compare/v2...v3)\r\n\r\n---\r\nupdated-dependencies:\r\n- dependency-name: docker/setup-buildx-action\r\n dependency-type: direct:production\r\n update-type: version-update:semver-major\r\n...\r\n\r\nSigned-off-by: dependabot[bot] \r\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>", - "tree": { - "sha": "d037b9271768a1668880a8e1d6fcd121793e7121", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/d037b9271768a1668880a8e1d6fcd121793e7121" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/a5afeea0a63ced3f192c2c93586496a247860931", - "comment_count": 0, - "verification": { - "verified": true, - "reason": "valid", - "signature": "-----BEGIN PGP SIGNATURE-----\n\nwsBcBAABCAAQBQJlCBZUCRBK7hj4Ov3rIwAATHkIAE96bdd+osR7RIOPKCOXewT1\nhwICtPU7PXZ8KM+Y+72LweDu+gX2/YJwoJUXwPySEki/EtNs7fefJTm2OXmZwyAy\nADdDYu05lz3mTgVosyMBK9iU0K6E+hTYno+WQdZsFWF+OLe+mnfU80kZ65CiK+ks\nWAnJI/7oxxYF4cmEO/ijzVgpczWttP2qmU7P1ieabwTZHFXkk4vd6chxRmbNyEYL\nOtFVX5JRRo7+eXhfxrqpLAi0hi8UBg1uumJRNkOAXn23lwSlK2/vFNpI4Mic4E2k\nLdUVAQ4+PnVCcMUDf6c6KnVdcvqkQ9CZ9FHtv1at7XCt/z7yaetZGum8Ptntflo=\n=1yh2\n-----END PGP SIGNATURE-----\n", - "payload": "tree d037b9271768a1668880a8e1d6fcd121793e7121\nparent b0b7614daf4007262562c152b456981707c99d4a\nauthor dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> 1695028820 +0900\ncommitter GitHub 1695028820 +0900\n\nBump docker/setup-buildx-action from 2 to 3 (#2901)\n\nBumps [docker/setup-buildx-action](https://github.com/docker/setup-buildx-action) from 2 to 3.\r\n- [Release notes](https://github.com/docker/setup-buildx-action/releases)\r\n- [Commits](https://github.com/docker/setup-buildx-action/compare/v2...v3)\r\n\r\n---\r\nupdated-dependencies:\r\n- dependency-name: docker/setup-buildx-action\r\n dependency-type: direct:production\r\n update-type: version-update:semver-major\r\n...\r\n\r\nSigned-off-by: dependabot[bot] \r\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>" - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/a5afeea0a63ced3f192c2c93586496a247860931", - "html_url": "https://github.com/jqlang/jq/commit/a5afeea0a63ced3f192c2c93586496a247860931", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/a5afeea0a63ced3f192c2c93586496a247860931/comments", - "author": { - "login": "dependabot[bot]", - "id": 49699333, - "node_id": "MDM6Qm90NDk2OTkzMzM=", - "avatar_url": "https://avatars.githubusercontent.com/in/29110?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/dependabot%5Bbot%5D", - "html_url": "https://github.com/apps/dependabot", - "followers_url": "https://api.github.com/users/dependabot%5Bbot%5D/followers", - "following_url": "https://api.github.com/users/dependabot%5Bbot%5D/following{/other_user}", - "gists_url": "https://api.github.com/users/dependabot%5Bbot%5D/gists{/gist_id}", - "starred_url": "https://api.github.com/users/dependabot%5Bbot%5D/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/dependabot%5Bbot%5D/subscriptions", - "organizations_url": "https://api.github.com/users/dependabot%5Bbot%5D/orgs", - "repos_url": "https://api.github.com/users/dependabot%5Bbot%5D/repos", - "events_url": "https://api.github.com/users/dependabot%5Bbot%5D/events{/privacy}", - "received_events_url": "https://api.github.com/users/dependabot%5Bbot%5D/received_events", - "type": "Bot", - "site_admin": false - }, - "committer": { - "login": "web-flow", - "id": 19864447, - "node_id": "MDQ6VXNlcjE5ODY0NDQ3", - "avatar_url": "https://avatars.githubusercontent.com/u/19864447?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/web-flow", - "html_url": "https://github.com/web-flow", - "followers_url": "https://api.github.com/users/web-flow/followers", - "following_url": "https://api.github.com/users/web-flow/following{/other_user}", - "gists_url": "https://api.github.com/users/web-flow/gists{/gist_id}", - "starred_url": "https://api.github.com/users/web-flow/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/web-flow/subscriptions", - "organizations_url": "https://api.github.com/users/web-flow/orgs", - "repos_url": "https://api.github.com/users/web-flow/repos", - "events_url": "https://api.github.com/users/web-flow/events{/privacy}", - "received_events_url": "https://api.github.com/users/web-flow/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "b0b7614daf4007262562c152b456981707c99d4a", - "url": "https://api.github.com/repos/jqlang/jq/commits/b0b7614daf4007262562c152b456981707c99d4a", - "html_url": "https://github.com/jqlang/jq/commit/b0b7614daf4007262562c152b456981707c99d4a" - } - ] - }, - { - "sha": "b0b7614daf4007262562c152b456981707c99d4a", - "node_id": "C_kwDOAE3WVdoAKGIwYjc2MTRkYWY0MDA3MjYyNTYyYzE1MmI0NTY5ODE3MDdjOTlkNGE", - "commit": { - "author": { - "name": "dependabot[bot]", - "email": "49699333+dependabot[bot]@users.noreply.github.com", - "date": "2023-09-18T09:19:51Z" - }, - "committer": { - "name": "GitHub", - "email": "noreply@github.com", - "date": "2023-09-18T09:19:51Z" - }, - "message": "Bump actions/checkout from 1 to 4 (#2902)\n\nBumps [actions/checkout](https://github.com/actions/checkout) from 1 to 4.\r\n- [Release notes](https://github.com/actions/checkout/releases)\r\n- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)\r\n- [Commits](https://github.com/actions/checkout/compare/v1...v4)\r\n\r\n---\r\nupdated-dependencies:\r\n- dependency-name: actions/checkout\r\n dependency-type: direct:production\r\n update-type: version-update:semver-major\r\n...\r\n\r\nSigned-off-by: dependabot[bot] \r\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>", - "tree": { - "sha": "0fe6688bc0e8d1922bd8456d5719616976a81db3", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/0fe6688bc0e8d1922bd8456d5719616976a81db3" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/b0b7614daf4007262562c152b456981707c99d4a", - "comment_count": 0, - "verification": { - "verified": true, - "reason": "valid", - "signature": "-----BEGIN PGP SIGNATURE-----\n\nwsBcBAABCAAQBQJlCBY3CRBK7hj4Ov3rIwAAxxYIACPnrC4pFboUzCn4SXSQEsam\n3CP9thhIlIc/stSW0hgFoAwAEO6rbQuedCwFzE7R5qphL0zih+JkqBttm9Eu9pF7\n2+mv3KhRM0XqZIv1QZAkc7JjLwUQ61UCX4wIy7hQf325PbqphEn2yXBNi+Uxs4bt\njZu5xNJOmzQKPR9P9HEJ8T0U8N61VyFCji+WP/HHbAhE4sxwCDPojeLJBTDQgIbh\n7RJnEsvB4u3hNsgV17RfTl3E5ziuhG+fPJ1WCfRbtMpDsTqRoeXG3ZdijDy1lCDD\ntRZfKAf1bzDfcHkL7/v/zGru4QUkGiK5fJUJ17uuB8AL3WLdlLOQjT6Xdkbo+CI=\n=KQJ5\n-----END PGP SIGNATURE-----\n", - "payload": "tree 0fe6688bc0e8d1922bd8456d5719616976a81db3\nparent d3a356fa1c366a4f80f4abd7434d3bfa746723e7\nauthor dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> 1695028791 +0900\ncommitter GitHub 1695028791 +0900\n\nBump actions/checkout from 1 to 4 (#2902)\n\nBumps [actions/checkout](https://github.com/actions/checkout) from 1 to 4.\r\n- [Release notes](https://github.com/actions/checkout/releases)\r\n- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)\r\n- [Commits](https://github.com/actions/checkout/compare/v1...v4)\r\n\r\n---\r\nupdated-dependencies:\r\n- dependency-name: actions/checkout\r\n dependency-type: direct:production\r\n update-type: version-update:semver-major\r\n...\r\n\r\nSigned-off-by: dependabot[bot] \r\nCo-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>" - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/b0b7614daf4007262562c152b456981707c99d4a", - "html_url": "https://github.com/jqlang/jq/commit/b0b7614daf4007262562c152b456981707c99d4a", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/b0b7614daf4007262562c152b456981707c99d4a/comments", - "author": { - "login": "dependabot[bot]", - "id": 49699333, - "node_id": "MDM6Qm90NDk2OTkzMzM=", - "avatar_url": "https://avatars.githubusercontent.com/in/29110?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/dependabot%5Bbot%5D", - "html_url": "https://github.com/apps/dependabot", - "followers_url": "https://api.github.com/users/dependabot%5Bbot%5D/followers", - "following_url": "https://api.github.com/users/dependabot%5Bbot%5D/following{/other_user}", - "gists_url": "https://api.github.com/users/dependabot%5Bbot%5D/gists{/gist_id}", - "starred_url": "https://api.github.com/users/dependabot%5Bbot%5D/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/dependabot%5Bbot%5D/subscriptions", - "organizations_url": "https://api.github.com/users/dependabot%5Bbot%5D/orgs", - "repos_url": "https://api.github.com/users/dependabot%5Bbot%5D/repos", - "events_url": "https://api.github.com/users/dependabot%5Bbot%5D/events{/privacy}", - "received_events_url": "https://api.github.com/users/dependabot%5Bbot%5D/received_events", - "type": "Bot", - "site_admin": false - }, - "committer": { - "login": "web-flow", - "id": 19864447, - "node_id": "MDQ6VXNlcjE5ODY0NDQ3", - "avatar_url": "https://avatars.githubusercontent.com/u/19864447?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/web-flow", - "html_url": "https://github.com/web-flow", - "followers_url": "https://api.github.com/users/web-flow/followers", - "following_url": "https://api.github.com/users/web-flow/following{/other_user}", - "gists_url": "https://api.github.com/users/web-flow/gists{/gist_id}", - "starred_url": "https://api.github.com/users/web-flow/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/web-flow/subscriptions", - "organizations_url": "https://api.github.com/users/web-flow/orgs", - "repos_url": "https://api.github.com/users/web-flow/repos", - "events_url": "https://api.github.com/users/web-flow/events{/privacy}", - "received_events_url": "https://api.github.com/users/web-flow/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "d3a356fa1c366a4f80f4abd7434d3bfa746723e7", - "url": "https://api.github.com/repos/jqlang/jq/commits/d3a356fa1c366a4f80f4abd7434d3bfa746723e7", - "html_url": "https://github.com/jqlang/jq/commit/d3a356fa1c366a4f80f4abd7434d3bfa746723e7" - } - ] - }, - { - "sha": "d3a356fa1c366a4f80f4abd7434d3bfa746723e7", - "node_id": "C_kwDOAE3WVdoAKGQzYTM1NmZhMWMzNjZhNGY4MGY0YWJkNzQzNGQzYmZhNzQ2NzIzZTc", - "commit": { - "author": { - "name": "Kamontat Chantrachirathumrong", - "email": "14089557+kamontat@users.noreply.github.com", - "date": "2023-09-17T11:55:56Z" - }, - "committer": { - "name": "GitHub", - "email": "noreply@github.com", - "date": "2023-09-17T11:55:56Z" - }, - "message": "Fix checksum file spacing for shasum command (#2899)", - "tree": { - "sha": "0f85772c0fa0bc906262ec42cc82933b8fd8bba9", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/0f85772c0fa0bc906262ec42cc82933b8fd8bba9" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/d3a356fa1c366a4f80f4abd7434d3bfa746723e7", - "comment_count": 0, - "verification": { - "verified": true, - "reason": "valid", - "signature": "-----BEGIN PGP SIGNATURE-----\n\nwsBcBAABCAAQBQJlBulMCRBK7hj4Ov3rIwAAFEsIAJWWYhXdgoE5y0npp5ks2tjg\nvFX8aHrtYkmNqw0TYRFXmNC5srfMLXSdT6g9EYnFHDRkRZXOjUm/owgzxP/d6U+0\nZUOAlkrhUkPYSgqNM3kxuiMVlefvV4T90lB6cGGnZj1rYmN/8KPVOaRM5EDkPNsd\nhcZyTCvq7g/HjgmYr8Finy7y1f50qbqRGhQOcDPmJ5qmFdC1AFsBuOQYo38BuPkC\n/91p+ZlfwmmBL+qLoyYHxSHQ4g80kavbyc5GDSnqWOsNS3M8SXIC6V/NmfHpmiZg\nTwDTL2DdTkfMzPRzng1nybE1kkzwD3OxTVpPYjxNHZ3ZZdzQ9cTVxGG8PHHZ5Fk=\n=mX6J\n-----END PGP SIGNATURE-----\n", - "payload": "tree 0f85772c0fa0bc906262ec42cc82933b8fd8bba9\nparent 24e6e6ea3989ccd1b83be9e61f2666d016bac330\nauthor Kamontat Chantrachirathumrong <14089557+kamontat@users.noreply.github.com> 1694951756 +0700\ncommitter GitHub 1694951756 +0900\n\nFix checksum file spacing for shasum command (#2899)\n\n" - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/d3a356fa1c366a4f80f4abd7434d3bfa746723e7", - "html_url": "https://github.com/jqlang/jq/commit/d3a356fa1c366a4f80f4abd7434d3bfa746723e7", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/d3a356fa1c366a4f80f4abd7434d3bfa746723e7/comments", - "author": { - "login": "kamontat", - "id": 14089557, - "node_id": "MDQ6VXNlcjE0MDg5NTU3", - "avatar_url": "https://avatars.githubusercontent.com/u/14089557?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/kamontat", - "html_url": "https://github.com/kamontat", - "followers_url": "https://api.github.com/users/kamontat/followers", - "following_url": "https://api.github.com/users/kamontat/following{/other_user}", - "gists_url": "https://api.github.com/users/kamontat/gists{/gist_id}", - "starred_url": "https://api.github.com/users/kamontat/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/kamontat/subscriptions", - "organizations_url": "https://api.github.com/users/kamontat/orgs", - "repos_url": "https://api.github.com/users/kamontat/repos", - "events_url": "https://api.github.com/users/kamontat/events{/privacy}", - "received_events_url": "https://api.github.com/users/kamontat/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "web-flow", - "id": 19864447, - "node_id": "MDQ6VXNlcjE5ODY0NDQ3", - "avatar_url": "https://avatars.githubusercontent.com/u/19864447?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/web-flow", - "html_url": "https://github.com/web-flow", - "followers_url": "https://api.github.com/users/web-flow/followers", - "following_url": "https://api.github.com/users/web-flow/following{/other_user}", - "gists_url": "https://api.github.com/users/web-flow/gists{/gist_id}", - "starred_url": "https://api.github.com/users/web-flow/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/web-flow/subscriptions", - "organizations_url": "https://api.github.com/users/web-flow/orgs", - "repos_url": "https://api.github.com/users/web-flow/repos", - "events_url": "https://api.github.com/users/web-flow/events{/privacy}", - "received_events_url": "https://api.github.com/users/web-flow/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "24e6e6ea3989ccd1b83be9e61f2666d016bac330", - "url": "https://api.github.com/repos/jqlang/jq/commits/24e6e6ea3989ccd1b83be9e61f2666d016bac330", - "html_url": "https://github.com/jqlang/jq/commit/24e6e6ea3989ccd1b83be9e61f2666d016bac330" - } - ] - }, - { - "sha": "24e6e6ea3989ccd1b83be9e61f2666d016bac330", - "node_id": "C_kwDOAE3WVdoAKDI0ZTZlNmVhMzk4OWNjZDFiODNiZTllNjFmMjY2NmQwMTZiYWMzMzA", - "commit": { - "author": { - "name": "dependabot[bot]", - "email": "49699333+dependabot[bot]@users.noreply.github.com", - "date": "2023-09-15T11:09:41Z" - }, - "committer": { - "name": "Emanuele Torre", - "email": "torreemanuele6@gmail.com", - "date": "2023-09-15T11:44:46Z" - }, - "message": "Bump actions/upload-artifact from 2 to 3\n\nBumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 2 to 3.\n- [Release notes](https://github.com/actions/upload-artifact/releases)\n- [Commits](https://github.com/actions/upload-artifact/compare/v2...v3)\n\n---\nupdated-dependencies:\n- dependency-name: actions/upload-artifact\n dependency-type: direct:production\n update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] ", - "tree": { - "sha": "11c811023a387cfea4c857eabc26f0118517afe0", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/11c811023a387cfea4c857eabc26f0118517afe0" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/24e6e6ea3989ccd1b83be9e61f2666d016bac330", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/24e6e6ea3989ccd1b83be9e61f2666d016bac330", - "html_url": "https://github.com/jqlang/jq/commit/24e6e6ea3989ccd1b83be9e61f2666d016bac330", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/24e6e6ea3989ccd1b83be9e61f2666d016bac330/comments", - "author": { - "login": "dependabot[bot]", - "id": 49699333, - "node_id": "MDM6Qm90NDk2OTkzMzM=", - "avatar_url": "https://avatars.githubusercontent.com/in/29110?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/dependabot%5Bbot%5D", - "html_url": "https://github.com/apps/dependabot", - "followers_url": "https://api.github.com/users/dependabot%5Bbot%5D/followers", - "following_url": "https://api.github.com/users/dependabot%5Bbot%5D/following{/other_user}", - "gists_url": "https://api.github.com/users/dependabot%5Bbot%5D/gists{/gist_id}", - "starred_url": "https://api.github.com/users/dependabot%5Bbot%5D/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/dependabot%5Bbot%5D/subscriptions", - "organizations_url": "https://api.github.com/users/dependabot%5Bbot%5D/orgs", - "repos_url": "https://api.github.com/users/dependabot%5Bbot%5D/repos", - "events_url": "https://api.github.com/users/dependabot%5Bbot%5D/events{/privacy}", - "received_events_url": "https://api.github.com/users/dependabot%5Bbot%5D/received_events", - "type": "Bot", - "site_admin": false - }, - "committer": { - "login": "emanuele6", - "id": 20175435, - "node_id": "MDQ6VXNlcjIwMTc1NDM1", - "avatar_url": "https://avatars.githubusercontent.com/u/20175435?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/emanuele6", - "html_url": "https://github.com/emanuele6", - "followers_url": "https://api.github.com/users/emanuele6/followers", - "following_url": "https://api.github.com/users/emanuele6/following{/other_user}", - "gists_url": "https://api.github.com/users/emanuele6/gists{/gist_id}", - "starred_url": "https://api.github.com/users/emanuele6/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/emanuele6/subscriptions", - "organizations_url": "https://api.github.com/users/emanuele6/orgs", - "repos_url": "https://api.github.com/users/emanuele6/repos", - "events_url": "https://api.github.com/users/emanuele6/events{/privacy}", - "received_events_url": "https://api.github.com/users/emanuele6/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "fb493df0188e62b358e03184134f88e80b1ee339", - "url": "https://api.github.com/repos/jqlang/jq/commits/fb493df0188e62b358e03184134f88e80b1ee339", - "html_url": "https://github.com/jqlang/jq/commit/fb493df0188e62b358e03184134f88e80b1ee339" - } - ] - }, - { - "sha": "fb493df0188e62b358e03184134f88e80b1ee339", - "node_id": "C_kwDOAE3WVdoAKGZiNDkzZGYwMTg4ZTYyYjM1OGUwMzE4NDEzNGY4OGU4MGIxZWUzMzk", - "commit": { - "author": { - "name": "dependabot[bot]", - "email": "49699333+dependabot[bot]@users.noreply.github.com", - "date": "2023-09-15T11:09:37Z" - }, - "committer": { - "name": "Emanuele Torre", - "email": "torreemanuele6@gmail.com", - "date": "2023-09-15T11:43:44Z" - }, - "message": "Bump crazy-max/ghaction-import-gpg from 5 to 6\n\nBumps [crazy-max/ghaction-import-gpg](https://github.com/crazy-max/ghaction-import-gpg) from 5 to 6.\n- [Release notes](https://github.com/crazy-max/ghaction-import-gpg/releases)\n- [Commits](https://github.com/crazy-max/ghaction-import-gpg/compare/v5...v6)\n\n---\nupdated-dependencies:\n- dependency-name: crazy-max/ghaction-import-gpg\n dependency-type: direct:production\n update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] ", - "tree": { - "sha": "85546d66d8ae54196ce0fa96004350a9536b41ea", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/85546d66d8ae54196ce0fa96004350a9536b41ea" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/fb493df0188e62b358e03184134f88e80b1ee339", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/fb493df0188e62b358e03184134f88e80b1ee339", - "html_url": "https://github.com/jqlang/jq/commit/fb493df0188e62b358e03184134f88e80b1ee339", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/fb493df0188e62b358e03184134f88e80b1ee339/comments", - "author": { - "login": "dependabot[bot]", - "id": 49699333, - "node_id": "MDM6Qm90NDk2OTkzMzM=", - "avatar_url": "https://avatars.githubusercontent.com/in/29110?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/dependabot%5Bbot%5D", - "html_url": "https://github.com/apps/dependabot", - "followers_url": "https://api.github.com/users/dependabot%5Bbot%5D/followers", - "following_url": "https://api.github.com/users/dependabot%5Bbot%5D/following{/other_user}", - "gists_url": "https://api.github.com/users/dependabot%5Bbot%5D/gists{/gist_id}", - "starred_url": "https://api.github.com/users/dependabot%5Bbot%5D/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/dependabot%5Bbot%5D/subscriptions", - "organizations_url": "https://api.github.com/users/dependabot%5Bbot%5D/orgs", - "repos_url": "https://api.github.com/users/dependabot%5Bbot%5D/repos", - "events_url": "https://api.github.com/users/dependabot%5Bbot%5D/events{/privacy}", - "received_events_url": "https://api.github.com/users/dependabot%5Bbot%5D/received_events", - "type": "Bot", - "site_admin": false - }, - "committer": { - "login": "emanuele6", - "id": 20175435, - "node_id": "MDQ6VXNlcjIwMTc1NDM1", - "avatar_url": "https://avatars.githubusercontent.com/u/20175435?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/emanuele6", - "html_url": "https://github.com/emanuele6", - "followers_url": "https://api.github.com/users/emanuele6/followers", - "following_url": "https://api.github.com/users/emanuele6/following{/other_user}", - "gists_url": "https://api.github.com/users/emanuele6/gists{/gist_id}", - "starred_url": "https://api.github.com/users/emanuele6/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/emanuele6/subscriptions", - "organizations_url": "https://api.github.com/users/emanuele6/orgs", - "repos_url": "https://api.github.com/users/emanuele6/repos", - "events_url": "https://api.github.com/users/emanuele6/events{/privacy}", - "received_events_url": "https://api.github.com/users/emanuele6/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "f3a46a62decf1f8a4d91adaeb9b133f2e4365339", - "url": "https://api.github.com/repos/jqlang/jq/commits/f3a46a62decf1f8a4d91adaeb9b133f2e4365339", - "html_url": "https://github.com/jqlang/jq/commit/f3a46a62decf1f8a4d91adaeb9b133f2e4365339" - } - ] - }, - { - "sha": "f3a46a62decf1f8a4d91adaeb9b133f2e4365339", - "node_id": "C_kwDOAE3WVdoAKGYzYTQ2YTYyZGVjZjFmOGE0ZDkxYWRhZWI5YjEzM2YyZTQzNjUzMzk", - "commit": { - "author": { - "name": "dependabot[bot]", - "email": "49699333+dependabot[bot]@users.noreply.github.com", - "date": "2023-09-15T11:09:35Z" - }, - "committer": { - "name": "Emanuele Torre", - "email": "torreemanuele6@gmail.com", - "date": "2023-09-15T11:42:32Z" - }, - "message": "Bump docker/metadata-action from 4 to 5\n\nBumps [docker/metadata-action](https://github.com/docker/metadata-action) from 4 to 5.\n- [Release notes](https://github.com/docker/metadata-action/releases)\n- [Upgrade guide](https://github.com/docker/metadata-action/blob/master/UPGRADE.md)\n- [Commits](https://github.com/docker/metadata-action/compare/v4...v5)\n\n---\nupdated-dependencies:\n- dependency-name: docker/metadata-action\n dependency-type: direct:production\n update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] ", - "tree": { - "sha": "1b03714cf844e82f6baff3b32736b2da59ce6dfd", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/1b03714cf844e82f6baff3b32736b2da59ce6dfd" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/f3a46a62decf1f8a4d91adaeb9b133f2e4365339", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/f3a46a62decf1f8a4d91adaeb9b133f2e4365339", - "html_url": "https://github.com/jqlang/jq/commit/f3a46a62decf1f8a4d91adaeb9b133f2e4365339", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/f3a46a62decf1f8a4d91adaeb9b133f2e4365339/comments", - "author": { - "login": "dependabot[bot]", - "id": 49699333, - "node_id": "MDM6Qm90NDk2OTkzMzM=", - "avatar_url": "https://avatars.githubusercontent.com/in/29110?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/dependabot%5Bbot%5D", - "html_url": "https://github.com/apps/dependabot", - "followers_url": "https://api.github.com/users/dependabot%5Bbot%5D/followers", - "following_url": "https://api.github.com/users/dependabot%5Bbot%5D/following{/other_user}", - "gists_url": "https://api.github.com/users/dependabot%5Bbot%5D/gists{/gist_id}", - "starred_url": "https://api.github.com/users/dependabot%5Bbot%5D/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/dependabot%5Bbot%5D/subscriptions", - "organizations_url": "https://api.github.com/users/dependabot%5Bbot%5D/orgs", - "repos_url": "https://api.github.com/users/dependabot%5Bbot%5D/repos", - "events_url": "https://api.github.com/users/dependabot%5Bbot%5D/events{/privacy}", - "received_events_url": "https://api.github.com/users/dependabot%5Bbot%5D/received_events", - "type": "Bot", - "site_admin": false - }, - "committer": { - "login": "emanuele6", - "id": 20175435, - "node_id": "MDQ6VXNlcjIwMTc1NDM1", - "avatar_url": "https://avatars.githubusercontent.com/u/20175435?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/emanuele6", - "html_url": "https://github.com/emanuele6", - "followers_url": "https://api.github.com/users/emanuele6/followers", - "following_url": "https://api.github.com/users/emanuele6/following{/other_user}", - "gists_url": "https://api.github.com/users/emanuele6/gists{/gist_id}", - "starred_url": "https://api.github.com/users/emanuele6/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/emanuele6/subscriptions", - "organizations_url": "https://api.github.com/users/emanuele6/orgs", - "repos_url": "https://api.github.com/users/emanuele6/repos", - "events_url": "https://api.github.com/users/emanuele6/events{/privacy}", - "received_events_url": "https://api.github.com/users/emanuele6/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "e69398ea0fa7f0150c392556cc999fa8273a83dc", - "url": "https://api.github.com/repos/jqlang/jq/commits/e69398ea0fa7f0150c392556cc999fa8273a83dc", - "html_url": "https://github.com/jqlang/jq/commit/e69398ea0fa7f0150c392556cc999fa8273a83dc" - } - ] - }, - { - "sha": "e69398ea0fa7f0150c392556cc999fa8273a83dc", - "node_id": "C_kwDOAE3WVdoAKGU2OTM5OGVhMGZhN2YwMTUwYzM5MjU1NmNjOTk5ZmE4MjczYTgzZGM", - "commit": { - "author": { - "name": "dependabot[bot]", - "email": "49699333+dependabot[bot]@users.noreply.github.com", - "date": "2023-09-15T11:09:30Z" - }, - "committer": { - "name": "Emanuele Torre", - "email": "torreemanuele6@gmail.com", - "date": "2023-09-15T11:41:27Z" - }, - "message": "Bump docker/build-push-action from 4 to 5\n\nBumps [docker/build-push-action](https://github.com/docker/build-push-action) from 4 to 5.\n- [Release notes](https://github.com/docker/build-push-action/releases)\n- [Commits](https://github.com/docker/build-push-action/compare/v4...v5)\n\n---\nupdated-dependencies:\n- dependency-name: docker/build-push-action\n dependency-type: direct:production\n update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] ", - "tree": { - "sha": "778a4b184c9b205f3568789963a3a4752e9f5ec2", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/778a4b184c9b205f3568789963a3a4752e9f5ec2" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/e69398ea0fa7f0150c392556cc999fa8273a83dc", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/e69398ea0fa7f0150c392556cc999fa8273a83dc", - "html_url": "https://github.com/jqlang/jq/commit/e69398ea0fa7f0150c392556cc999fa8273a83dc", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/e69398ea0fa7f0150c392556cc999fa8273a83dc/comments", - "author": { - "login": "dependabot[bot]", - "id": 49699333, - "node_id": "MDM6Qm90NDk2OTkzMzM=", - "avatar_url": "https://avatars.githubusercontent.com/in/29110?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/dependabot%5Bbot%5D", - "html_url": "https://github.com/apps/dependabot", - "followers_url": "https://api.github.com/users/dependabot%5Bbot%5D/followers", - "following_url": "https://api.github.com/users/dependabot%5Bbot%5D/following{/other_user}", - "gists_url": "https://api.github.com/users/dependabot%5Bbot%5D/gists{/gist_id}", - "starred_url": "https://api.github.com/users/dependabot%5Bbot%5D/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/dependabot%5Bbot%5D/subscriptions", - "organizations_url": "https://api.github.com/users/dependabot%5Bbot%5D/orgs", - "repos_url": "https://api.github.com/users/dependabot%5Bbot%5D/repos", - "events_url": "https://api.github.com/users/dependabot%5Bbot%5D/events{/privacy}", - "received_events_url": "https://api.github.com/users/dependabot%5Bbot%5D/received_events", - "type": "Bot", - "site_admin": false - }, - "committer": { - "login": "emanuele6", - "id": 20175435, - "node_id": "MDQ6VXNlcjIwMTc1NDM1", - "avatar_url": "https://avatars.githubusercontent.com/u/20175435?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/emanuele6", - "html_url": "https://github.com/emanuele6", - "followers_url": "https://api.github.com/users/emanuele6/followers", - "following_url": "https://api.github.com/users/emanuele6/following{/other_user}", - "gists_url": "https://api.github.com/users/emanuele6/gists{/gist_id}", - "starred_url": "https://api.github.com/users/emanuele6/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/emanuele6/subscriptions", - "organizations_url": "https://api.github.com/users/emanuele6/orgs", - "repos_url": "https://api.github.com/users/emanuele6/repos", - "events_url": "https://api.github.com/users/emanuele6/events{/privacy}", - "received_events_url": "https://api.github.com/users/emanuele6/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "dfd930f81a4a0a1ed3e287eb914779a41f3d2746", - "url": "https://api.github.com/repos/jqlang/jq/commits/dfd930f81a4a0a1ed3e287eb914779a41f3d2746", - "html_url": "https://github.com/jqlang/jq/commit/dfd930f81a4a0a1ed3e287eb914779a41f3d2746" - } - ] - }, - { - "sha": "dfd930f81a4a0a1ed3e287eb914779a41f3d2746", - "node_id": "C_kwDOAE3WVdoAKGRmZDkzMGY4MWE0YTBhMWVkM2UyODdlYjkxNDc3OWE0MWYzZDI3NDY", - "commit": { - "author": { - "name": "dependabot[bot]", - "email": "49699333+dependabot[bot]@users.noreply.github.com", - "date": "2023-09-15T11:09:33Z" - }, - "committer": { - "name": "Emanuele Torre", - "email": "torreemanuele6@gmail.com", - "date": "2023-09-15T11:40:33Z" - }, - "message": "Bump docker/login-action from 2 to 3\n\nBumps [docker/login-action](https://github.com/docker/login-action) from 2 to 3.\n- [Release notes](https://github.com/docker/login-action/releases)\n- [Commits](https://github.com/docker/login-action/compare/v2...v3)\n\n---\nupdated-dependencies:\n- dependency-name: docker/login-action\n dependency-type: direct:production\n update-type: version-update:semver-major\n...\n\nSigned-off-by: dependabot[bot] ", - "tree": { - "sha": "1f08564ca5c009d8d3c3df6911ea25a53a2d06b8", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/1f08564ca5c009d8d3c3df6911ea25a53a2d06b8" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/dfd930f81a4a0a1ed3e287eb914779a41f3d2746", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/dfd930f81a4a0a1ed3e287eb914779a41f3d2746", - "html_url": "https://github.com/jqlang/jq/commit/dfd930f81a4a0a1ed3e287eb914779a41f3d2746", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/dfd930f81a4a0a1ed3e287eb914779a41f3d2746/comments", - "author": { - "login": "dependabot[bot]", - "id": 49699333, - "node_id": "MDM6Qm90NDk2OTkzMzM=", - "avatar_url": "https://avatars.githubusercontent.com/in/29110?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/dependabot%5Bbot%5D", - "html_url": "https://github.com/apps/dependabot", - "followers_url": "https://api.github.com/users/dependabot%5Bbot%5D/followers", - "following_url": "https://api.github.com/users/dependabot%5Bbot%5D/following{/other_user}", - "gists_url": "https://api.github.com/users/dependabot%5Bbot%5D/gists{/gist_id}", - "starred_url": "https://api.github.com/users/dependabot%5Bbot%5D/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/dependabot%5Bbot%5D/subscriptions", - "organizations_url": "https://api.github.com/users/dependabot%5Bbot%5D/orgs", - "repos_url": "https://api.github.com/users/dependabot%5Bbot%5D/repos", - "events_url": "https://api.github.com/users/dependabot%5Bbot%5D/events{/privacy}", - "received_events_url": "https://api.github.com/users/dependabot%5Bbot%5D/received_events", - "type": "Bot", - "site_admin": false - }, - "committer": { - "login": "emanuele6", - "id": 20175435, - "node_id": "MDQ6VXNlcjIwMTc1NDM1", - "avatar_url": "https://avatars.githubusercontent.com/u/20175435?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/emanuele6", - "html_url": "https://github.com/emanuele6", - "followers_url": "https://api.github.com/users/emanuele6/followers", - "following_url": "https://api.github.com/users/emanuele6/following{/other_user}", - "gists_url": "https://api.github.com/users/emanuele6/gists{/gist_id}", - "starred_url": "https://api.github.com/users/emanuele6/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/emanuele6/subscriptions", - "organizations_url": "https://api.github.com/users/emanuele6/orgs", - "repos_url": "https://api.github.com/users/emanuele6/repos", - "events_url": "https://api.github.com/users/emanuele6/events{/privacy}", - "received_events_url": "https://api.github.com/users/emanuele6/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "4c6f6dc2315103e4d4d81803744495ba396717a4", - "url": "https://api.github.com/repos/jqlang/jq/commits/4c6f6dc2315103e4d4d81803744495ba396717a4", - "html_url": "https://github.com/jqlang/jq/commit/4c6f6dc2315103e4d4d81803744495ba396717a4" - } - ] - }, - { - "sha": "4c6f6dc2315103e4d4d81803744495ba396717a4", - "node_id": "C_kwDOAE3WVdoAKDRjNmY2ZGMyMzE1MTAzZTRkNGQ4MTgwMzc0NDQ5NWJhMzk2NzE3YTQ", - "commit": { - "author": { - "name": "Yeikel", - "email": "email@yeikel.com", - "date": "2023-09-15T11:09:07Z" - }, - "committer": { - "name": "GitHub", - "email": "noreply@github.com", - "date": "2023-09-15T11:09:07Z" - }, - "message": "Add dependabot (#2889)", - "tree": { - "sha": "f61f4523d6b2ef6b79baf3fa9973f8a0837f0b5f", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/f61f4523d6b2ef6b79baf3fa9973f8a0837f0b5f" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/4c6f6dc2315103e4d4d81803744495ba396717a4", - "comment_count": 0, - "verification": { - "verified": true, - "reason": "valid", - "signature": "-----BEGIN PGP SIGNATURE-----\n\nwsBcBAABCAAQBQJlBDtTCRBK7hj4Ov3rIwAA8M0IAAxWG3MvzLhxrREFEes+7Cs0\nzuksRURFJxN5bmAPNjrwz6ERrY29oU1BF/qmMmV+e6UFvzrRq5wAUevPUEeto0oQ\nJoNHqPy0/w4432W37BPAM0CpQbeK0m1Wp/wIHQfid+AjEh4QEBrsUZUGLtIrnIXk\nYm7SjcN99FlrXUO/BGlrE7jXwxuOc9zdbFiru2V4cE0wJnsRTPDPsqpFFwNpkqCF\nQDAxc0zP2gP9Og3zYvFxmWJt99LMXXefIaGEX+Vmwzg8XTWYcbSgEhYi0u1g35CF\nsWN9V4auhgYjbNm9O0DQusURcWuVlJ7YwilAO7Agkp27UNhqvxeXv91nOHH+bdw=\n=wQyq\n-----END PGP SIGNATURE-----\n", - "payload": "tree f61f4523d6b2ef6b79baf3fa9973f8a0837f0b5f\nparent 5ea1a4ab3b97cd5f878af04b24abe9ec2d93088f\nauthor Yeikel 1694776147 -0400\ncommitter GitHub 1694776147 +0900\n\nAdd dependabot (#2889)\n\n" - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/4c6f6dc2315103e4d4d81803744495ba396717a4", - "html_url": "https://github.com/jqlang/jq/commit/4c6f6dc2315103e4d4d81803744495ba396717a4", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/4c6f6dc2315103e4d4d81803744495ba396717a4/comments", - "author": { - "login": "yeikel", - "id": 8935151, - "node_id": "MDQ6VXNlcjg5MzUxNTE=", - "avatar_url": "https://avatars.githubusercontent.com/u/8935151?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/yeikel", - "html_url": "https://github.com/yeikel", - "followers_url": "https://api.github.com/users/yeikel/followers", - "following_url": "https://api.github.com/users/yeikel/following{/other_user}", - "gists_url": "https://api.github.com/users/yeikel/gists{/gist_id}", - "starred_url": "https://api.github.com/users/yeikel/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/yeikel/subscriptions", - "organizations_url": "https://api.github.com/users/yeikel/orgs", - "repos_url": "https://api.github.com/users/yeikel/repos", - "events_url": "https://api.github.com/users/yeikel/events{/privacy}", - "received_events_url": "https://api.github.com/users/yeikel/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "web-flow", - "id": 19864447, - "node_id": "MDQ6VXNlcjE5ODY0NDQ3", - "avatar_url": "https://avatars.githubusercontent.com/u/19864447?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/web-flow", - "html_url": "https://github.com/web-flow", - "followers_url": "https://api.github.com/users/web-flow/followers", - "following_url": "https://api.github.com/users/web-flow/following{/other_user}", - "gists_url": "https://api.github.com/users/web-flow/gists{/gist_id}", - "starred_url": "https://api.github.com/users/web-flow/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/web-flow/subscriptions", - "organizations_url": "https://api.github.com/users/web-flow/orgs", - "repos_url": "https://api.github.com/users/web-flow/repos", - "events_url": "https://api.github.com/users/web-flow/events{/privacy}", - "received_events_url": "https://api.github.com/users/web-flow/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "5ea1a4ab3b97cd5f878af04b24abe9ec2d93088f", - "url": "https://api.github.com/repos/jqlang/jq/commits/5ea1a4ab3b97cd5f878af04b24abe9ec2d93088f", - "html_url": "https://github.com/jqlang/jq/commit/5ea1a4ab3b97cd5f878af04b24abe9ec2d93088f" - } - ] - }, - { - "sha": "5ea1a4ab3b97cd5f878af04b24abe9ec2d93088f", - "node_id": "C_kwDOAE3WVdoAKDVlYTFhNGFiM2I5N2NkNWY4NzhhZjA0YjI0YWJlOWVjMmQ5MzA4OGY", - "commit": { - "author": { - "name": "itchyny", - "email": "itchyny@cybozu.co.jp", - "date": "2023-09-15T11:08:20Z" - }, - "committer": { - "name": "GitHub", - "email": "noreply@github.com", - "date": "2023-09-15T11:08:20Z" - }, - "message": "Disable core.autocrlf on Windows to prevent submodule diffs (fix #2886) (#2888)", - "tree": { - "sha": "632b1316d386126781c997cea40d92f23029fb2b", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/632b1316d386126781c997cea40d92f23029fb2b" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/5ea1a4ab3b97cd5f878af04b24abe9ec2d93088f", - "comment_count": 0, - "verification": { - "verified": true, - "reason": "valid", - "signature": "-----BEGIN PGP SIGNATURE-----\n\nwsBcBAABCAAQBQJlBDskCRBK7hj4Ov3rIwAAldwIAFBGukbv6GbRCuB+c+bc6CMm\n3ga+oloXSStt+uhnuiNIXOz16vzsx02Rj6gxmg6HFUyaVacwb/2p2TFfWHnaeNts\n/DIgoy2mZF6WplqRHXmvfd5Ovnl5lPwGhgwSSNQ4E6zPDZ6rKpbm5cF3ks56zcgR\nFFeG0km2h01a/1DdB6x38+sx3bb9rtC0G8DkAQVav5g8Mh8Hw2b+i8remoFEEzvj\nV3/r36N19RYT3lyVmhLxP6Tvae6NmnUSq8vFK+c30s98iGVNP3RG/gqwRD/fdKNJ\nhJhBvBfyM4zD6iQ5IJdglCQUdaosvmRSuDFvLVG7qjJ6XlAwkr5PB1xo5Q50H8Y=\n=pFMp\n-----END PGP SIGNATURE-----\n", - "payload": "tree 632b1316d386126781c997cea40d92f23029fb2b\nparent 7a72f58d2e92254652162ec7ca1b3074e3a22c35\nauthor itchyny 1694776100 +0900\ncommitter GitHub 1694776100 +0900\n\nDisable core.autocrlf on Windows to prevent submodule diffs (fix #2886) (#2888)\n\n" - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/5ea1a4ab3b97cd5f878af04b24abe9ec2d93088f", - "html_url": "https://github.com/jqlang/jq/commit/5ea1a4ab3b97cd5f878af04b24abe9ec2d93088f", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/5ea1a4ab3b97cd5f878af04b24abe9ec2d93088f/comments", - "author": { - "login": "itchyny", - "id": 375258, - "node_id": "MDQ6VXNlcjM3NTI1OA==", - "avatar_url": "https://avatars.githubusercontent.com/u/375258?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/itchyny", - "html_url": "https://github.com/itchyny", - "followers_url": "https://api.github.com/users/itchyny/followers", - "following_url": "https://api.github.com/users/itchyny/following{/other_user}", - "gists_url": "https://api.github.com/users/itchyny/gists{/gist_id}", - "starred_url": "https://api.github.com/users/itchyny/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/itchyny/subscriptions", - "organizations_url": "https://api.github.com/users/itchyny/orgs", - "repos_url": "https://api.github.com/users/itchyny/repos", - "events_url": "https://api.github.com/users/itchyny/events{/privacy}", - "received_events_url": "https://api.github.com/users/itchyny/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "web-flow", - "id": 19864447, - "node_id": "MDQ6VXNlcjE5ODY0NDQ3", - "avatar_url": "https://avatars.githubusercontent.com/u/19864447?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/web-flow", - "html_url": "https://github.com/web-flow", - "followers_url": "https://api.github.com/users/web-flow/followers", - "following_url": "https://api.github.com/users/web-flow/following{/other_user}", - "gists_url": "https://api.github.com/users/web-flow/gists{/gist_id}", - "starred_url": "https://api.github.com/users/web-flow/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/web-flow/subscriptions", - "organizations_url": "https://api.github.com/users/web-flow/orgs", - "repos_url": "https://api.github.com/users/web-flow/repos", - "events_url": "https://api.github.com/users/web-flow/events{/privacy}", - "received_events_url": "https://api.github.com/users/web-flow/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "7a72f58d2e92254652162ec7ca1b3074e3a22c35", - "url": "https://api.github.com/repos/jqlang/jq/commits/7a72f58d2e92254652162ec7ca1b3074e3a22c35", - "html_url": "https://github.com/jqlang/jq/commit/7a72f58d2e92254652162ec7ca1b3074e3a22c35" - } - ] - }, - { - "sha": "7a72f58d2e92254652162ec7ca1b3074e3a22c35", - "node_id": "C_kwDOAE3WVdoAKDdhNzJmNThkMmU5MjI1NDY1MjE2MmVjN2NhMWIzMDc0ZTNhMjJjMzU", - "commit": { - "author": { - "name": "Owen Ou", - "email": "169064+owenthereal@users.noreply.github.com", - "date": "2023-09-07T18:55:14Z" - }, - "committer": { - "name": "GitHub", - "email": "noreply@github.com", - "date": "2023-09-07T18:55:14Z" - }, - "message": "Standarize arch types to AMD64 & ARM64 from index page download dropdown (#2884)\n\nStandarize arch types to AMD64 & ARM64 from index page download\r\ndropdown. These are missed from https://github.com/jqlang/jq/pull/2879.", - "tree": { - "sha": "a3a0a822ebc2e7bc598c96cac7a655c2bdee43c5", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/a3a0a822ebc2e7bc598c96cac7a655c2bdee43c5" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/7a72f58d2e92254652162ec7ca1b3074e3a22c35", - "comment_count": 0, - "verification": { - "verified": true, - "reason": "valid", - "signature": "-----BEGIN PGP SIGNATURE-----\n\nwsBcBAABCAAQBQJk+hySCRBK7hj4Ov3rIwAAhokIAA5poP2/Ez3X4Cc3aAZwP9mv\nwSLwyOb1LYyQZnapxsMSIdsbkWuwxZ2VrM1Ct9LcSvV1AkVcpBSG7t2nGxng6vDM\nmM37kPkde+8/sXyy0NnoZ+4SSu8Dc6ZmOGrNq8eL9sFR0gbbGhMFDMblV08JOgnc\nD2mat/nWIUrkhpYkjEm6yzH6MXsu7zOW2thz0fviEbPMMv227Shdz5Cbfsr9WyUz\ni2q7Xq0NesO1zWHF0RJI5PW+LpLi2vHScLKJD+loqyKhJfzwVAGe0rQuFLs4NLjK\nKzaTcZpoiXr4JnkfAEdoQL6yNZyHmbOeE2xay4x1DteUbLXZ9HssY1lhkX3dhFc=\n=Bz/U\n-----END PGP SIGNATURE-----\n", - "payload": "tree a3a0a822ebc2e7bc598c96cac7a655c2bdee43c5\nparent 806475da2942584370a35d75fdd7d1103c17246a\nauthor Owen Ou <169064+owenthereal@users.noreply.github.com> 1694112914 -0700\ncommitter GitHub 1694112914 -0700\n\nStandarize arch types to AMD64 & ARM64 from index page download dropdown (#2884)\n\nStandarize arch types to AMD64 & ARM64 from index page download\r\ndropdown. These are missed from https://github.com/jqlang/jq/pull/2879." - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/7a72f58d2e92254652162ec7ca1b3074e3a22c35", - "html_url": "https://github.com/jqlang/jq/commit/7a72f58d2e92254652162ec7ca1b3074e3a22c35", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/7a72f58d2e92254652162ec7ca1b3074e3a22c35/comments", - "author": { - "login": "owenthereal", - "id": 169064, - "node_id": "MDQ6VXNlcjE2OTA2NA==", - "avatar_url": "https://avatars.githubusercontent.com/u/169064?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/owenthereal", - "html_url": "https://github.com/owenthereal", - "followers_url": "https://api.github.com/users/owenthereal/followers", - "following_url": "https://api.github.com/users/owenthereal/following{/other_user}", - "gists_url": "https://api.github.com/users/owenthereal/gists{/gist_id}", - "starred_url": "https://api.github.com/users/owenthereal/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/owenthereal/subscriptions", - "organizations_url": "https://api.github.com/users/owenthereal/orgs", - "repos_url": "https://api.github.com/users/owenthereal/repos", - "events_url": "https://api.github.com/users/owenthereal/events{/privacy}", - "received_events_url": "https://api.github.com/users/owenthereal/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "web-flow", - "id": 19864447, - "node_id": "MDQ6VXNlcjE5ODY0NDQ3", - "avatar_url": "https://avatars.githubusercontent.com/u/19864447?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/web-flow", - "html_url": "https://github.com/web-flow", - "followers_url": "https://api.github.com/users/web-flow/followers", - "following_url": "https://api.github.com/users/web-flow/following{/other_user}", - "gists_url": "https://api.github.com/users/web-flow/gists{/gist_id}", - "starred_url": "https://api.github.com/users/web-flow/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/web-flow/subscriptions", - "organizations_url": "https://api.github.com/users/web-flow/orgs", - "repos_url": "https://api.github.com/users/web-flow/repos", - "events_url": "https://api.github.com/users/web-flow/events{/privacy}", - "received_events_url": "https://api.github.com/users/web-flow/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "806475da2942584370a35d75fdd7d1103c17246a", - "url": "https://api.github.com/repos/jqlang/jq/commits/806475da2942584370a35d75fdd7d1103c17246a", - "html_url": "https://github.com/jqlang/jq/commit/806475da2942584370a35d75fdd7d1103c17246a" - } - ] - }, - { - "sha": "806475da2942584370a35d75fdd7d1103c17246a", - "node_id": "C_kwDOAE3WVdoAKDgwNjQ3NWRhMjk0MjU4NDM3MGEzNWQ3NWZkZDdkMTEwM2MxNzI0NmE", - "commit": { - "author": { - "name": "Owen Ou", - "email": "169064+owenthereal@users.noreply.github.com", - "date": "2023-09-07T17:54:10Z" - }, - "committer": { - "name": "GitHub", - "email": "noreply@github.com", - "date": "2023-09-07T17:54:10Z" - }, - "message": "Update webpage with 1.7 release (#2879)\n\n* Update webpage with 1.7 release\r\n\r\nUpdate webpage with 1.7 release\r\n\r\n* Update docs/content/download/default.yml\r\n\r\nCo-authored-by: itchyny \r\n\r\n* Update docs/templates/index.html.j2\r\n\r\nCo-authored-by: itchyny \r\n\r\n* Update docs/content/download/default.yml\r\n\r\nCo-authored-by: itchyny \r\n\r\n* Don't mention 1.7rc signatures\r\n\r\n* Add link to 1.7 manual\r\n\r\n* binaries -> binary\r\n\r\n* AMD 32-bit to i386\r\n\r\n* Standarize arch types to AMD64, ARM64 & i386 in download page\r\n\r\n---------\r\n\r\nCo-authored-by: itchyny ", - "tree": { - "sha": "4f7075b74eab5eb80e7a6c28801f5eb0ec33c9f6", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/4f7075b74eab5eb80e7a6c28801f5eb0ec33c9f6" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/806475da2942584370a35d75fdd7d1103c17246a", - "comment_count": 0, - "verification": { - "verified": true, - "reason": "valid", - "signature": "-----BEGIN PGP SIGNATURE-----\n\nwsBcBAABCAAQBQJk+g5CCRBK7hj4Ov3rIwAAAdUIAA0k4QtKRolvxTNMMbnnco+P\n2pSm5/L8ED4MRZg2fpcGTu4B6bkbGQcMZwI9g18N4asiE9YzRxtORRH2aREG5joC\nscV4rSUV8m2dqKHPQglN2dsS+iqZJGM+r19UdCbnMkVPxQnGMq+LDR44c0LtWpG+\nlNdjSG9VBeIYFnUt1B3EU5czUvfLjmAgfbp4xNE4m0zXmsYnxw/3yBEPF0wxyVuW\nh9wK+42vLjW5sxSJWBKCnWN10WgJ5hiyxe//APmAUH85WMKLINgPGcFW8lI+RHm+\n4/zJNJA51or+6ME0bOyTU4HkTVs/087VcQtnhNvvuDXkY+lUVLRrn5jIwD1QY6Y=\n=Wg7u\n-----END PGP SIGNATURE-----\n", - "payload": "tree 4f7075b74eab5eb80e7a6c28801f5eb0ec33c9f6\nparent 4b579ca31f4ae3d95b757c43c742812884dea5fd\nauthor Owen Ou <169064+owenthereal@users.noreply.github.com> 1694109250 -0700\ncommitter GitHub 1694109250 -0700\n\nUpdate webpage with 1.7 release (#2879)\n\n* Update webpage with 1.7 release\r\n\r\nUpdate webpage with 1.7 release\r\n\r\n* Update docs/content/download/default.yml\r\n\r\nCo-authored-by: itchyny \r\n\r\n* Update docs/templates/index.html.j2\r\n\r\nCo-authored-by: itchyny \r\n\r\n* Update docs/content/download/default.yml\r\n\r\nCo-authored-by: itchyny \r\n\r\n* Don't mention 1.7rc signatures\r\n\r\n* Add link to 1.7 manual\r\n\r\n* binaries -> binary\r\n\r\n* AMD 32-bit to i386\r\n\r\n* Standarize arch types to AMD64, ARM64 & i386 in download page\r\n\r\n---------\r\n\r\nCo-authored-by: itchyny " - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/806475da2942584370a35d75fdd7d1103c17246a", - "html_url": "https://github.com/jqlang/jq/commit/806475da2942584370a35d75fdd7d1103c17246a", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/806475da2942584370a35d75fdd7d1103c17246a/comments", - "author": { - "login": "owenthereal", - "id": 169064, - "node_id": "MDQ6VXNlcjE2OTA2NA==", - "avatar_url": "https://avatars.githubusercontent.com/u/169064?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/owenthereal", - "html_url": "https://github.com/owenthereal", - "followers_url": "https://api.github.com/users/owenthereal/followers", - "following_url": "https://api.github.com/users/owenthereal/following{/other_user}", - "gists_url": "https://api.github.com/users/owenthereal/gists{/gist_id}", - "starred_url": "https://api.github.com/users/owenthereal/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/owenthereal/subscriptions", - "organizations_url": "https://api.github.com/users/owenthereal/orgs", - "repos_url": "https://api.github.com/users/owenthereal/repos", - "events_url": "https://api.github.com/users/owenthereal/events{/privacy}", - "received_events_url": "https://api.github.com/users/owenthereal/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "web-flow", - "id": 19864447, - "node_id": "MDQ6VXNlcjE5ODY0NDQ3", - "avatar_url": "https://avatars.githubusercontent.com/u/19864447?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/web-flow", - "html_url": "https://github.com/web-flow", - "followers_url": "https://api.github.com/users/web-flow/followers", - "following_url": "https://api.github.com/users/web-flow/following{/other_user}", - "gists_url": "https://api.github.com/users/web-flow/gists{/gist_id}", - "starred_url": "https://api.github.com/users/web-flow/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/web-flow/subscriptions", - "organizations_url": "https://api.github.com/users/web-flow/orgs", - "repos_url": "https://api.github.com/users/web-flow/repos", - "events_url": "https://api.github.com/users/web-flow/events{/privacy}", - "received_events_url": "https://api.github.com/users/web-flow/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "4b579ca31f4ae3d95b757c43c742812884dea5fd", - "url": "https://api.github.com/repos/jqlang/jq/commits/4b579ca31f4ae3d95b757c43c742812884dea5fd", - "html_url": "https://github.com/jqlang/jq/commit/4b579ca31f4ae3d95b757c43c742812884dea5fd" - } - ] - }, - { - "sha": "4b579ca31f4ae3d95b757c43c742812884dea5fd", - "node_id": "C_kwDOAE3WVdoAKDRiNTc5Y2EzMWY0YWUzZDk1Yjc1N2M0M2M3NDI4MTI4ODRkZWE1ZmQ", - "commit": { - "author": { - "name": "github-actions[bot]", - "email": "github-actions[bot]@users.noreply.github.com", - "date": "2023-09-06T22:49:08Z" - }, - "committer": { - "name": "Nico Williams", - "email": "nico@cryptonector.com", - "date": "2023-09-06T22:53:36Z" - }, - "message": "Update signatures of 1.7", - "tree": { - "sha": "55a26e2f03712a86cd2c5bc4afcb2319fcefe61d", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/55a26e2f03712a86cd2c5bc4afcb2319fcefe61d" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/4b579ca31f4ae3d95b757c43c742812884dea5fd", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/4b579ca31f4ae3d95b757c43c742812884dea5fd", - "html_url": "https://github.com/jqlang/jq/commit/4b579ca31f4ae3d95b757c43c742812884dea5fd", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/4b579ca31f4ae3d95b757c43c742812884dea5fd/comments", - "author": { - "login": "github-actions[bot]", - "id": 41898282, - "node_id": "MDM6Qm90NDE4OTgyODI=", - "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/github-actions%5Bbot%5D", - "html_url": "https://github.com/apps/github-actions", - "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers", - "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}", - "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}", - "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions", - "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs", - "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos", - "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}", - "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events", - "type": "Bot", - "site_admin": false - }, - "committer": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "11c528d04d76c9b9553781aa76b073e4f40da008", - "url": "https://api.github.com/repos/jqlang/jq/commits/11c528d04d76c9b9553781aa76b073e4f40da008", - "html_url": "https://github.com/jqlang/jq/commit/11c528d04d76c9b9553781aa76b073e4f40da008" - } - ] - }, - { - "sha": "11c528d04d76c9b9553781aa76b073e4f40da008", - "node_id": "C_kwDOAE3WVdoAKDExYzUyOGQwNGQ3NmM5Yjk1NTM3ODFhYTc2YjA3M2U0ZjQwZGEwMDg", - "commit": { - "author": { - "name": "Nicolas Williams", - "email": "nico@cryptonector.com", - "date": "2023-09-06T13:52:37Z" - }, - "committer": { - "name": "Nico Williams", - "email": "nico@cryptonector.com", - "date": "2023-09-06T19:05:10Z" - }, - "message": "Add setlocale() call (fix #1740)", - "tree": { - "sha": "3eb4d21413cf215598675b4768d6afeb1f5d91ce", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/3eb4d21413cf215598675b4768d6afeb1f5d91ce" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/11c528d04d76c9b9553781aa76b073e4f40da008", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/11c528d04d76c9b9553781aa76b073e4f40da008", - "html_url": "https://github.com/jqlang/jq/commit/11c528d04d76c9b9553781aa76b073e4f40da008", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/11c528d04d76c9b9553781aa76b073e4f40da008/comments", - "author": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "ac3b70d3a118713b24a82da15441788fee6c5d4e", - "url": "https://api.github.com/repos/jqlang/jq/commits/ac3b70d3a118713b24a82da15441788fee6c5d4e", - "html_url": "https://github.com/jqlang/jq/commit/ac3b70d3a118713b24a82da15441788fee6c5d4e" - } - ] - }, - { - "sha": "ac3b70d3a118713b24a82da15441788fee6c5d4e", - "node_id": "C_kwDOAE3WVdoAKGFjM2I3MGQzYTExODcxM2IyNGE4MmRhMTU0NDE3ODhmZWU2YzVkNGU", - "commit": { - "author": { - "name": "Nicolas Williams", - "email": "nico@cryptonector.com", - "date": "2023-09-05T23:49:55Z" - }, - "committer": { - "name": "Nico Williams", - "email": "nico@cryptonector.com", - "date": "2023-09-06T18:01:44Z" - }, - "message": "Add a thank you note to the new owners, admins, and maintainers, and to @stedolan", - "tree": { - "sha": "5468b0c72cf6fe481882737e9a1b9eb48063d375", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/5468b0c72cf6fe481882737e9a1b9eb48063d375" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/ac3b70d3a118713b24a82da15441788fee6c5d4e", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/ac3b70d3a118713b24a82da15441788fee6c5d4e", - "html_url": "https://github.com/jqlang/jq/commit/ac3b70d3a118713b24a82da15441788fee6c5d4e", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/ac3b70d3a118713b24a82da15441788fee6c5d4e/comments", - "author": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "df95871dd7415627bda6d70ce0569d0a4fbc22c6", - "url": "https://api.github.com/repos/jqlang/jq/commits/df95871dd7415627bda6d70ce0569d0a4fbc22c6", - "html_url": "https://github.com/jqlang/jq/commit/df95871dd7415627bda6d70ce0569d0a4fbc22c6" - } - ] - }, - { - "sha": "df95871dd7415627bda6d70ce0569d0a4fbc22c6", - "node_id": "C_kwDOAE3WVdoAKGRmOTU4NzFkZDc0MTU2MjdiZGE2ZDcwY2UwNTY5ZDBhNGZiYzIyYzY", - "commit": { - "author": { - "name": "Nico Williams", - "email": "nico@cryptonector.com", - "date": "2023-08-29T08:27:41Z" - }, - "committer": { - "name": "GitHub", - "email": "noreply@github.com", - "date": "2023-08-29T08:27:41Z" - }, - "message": "Fix leak on too-large programs, OSS Fuzz issue 61349\n\nA very large program can cause these leaks:\r\n\r\n ==758838== 7,820 (16 direct, 7,804 indirect) bytes in 2 blocks are definitely lost in loss record 17 of 28\r\n ==758838== at 0x4848A23: calloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)\r\n ==758838== by 0x125D30: jv_mem_calloc (jv_alloc.c:153)\r\n ==758838== by 0x162ADE: compile (compile.c:1286)\r\n ==758838== by 0x162D4B: compile (compile.c:1304)\r\n ==758838== by 0x163697: block_compile (compile.c:1381)\r\n ==758838== by 0x11B5CA: jq_compile_args (execute.c:1245)\r\n ==758838== by 0x115E20: main (main.c:691)\r\n ==758838==\r\n ==758838== 1,674,694 (103,576 direct, 1,571,118 indirect) bytes in 1,177 blocks are definitely lost in loss record 28 of 28\r\n ==758838== at 0x4843839: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)\r\n ==758838== by 0x125CD0: jv_mem_alloc (jv_alloc.c:141)\r\n ==758838== by 0x162B19: compile (compile.c:1289)\r\n ==758838== by 0x163697: block_compile (compile.c:1381)\r\n ==758838== by 0x11B5CA: jq_compile_args (execute.c:1245)\r\n ==758838== by 0x115E20: main (main.c:691)\r\n\r\nThis commit fixes that.\r\n\r\nFixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=61349", - "tree": { - "sha": "12b2e38fc441fa5776668924dd402c66b98a7f2c", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/12b2e38fc441fa5776668924dd402c66b98a7f2c" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/df95871dd7415627bda6d70ce0569d0a4fbc22c6", - "comment_count": 0, - "verification": { - "verified": true, - "reason": "valid", - "signature": "-----BEGIN PGP SIGNATURE-----\n\nwsBcBAABCAAQBQJk7av9CRBK7hj4Ov3rIwAAPh4IAJu++XhcRFUBFmklUzVAzmMg\nTRXnMmR/8n78NSNwOykFtenOFMuQDNr4zsh0WF9zX7yOHJrkn/C+ZzdjCMeTk5sZ\nN/aDrIpp2Gyhycupmrg3R+v43aEdFxI6fhpAgxjIA/WxkXECspyn9Pb720mbQ/HK\nBxg3B2Dyd5Gk9ruViQogUxKDCE4I5JcktYtS/lY7wxEFeJRvMk92MIyFQoDvlJjx\nGeQgIzxMVy413GaRB73fcQGhqBsTtcT2lG4LNJFpls7W9k3qp+TC2jFCs0EmSdpL\nZut2jML2m5b58TPSWGuAuN8KGTs8s90xO2QaXtLjweny4u7CKYLMDslJHxQi2WM=\n=vERD\n-----END PGP SIGNATURE-----\n", - "payload": "tree 12b2e38fc441fa5776668924dd402c66b98a7f2c\nparent 91d72575e43bf48e52e6bd9cac7db8b019ea3151\nauthor Nico Williams 1693297661 -0500\ncommitter GitHub 1693297661 +0200\n\nFix leak on too-large programs, OSS Fuzz issue 61349\n\nA very large program can cause these leaks:\r\n\r\n ==758838== 7,820 (16 direct, 7,804 indirect) bytes in 2 blocks are definitely lost in loss record 17 of 28\r\n ==758838== at 0x4848A23: calloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)\r\n ==758838== by 0x125D30: jv_mem_calloc (jv_alloc.c:153)\r\n ==758838== by 0x162ADE: compile (compile.c:1286)\r\n ==758838== by 0x162D4B: compile (compile.c:1304)\r\n ==758838== by 0x163697: block_compile (compile.c:1381)\r\n ==758838== by 0x11B5CA: jq_compile_args (execute.c:1245)\r\n ==758838== by 0x115E20: main (main.c:691)\r\n ==758838==\r\n ==758838== 1,674,694 (103,576 direct, 1,571,118 indirect) bytes in 1,177 blocks are definitely lost in loss record 28 of 28\r\n ==758838== at 0x4843839: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)\r\n ==758838== by 0x125CD0: jv_mem_alloc (jv_alloc.c:141)\r\n ==758838== by 0x162B19: compile (compile.c:1289)\r\n ==758838== by 0x163697: block_compile (compile.c:1381)\r\n ==758838== by 0x11B5CA: jq_compile_args (execute.c:1245)\r\n ==758838== by 0x115E20: main (main.c:691)\r\n\r\nThis commit fixes that.\r\n\r\nFixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=61349\r\n" - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/df95871dd7415627bda6d70ce0569d0a4fbc22c6", - "html_url": "https://github.com/jqlang/jq/commit/df95871dd7415627bda6d70ce0569d0a4fbc22c6", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/df95871dd7415627bda6d70ce0569d0a4fbc22c6/comments", - "author": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "web-flow", - "id": 19864447, - "node_id": "MDQ6VXNlcjE5ODY0NDQ3", - "avatar_url": "https://avatars.githubusercontent.com/u/19864447?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/web-flow", - "html_url": "https://github.com/web-flow", - "followers_url": "https://api.github.com/users/web-flow/followers", - "following_url": "https://api.github.com/users/web-flow/following{/other_user}", - "gists_url": "https://api.github.com/users/web-flow/gists{/gist_id}", - "starred_url": "https://api.github.com/users/web-flow/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/web-flow/subscriptions", - "organizations_url": "https://api.github.com/users/web-flow/orgs", - "repos_url": "https://api.github.com/users/web-flow/repos", - "events_url": "https://api.github.com/users/web-flow/events{/privacy}", - "received_events_url": "https://api.github.com/users/web-flow/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "91d72575e43bf48e52e6bd9cac7db8b019ea3151", - "url": "https://api.github.com/repos/jqlang/jq/commits/91d72575e43bf48e52e6bd9cac7db8b019ea3151", - "html_url": "https://github.com/jqlang/jq/commit/91d72575e43bf48e52e6bd9cac7db8b019ea3151" - } - ] - }, - { - "sha": "91d72575e43bf48e52e6bd9cac7db8b019ea3151", - "node_id": "C_kwDOAE3WVdoAKDkxZDcyNTc1ZTQzYmY0OGU1MmU2YmQ5Y2FjN2RiOGIwMTllYTMxNTE", - "commit": { - "author": { - "name": "github-actions[bot]", - "email": "github-actions[bot]@users.noreply.github.com", - "date": "2023-08-27T17:52:51Z" - }, - "committer": { - "name": "Nico Williams", - "email": "nico@cryptonector.com", - "date": "2023-08-27T17:53:29Z" - }, - "message": "Update signatures of 1.7rc2", - "tree": { - "sha": "a0baddb60b726d9d5045aa3603112997acd83937", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/a0baddb60b726d9d5045aa3603112997acd83937" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/91d72575e43bf48e52e6bd9cac7db8b019ea3151", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/91d72575e43bf48e52e6bd9cac7db8b019ea3151", - "html_url": "https://github.com/jqlang/jq/commit/91d72575e43bf48e52e6bd9cac7db8b019ea3151", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/91d72575e43bf48e52e6bd9cac7db8b019ea3151/comments", - "author": { - "login": "github-actions[bot]", - "id": 41898282, - "node_id": "MDM6Qm90NDE4OTgyODI=", - "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/github-actions%5Bbot%5D", - "html_url": "https://github.com/apps/github-actions", - "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers", - "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}", - "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}", - "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions", - "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs", - "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos", - "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}", - "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events", - "type": "Bot", - "site_admin": false - }, - "committer": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "0e067ef93605493060392f0999be27694146fca4", - "url": "https://api.github.com/repos/jqlang/jq/commits/0e067ef93605493060392f0999be27694146fca4", - "html_url": "https://github.com/jqlang/jq/commit/0e067ef93605493060392f0999be27694146fca4" - } - ] - }, - { - "sha": "0e067ef93605493060392f0999be27694146fca4", - "node_id": "C_kwDOAE3WVdoAKDBlMDY3ZWY5MzYwNTQ5MzA2MDM5MmYwOTk5YmUyNzY5NDE0NmZjYTQ", - "commit": { - "author": { - "name": "Nicolas Williams", - "email": "nico@cryptonector.com", - "date": "2023-08-04T05:04:57Z" - }, - "committer": { - "name": "Emanuele Torre", - "email": "torreemanuele6@gmail.com", - "date": "2023-08-27T10:32:12Z" - }, - "message": "Improve handling of non-integer numeric indices (fix #2815)", - "tree": { - "sha": "177d7d71e2e212a95b28a9596dfb01df8d07a4e6", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/177d7d71e2e212a95b28a9596dfb01df8d07a4e6" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/0e067ef93605493060392f0999be27694146fca4", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/0e067ef93605493060392f0999be27694146fca4", - "html_url": "https://github.com/jqlang/jq/commit/0e067ef93605493060392f0999be27694146fca4", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/0e067ef93605493060392f0999be27694146fca4/comments", - "author": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "emanuele6", - "id": 20175435, - "node_id": "MDQ6VXNlcjIwMTc1NDM1", - "avatar_url": "https://avatars.githubusercontent.com/u/20175435?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/emanuele6", - "html_url": "https://github.com/emanuele6", - "followers_url": "https://api.github.com/users/emanuele6/followers", - "following_url": "https://api.github.com/users/emanuele6/following{/other_user}", - "gists_url": "https://api.github.com/users/emanuele6/gists{/gist_id}", - "starred_url": "https://api.github.com/users/emanuele6/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/emanuele6/subscriptions", - "organizations_url": "https://api.github.com/users/emanuele6/orgs", - "repos_url": "https://api.github.com/users/emanuele6/repos", - "events_url": "https://api.github.com/users/emanuele6/events{/privacy}", - "received_events_url": "https://api.github.com/users/emanuele6/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "ab47880b4c6a6cda55a4c6b93f7990baef990e1e", - "url": "https://api.github.com/repos/jqlang/jq/commits/ab47880b4c6a6cda55a4c6b93f7990baef990e1e", - "html_url": "https://github.com/jqlang/jq/commit/ab47880b4c6a6cda55a4c6b93f7990baef990e1e" - } - ] - }, - { - "sha": "ab47880b4c6a6cda55a4c6b93f7990baef990e1e", - "node_id": "C_kwDOAE3WVdoAKGFiNDc4ODBiNGM2YTZjZGE1NWE0YzZiOTNmNzk5MGJhZWY5OTBlMWU", - "commit": { - "author": { - "name": "Emanuele Torre", - "email": "torreemanuele6@gmail.com", - "date": "2023-08-26T22:30:35Z" - }, - "committer": { - "name": "Nico Williams", - "email": "nico@cryptonector.com", - "date": "2023-08-27T05:37:54Z" - }, - "message": "Make jq_get_lib_dirs return an empty array if JQ_LIBRARY_PATH is not set\n\nFor the jq_state used by the jq utility, the JQ_LIBRARY_PATH attribute\nwill always be set, but, in general, it is possible that it might not\nbe.\n\nIf it is not set, jq_get_lib_dirs() will return jv_invalid().\n\nThat is not good, because some code in linker.c expects it to always\nreturns an array.\n\nThis patch makes jq_get_lib_dirs() return an empty array if\nJQ_LIBRARY_PATH is not set to prevent problems.\n\nThis issue made OSS fuzz trigger failed assertions every time it tried\nto compile a script that uses \"include\".\n\nFixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=61796", - "tree": { - "sha": "216b3383531d896ef7fd4903150ebbd838382352", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/216b3383531d896ef7fd4903150ebbd838382352" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/ab47880b4c6a6cda55a4c6b93f7990baef990e1e", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/ab47880b4c6a6cda55a4c6b93f7990baef990e1e", - "html_url": "https://github.com/jqlang/jq/commit/ab47880b4c6a6cda55a4c6b93f7990baef990e1e", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/ab47880b4c6a6cda55a4c6b93f7990baef990e1e/comments", - "author": { - "login": "emanuele6", - "id": 20175435, - "node_id": "MDQ6VXNlcjIwMTc1NDM1", - "avatar_url": "https://avatars.githubusercontent.com/u/20175435?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/emanuele6", - "html_url": "https://github.com/emanuele6", - "followers_url": "https://api.github.com/users/emanuele6/followers", - "following_url": "https://api.github.com/users/emanuele6/following{/other_user}", - "gists_url": "https://api.github.com/users/emanuele6/gists{/gist_id}", - "starred_url": "https://api.github.com/users/emanuele6/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/emanuele6/subscriptions", - "organizations_url": "https://api.github.com/users/emanuele6/orgs", - "repos_url": "https://api.github.com/users/emanuele6/repos", - "events_url": "https://api.github.com/users/emanuele6/events{/privacy}", - "received_events_url": "https://api.github.com/users/emanuele6/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "6436f1e0f8687a65471f5fec07e85f64adaa66e9", - "url": "https://api.github.com/repos/jqlang/jq/commits/6436f1e0f8687a65471f5fec07e85f64adaa66e9", - "html_url": "https://github.com/jqlang/jq/commit/6436f1e0f8687a65471f5fec07e85f64adaa66e9" - } - ] - }, - { - "sha": "6436f1e0f8687a65471f5fec07e85f64adaa66e9", - "node_id": "C_kwDOAE3WVdoAKDY0MzZmMWUwZjg2ODdhNjU0NzFmNWZlYzA3ZTg1ZjY0YWRhYTY2ZTk", - "commit": { - "author": { - "name": "Emanuele Torre", - "email": "torreemanuele6@gmail.com", - "date": "2023-08-26T21:30:47Z" - }, - "committer": { - "name": "Nico Williams", - "email": "nico@cryptonector.com", - "date": "2023-08-26T22:17:29Z" - }, - "message": "Fix memory leak in find_lib for some invalid inputs", - "tree": { - "sha": "e0a91ea0f69b93fc26d28c7c38ddf7e30a345abe", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/e0a91ea0f69b93fc26d28c7c38ddf7e30a345abe" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/6436f1e0f8687a65471f5fec07e85f64adaa66e9", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/6436f1e0f8687a65471f5fec07e85f64adaa66e9", - "html_url": "https://github.com/jqlang/jq/commit/6436f1e0f8687a65471f5fec07e85f64adaa66e9", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/6436f1e0f8687a65471f5fec07e85f64adaa66e9/comments", - "author": { - "login": "emanuele6", - "id": 20175435, - "node_id": "MDQ6VXNlcjIwMTc1NDM1", - "avatar_url": "https://avatars.githubusercontent.com/u/20175435?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/emanuele6", - "html_url": "https://github.com/emanuele6", - "followers_url": "https://api.github.com/users/emanuele6/followers", - "following_url": "https://api.github.com/users/emanuele6/following{/other_user}", - "gists_url": "https://api.github.com/users/emanuele6/gists{/gist_id}", - "starred_url": "https://api.github.com/users/emanuele6/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/emanuele6/subscriptions", - "organizations_url": "https://api.github.com/users/emanuele6/orgs", - "repos_url": "https://api.github.com/users/emanuele6/repos", - "events_url": "https://api.github.com/users/emanuele6/events{/privacy}", - "received_events_url": "https://api.github.com/users/emanuele6/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "2c3561810d846efbf55de3b2444c78a8c125fc47", - "url": "https://api.github.com/repos/jqlang/jq/commits/2c3561810d846efbf55de3b2444c78a8c125fc47", - "html_url": "https://github.com/jqlang/jq/commit/2c3561810d846efbf55de3b2444c78a8c125fc47" - } - ] - }, - { - "sha": "2c3561810d846efbf55de3b2444c78a8c125fc47", - "node_id": "C_kwDOAE3WVdoAKDJjMzU2MTgxMGQ4NDZlZmJmNTVkZTNiMjQ0NGM3OGE4YzEyNWZjNDc", - "commit": { - "author": { - "name": "Nicolas Williams", - "email": "nico@cryptonector.com", - "date": "2023-08-25T00:25:07Z" - }, - "committer": { - "name": "Nico Williams", - "email": "nico@cryptonector.com", - "date": "2023-08-25T15:13:46Z" - }, - "message": "Check nomem_handler->handler before calling it", - "tree": { - "sha": "5134c4c71be2062476fd805a74d5183110bc684f", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/5134c4c71be2062476fd805a74d5183110bc684f" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/2c3561810d846efbf55de3b2444c78a8c125fc47", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/2c3561810d846efbf55de3b2444c78a8c125fc47", - "html_url": "https://github.com/jqlang/jq/commit/2c3561810d846efbf55de3b2444c78a8c125fc47", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/2c3561810d846efbf55de3b2444c78a8c125fc47/comments", - "author": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "70807e2b1b3643019f3283b94d61998b9b35ee0e", - "url": "https://api.github.com/repos/jqlang/jq/commits/70807e2b1b3643019f3283b94d61998b9b35ee0e", - "html_url": "https://github.com/jqlang/jq/commit/70807e2b1b3643019f3283b94d61998b9b35ee0e" - } - ] - }, - { - "sha": "70807e2b1b3643019f3283b94d61998b9b35ee0e", - "node_id": "C_kwDOAE3WVdoAKDcwODA3ZTJiMWIzNjQzMDE5ZjMyODNiOTRkNjE5OThiOWIzNWVlMGU", - "commit": { - "author": { - "name": "itchyny", - "email": "itchyny@cybozu.co.jp", - "date": "2023-07-31T23:44:48Z" - }, - "committer": { - "name": "Nico Williams", - "email": "nico@cryptonector.com", - "date": "2023-08-23T20:59:19Z" - }, - "message": "Include more updates to NEWS.md and AUTHORS for 1.7", - "tree": { - "sha": "799c9dee8f2f9b6db804031fea532a9b684ca633", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/799c9dee8f2f9b6db804031fea532a9b684ca633" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/70807e2b1b3643019f3283b94d61998b9b35ee0e", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/70807e2b1b3643019f3283b94d61998b9b35ee0e", - "html_url": "https://github.com/jqlang/jq/commit/70807e2b1b3643019f3283b94d61998b9b35ee0e", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/70807e2b1b3643019f3283b94d61998b9b35ee0e/comments", - "author": { - "login": "itchyny", - "id": 375258, - "node_id": "MDQ6VXNlcjM3NTI1OA==", - "avatar_url": "https://avatars.githubusercontent.com/u/375258?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/itchyny", - "html_url": "https://github.com/itchyny", - "followers_url": "https://api.github.com/users/itchyny/followers", - "following_url": "https://api.github.com/users/itchyny/following{/other_user}", - "gists_url": "https://api.github.com/users/itchyny/gists{/gist_id}", - "starred_url": "https://api.github.com/users/itchyny/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/itchyny/subscriptions", - "organizations_url": "https://api.github.com/users/itchyny/orgs", - "repos_url": "https://api.github.com/users/itchyny/repos", - "events_url": "https://api.github.com/users/itchyny/events{/privacy}", - "received_events_url": "https://api.github.com/users/itchyny/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "080471b2a0b28f7435921789dfed25aed08eff81", - "url": "https://api.github.com/repos/jqlang/jq/commits/080471b2a0b28f7435921789dfed25aed08eff81", - "html_url": "https://github.com/jqlang/jq/commit/080471b2a0b28f7435921789dfed25aed08eff81" - } - ] - }, - { - "sha": "080471b2a0b28f7435921789dfed25aed08eff81", - "node_id": "C_kwDOAE3WVdoAKDA4MDQ3MWIyYTBiMjhmNzQzNTkyMTc4OWRmZWQyNWFlZDA4ZWZmODE", - "commit": { - "author": { - "name": "itchyny", - "email": "itchyny@cybozu.co.jp", - "date": "2023-08-21T13:49:50Z" - }, - "committer": { - "name": "Emanuele Torre", - "email": "torreemanuele6@gmail.com", - "date": "2023-08-21T14:06:58Z" - }, - "message": "Add src/config_opts.inc to .gitignore", - "tree": { - "sha": "f1900e185be0bbc76b4fe86770932d46631676c7", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/f1900e185be0bbc76b4fe86770932d46631676c7" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/080471b2a0b28f7435921789dfed25aed08eff81", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/080471b2a0b28f7435921789dfed25aed08eff81", - "html_url": "https://github.com/jqlang/jq/commit/080471b2a0b28f7435921789dfed25aed08eff81", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/080471b2a0b28f7435921789dfed25aed08eff81/comments", - "author": { - "login": "itchyny", - "id": 375258, - "node_id": "MDQ6VXNlcjM3NTI1OA==", - "avatar_url": "https://avatars.githubusercontent.com/u/375258?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/itchyny", - "html_url": "https://github.com/itchyny", - "followers_url": "https://api.github.com/users/itchyny/followers", - "following_url": "https://api.github.com/users/itchyny/following{/other_user}", - "gists_url": "https://api.github.com/users/itchyny/gists{/gist_id}", - "starred_url": "https://api.github.com/users/itchyny/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/itchyny/subscriptions", - "organizations_url": "https://api.github.com/users/itchyny/orgs", - "repos_url": "https://api.github.com/users/itchyny/repos", - "events_url": "https://api.github.com/users/itchyny/events{/privacy}", - "received_events_url": "https://api.github.com/users/itchyny/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "emanuele6", - "id": 20175435, - "node_id": "MDQ6VXNlcjIwMTc1NDM1", - "avatar_url": "https://avatars.githubusercontent.com/u/20175435?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/emanuele6", - "html_url": "https://github.com/emanuele6", - "followers_url": "https://api.github.com/users/emanuele6/followers", - "following_url": "https://api.github.com/users/emanuele6/following{/other_user}", - "gists_url": "https://api.github.com/users/emanuele6/gists{/gist_id}", - "starred_url": "https://api.github.com/users/emanuele6/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/emanuele6/subscriptions", - "organizations_url": "https://api.github.com/users/emanuele6/orgs", - "repos_url": "https://api.github.com/users/emanuele6/repos", - "events_url": "https://api.github.com/users/emanuele6/events{/privacy}", - "received_events_url": "https://api.github.com/users/emanuele6/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "583e4a27188a2db097dd043dd203b9c106bba100", - "url": "https://api.github.com/repos/jqlang/jq/commits/583e4a27188a2db097dd043dd203b9c106bba100", - "html_url": "https://github.com/jqlang/jq/commit/583e4a27188a2db097dd043dd203b9c106bba100" - } - ] - }, - { - "sha": "583e4a27188a2db097dd043dd203b9c106bba100", - "node_id": "C_kwDOAE3WVdoAKDU4M2U0YTI3MTg4YTJkYjA5N2RkMDQzZGQyMDNiOWMxMDZiYmExMDA", - "commit": { - "author": { - "name": "Nicolas Williams", - "email": "nico@cryptonector.com", - "date": "2023-08-02T20:52:53Z" - }, - "committer": { - "name": "Nico Williams", - "email": "nico@cryptonector.com", - "date": "2023-08-19T22:40:08Z" - }, - "message": "Add --config option printing ./configure options used", - "tree": { - "sha": "fba0bc0a43341b57628962036173889fc4d62606", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/fba0bc0a43341b57628962036173889fc4d62606" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/583e4a27188a2db097dd043dd203b9c106bba100", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/583e4a27188a2db097dd043dd203b9c106bba100", - "html_url": "https://github.com/jqlang/jq/commit/583e4a27188a2db097dd043dd203b9c106bba100", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/583e4a27188a2db097dd043dd203b9c106bba100/comments", - "author": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "7d643810163a944f8fec5c891b9053c12069b509", - "url": "https://api.github.com/repos/jqlang/jq/commits/7d643810163a944f8fec5c891b9053c12069b509", - "html_url": "https://github.com/jqlang/jq/commit/7d643810163a944f8fec5c891b9053c12069b509" - } - ] - }, - { - "sha": "7d643810163a944f8fec5c891b9053c12069b509", - "node_id": "C_kwDOAE3WVdoAKDdkNjQzODEwMTYzYTk0NGY4ZmVjNWM4OTFiOTA1M2MxMjA2OWI1MDk", - "commit": { - "author": { - "name": "itchyny", - "email": "itchyny@cybozu.co.jp", - "date": "2023-08-17T06:56:57Z" - }, - "committer": { - "name": "GitHub", - "email": "noreply@github.com", - "date": "2023-08-17T06:56:57Z" - }, - "message": "Fix overflow on numeric comparison (#2849)\n\nAlthough #2839 fixed the overflow of exponent subtraction,\r\nthere still is possibility of overflow in the `D2U` macro.\r\nThis patch fixes the overflow in the `D2U` macro, and also\r\ntruncates the maximum digits to `DEC_MAX_DIGITS`.", - "tree": { - "sha": "300fcc5dfef165b7f80067412059d4eb6649f80d", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/300fcc5dfef165b7f80067412059d4eb6649f80d" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/7d643810163a944f8fec5c891b9053c12069b509", - "comment_count": 0, - "verification": { - "verified": true, - "reason": "valid", - "signature": "-----BEGIN PGP SIGNATURE-----\n\nwsBcBAABCAAQBQJk3cS5CRBK7hj4Ov3rIwAAv38IAHadDZIKI2LUs/sNhW29Gele\nrd5ZdPb2l9dLtilOjY7IPs6SujvZdWckbL4nAsy0vmHb6JwOPWtEHwiJFeeN7HgW\nIkPWoQa11fzyJfvgKf6BZcA+yTGcoZlKUJZY8LBUScbNpvpNvO6feDWM6EcO1tnf\nOdPTSpe8awN7n4rhKalAgW6RVD2nuBHsk8XvQN15wkoThcy38rDuiaD1N8lupE8M\nJcHQlybjWELAvrSik47d5N0w1iegzHgd2T/nHGFH5T1PPhm896rv8KnLsU6a+cmm\nA5N+UDGFQJbBnCLIcGF3O33tJ0y1QE7CsSHMyhAKiNzCPnLPRhEQtFDnPQuqizQ=\n=HUz0\n-----END PGP SIGNATURE-----\n", - "payload": "tree 300fcc5dfef165b7f80067412059d4eb6649f80d\nparent 0733fd3d58b941ab9b8a6d623ec7fb9175f41579\nauthor itchyny 1692255417 +0900\ncommitter GitHub 1692255417 +0900\n\nFix overflow on numeric comparison (#2849)\n\nAlthough #2839 fixed the overflow of exponent subtraction,\r\nthere still is possibility of overflow in the `D2U` macro.\r\nThis patch fixes the overflow in the `D2U` macro, and also\r\ntruncates the maximum digits to `DEC_MAX_DIGITS`." - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/7d643810163a944f8fec5c891b9053c12069b509", - "html_url": "https://github.com/jqlang/jq/commit/7d643810163a944f8fec5c891b9053c12069b509", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/7d643810163a944f8fec5c891b9053c12069b509/comments", - "author": { - "login": "itchyny", - "id": 375258, - "node_id": "MDQ6VXNlcjM3NTI1OA==", - "avatar_url": "https://avatars.githubusercontent.com/u/375258?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/itchyny", - "html_url": "https://github.com/itchyny", - "followers_url": "https://api.github.com/users/itchyny/followers", - "following_url": "https://api.github.com/users/itchyny/following{/other_user}", - "gists_url": "https://api.github.com/users/itchyny/gists{/gist_id}", - "starred_url": "https://api.github.com/users/itchyny/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/itchyny/subscriptions", - "organizations_url": "https://api.github.com/users/itchyny/orgs", - "repos_url": "https://api.github.com/users/itchyny/repos", - "events_url": "https://api.github.com/users/itchyny/events{/privacy}", - "received_events_url": "https://api.github.com/users/itchyny/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "web-flow", - "id": 19864447, - "node_id": "MDQ6VXNlcjE5ODY0NDQ3", - "avatar_url": "https://avatars.githubusercontent.com/u/19864447?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/web-flow", - "html_url": "https://github.com/web-flow", - "followers_url": "https://api.github.com/users/web-flow/followers", - "following_url": "https://api.github.com/users/web-flow/following{/other_user}", - "gists_url": "https://api.github.com/users/web-flow/gists{/gist_id}", - "starred_url": "https://api.github.com/users/web-flow/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/web-flow/subscriptions", - "organizations_url": "https://api.github.com/users/web-flow/orgs", - "repos_url": "https://api.github.com/users/web-flow/repos", - "events_url": "https://api.github.com/users/web-flow/events{/privacy}", - "received_events_url": "https://api.github.com/users/web-flow/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "0733fd3d58b941ab9b8a6d623ec7fb9175f41579", - "url": "https://api.github.com/repos/jqlang/jq/commits/0733fd3d58b941ab9b8a6d623ec7fb9175f41579", - "html_url": "https://github.com/jqlang/jq/commit/0733fd3d58b941ab9b8a6d623ec7fb9175f41579" - } - ] - }, - { - "sha": "0733fd3d58b941ab9b8a6d623ec7fb9175f41579", - "node_id": "C_kwDOAE3WVdoAKDA3MzNmZDNkNThiOTQxYWI5YjhhNmQ2MjNlYzdmYjkxNzVmNDE1Nzk", - "commit": { - "author": { - "name": "itchyny", - "email": "itchyny@cybozu.co.jp", - "date": "2023-08-13T05:43:55Z" - }, - "committer": { - "name": "Nico Williams", - "email": "nico@cryptonector.com", - "date": "2023-08-16T22:49:44Z" - }, - "message": "Add a regression test for negative indices and fix a pick/1 test", - "tree": { - "sha": "d06c1831536cdb641ee9a022f20aa352a7776c29", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/d06c1831536cdb641ee9a022f20aa352a7776c29" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/0733fd3d58b941ab9b8a6d623ec7fb9175f41579", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/0733fd3d58b941ab9b8a6d623ec7fb9175f41579", - "html_url": "https://github.com/jqlang/jq/commit/0733fd3d58b941ab9b8a6d623ec7fb9175f41579", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/0733fd3d58b941ab9b8a6d623ec7fb9175f41579/comments", - "author": { - "login": "itchyny", - "id": 375258, - "node_id": "MDQ6VXNlcjM3NTI1OA==", - "avatar_url": "https://avatars.githubusercontent.com/u/375258?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/itchyny", - "html_url": "https://github.com/itchyny", - "followers_url": "https://api.github.com/users/itchyny/followers", - "following_url": "https://api.github.com/users/itchyny/following{/other_user}", - "gists_url": "https://api.github.com/users/itchyny/gists{/gist_id}", - "starred_url": "https://api.github.com/users/itchyny/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/itchyny/subscriptions", - "organizations_url": "https://api.github.com/users/itchyny/orgs", - "repos_url": "https://api.github.com/users/itchyny/repos", - "events_url": "https://api.github.com/users/itchyny/events{/privacy}", - "received_events_url": "https://api.github.com/users/itchyny/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "f85c9fcb78f89fa833f2d5a2cf26b54318e06e05", - "url": "https://api.github.com/repos/jqlang/jq/commits/f85c9fcb78f89fa833f2d5a2cf26b54318e06e05", - "html_url": "https://github.com/jqlang/jq/commit/f85c9fcb78f89fa833f2d5a2cf26b54318e06e05" - } - ] - }, - { - "sha": "f85c9fcb78f89fa833f2d5a2cf26b54318e06e05", - "node_id": "C_kwDOAE3WVdoAKGY4NWM5ZmNiNzhmODlmYTgzM2YyZDVhMmNmMjZiNTQzMThlMDZlMDU", - "commit": { - "author": { - "name": "itchyny", - "email": "itchyny@cybozu.co.jp", - "date": "2023-08-13T05:42:41Z" - }, - "committer": { - "name": "Nico Williams", - "email": "nico@cryptonector.com", - "date": "2023-08-16T22:49:44Z" - }, - "message": "Revert \"Allow .[-1] in path expressions\"\n\nThis reverts commit 086a156ec389de167edc72e8bd1752984b117349.\n\nThis commit leads to negative indexing wraps twice.", - "tree": { - "sha": "84ba4b625390f5801aa1c2b892ff3c2c2844e3ba", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/84ba4b625390f5801aa1c2b892ff3c2c2844e3ba" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/f85c9fcb78f89fa833f2d5a2cf26b54318e06e05", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/f85c9fcb78f89fa833f2d5a2cf26b54318e06e05", - "html_url": "https://github.com/jqlang/jq/commit/f85c9fcb78f89fa833f2d5a2cf26b54318e06e05", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/f85c9fcb78f89fa833f2d5a2cf26b54318e06e05/comments", - "author": { - "login": "itchyny", - "id": 375258, - "node_id": "MDQ6VXNlcjM3NTI1OA==", - "avatar_url": "https://avatars.githubusercontent.com/u/375258?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/itchyny", - "html_url": "https://github.com/itchyny", - "followers_url": "https://api.github.com/users/itchyny/followers", - "following_url": "https://api.github.com/users/itchyny/following{/other_user}", - "gists_url": "https://api.github.com/users/itchyny/gists{/gist_id}", - "starred_url": "https://api.github.com/users/itchyny/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/itchyny/subscriptions", - "organizations_url": "https://api.github.com/users/itchyny/orgs", - "repos_url": "https://api.github.com/users/itchyny/repos", - "events_url": "https://api.github.com/users/itchyny/events{/privacy}", - "received_events_url": "https://api.github.com/users/itchyny/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "4cf1408e0bbac8fc714b051fe420921905128efd", - "url": "https://api.github.com/repos/jqlang/jq/commits/4cf1408e0bbac8fc714b051fe420921905128efd", - "html_url": "https://github.com/jqlang/jq/commit/4cf1408e0bbac8fc714b051fe420921905128efd" - } - ] - }, - { - "sha": "4cf1408e0bbac8fc714b051fe420921905128efd", - "node_id": "C_kwDOAE3WVdoAKDRjZjE0MDhlMGJiYWM4ZmM3MTRiMDUxZmU0MjA5MjE5MDUxMjhlZmQ", - "commit": { - "author": { - "name": "Emanuele Torre", - "email": "torreemanuele6@gmail.com", - "date": "2023-08-13T13:39:54Z" - }, - "committer": { - "name": "GitHub", - "email": "noreply@github.com", - "date": "2023-08-13T13:39:54Z" - }, - "message": "Cast function pointers without prototype before calling them (#2842)\n\nclang complained that this is deprecated in all versions of standard C,\r\nand unsupported in C2x.", - "tree": { - "sha": "06bc1d548831c6f9f9d036c84df092a3e126db77", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/06bc1d548831c6f9f9d036c84df092a3e126db77" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/4cf1408e0bbac8fc714b051fe420921905128efd", - "comment_count": 0, - "verification": { - "verified": true, - "reason": "valid", - "signature": "-----BEGIN PGP SIGNATURE-----\n\nwsBcBAABCAAQBQJk2N0qCRBK7hj4Ov3rIwAATGQIABdk/NU6WabV0MUL72ygiOyl\ndyru72It9PuzasNkZCJH8uedB7irZOCBNiIeYnPJvivhzfkqJdcb/mLDiYpUYoI0\nE45lNj2428kvver47m3iYfDPtMBwtJazPWj2qsSkdXGSMxaP5NXORPxa5AuhOhHC\ndkArlUYtJBLGlybOrptju8Vfu2Jw+VvitTZNF49gpYIwmxsubDQrqlaCkYrzrE/0\nijvzHbWMhzr+muTICrBgyAiFDir2WDJcreJW5X2k0cWSFdj7fW175FVk/pNAqrzf\nVWaqMcY6BGSCX8HbEmCcM9+9rP52/BBw2MSp7z5/iZODojIN0MXrRg0FMW9PKYM=\n=e17S\n-----END PGP SIGNATURE-----\n", - "payload": "tree 06bc1d548831c6f9f9d036c84df092a3e126db77\nparent 3fa10e8cc197390392f5f5f6e0c9e2fcd5590530\nauthor Emanuele Torre 1691933994 +0200\ncommitter GitHub 1691933994 +0900\n\nCast function pointers without prototype before calling them (#2842)\n\nclang complained that this is deprecated in all versions of standard C,\r\nand unsupported in C2x." - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/4cf1408e0bbac8fc714b051fe420921905128efd", - "html_url": "https://github.com/jqlang/jq/commit/4cf1408e0bbac8fc714b051fe420921905128efd", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/4cf1408e0bbac8fc714b051fe420921905128efd/comments", - "author": { - "login": "emanuele6", - "id": 20175435, - "node_id": "MDQ6VXNlcjIwMTc1NDM1", - "avatar_url": "https://avatars.githubusercontent.com/u/20175435?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/emanuele6", - "html_url": "https://github.com/emanuele6", - "followers_url": "https://api.github.com/users/emanuele6/followers", - "following_url": "https://api.github.com/users/emanuele6/following{/other_user}", - "gists_url": "https://api.github.com/users/emanuele6/gists{/gist_id}", - "starred_url": "https://api.github.com/users/emanuele6/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/emanuele6/subscriptions", - "organizations_url": "https://api.github.com/users/emanuele6/orgs", - "repos_url": "https://api.github.com/users/emanuele6/repos", - "events_url": "https://api.github.com/users/emanuele6/events{/privacy}", - "received_events_url": "https://api.github.com/users/emanuele6/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "web-flow", - "id": 19864447, - "node_id": "MDQ6VXNlcjE5ODY0NDQ3", - "avatar_url": "https://avatars.githubusercontent.com/u/19864447?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/web-flow", - "html_url": "https://github.com/web-flow", - "followers_url": "https://api.github.com/users/web-flow/followers", - "following_url": "https://api.github.com/users/web-flow/following{/other_user}", - "gists_url": "https://api.github.com/users/web-flow/gists{/gist_id}", - "starred_url": "https://api.github.com/users/web-flow/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/web-flow/subscriptions", - "organizations_url": "https://api.github.com/users/web-flow/orgs", - "repos_url": "https://api.github.com/users/web-flow/repos", - "events_url": "https://api.github.com/users/web-flow/events{/privacy}", - "received_events_url": "https://api.github.com/users/web-flow/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "3fa10e8cc197390392f5f5f6e0c9e2fcd5590530", - "url": "https://api.github.com/repos/jqlang/jq/commits/3fa10e8cc197390392f5f5f6e0c9e2fcd5590530", - "html_url": "https://github.com/jqlang/jq/commit/3fa10e8cc197390392f5f5f6e0c9e2fcd5590530" - } - ] - }, - { - "sha": "3fa10e8cc197390392f5f5f6e0c9e2fcd5590530", - "node_id": "C_kwDOAE3WVdoAKDNmYTEwZThjYzE5NzM5MDM5MmY1ZjVmNmUwYzllMmZjZDU1OTA1MzA", - "commit": { - "author": { - "name": "itchyny", - "email": "itchyny@cybozu.co.jp", - "date": "2023-08-13T03:06:16Z" - }, - "committer": { - "name": "Emanuele Torre", - "email": "torreemanuele6@gmail.com", - "date": "2023-08-13T12:17:25Z" - }, - "message": "Fix crash on numeric comparison again (ref #2825)\n\nThe decNumber library subtracts the exponents of two numbers,\nwe make sure to limit the number of digits not to make it overflows.\nSince the maximum adjusted exponent is `emax` and the minimum is\n`emin - digits + 1`, we follow `emax - (emin - digits + 1) <= INT32_MAX`.", - "tree": { - "sha": "5147c50e6bda43d4d68e0f3fe5c17d7e748427da", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/5147c50e6bda43d4d68e0f3fe5c17d7e748427da" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/3fa10e8cc197390392f5f5f6e0c9e2fcd5590530", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/3fa10e8cc197390392f5f5f6e0c9e2fcd5590530", - "html_url": "https://github.com/jqlang/jq/commit/3fa10e8cc197390392f5f5f6e0c9e2fcd5590530", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/3fa10e8cc197390392f5f5f6e0c9e2fcd5590530/comments", - "author": { - "login": "itchyny", - "id": 375258, - "node_id": "MDQ6VXNlcjM3NTI1OA==", - "avatar_url": "https://avatars.githubusercontent.com/u/375258?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/itchyny", - "html_url": "https://github.com/itchyny", - "followers_url": "https://api.github.com/users/itchyny/followers", - "following_url": "https://api.github.com/users/itchyny/following{/other_user}", - "gists_url": "https://api.github.com/users/itchyny/gists{/gist_id}", - "starred_url": "https://api.github.com/users/itchyny/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/itchyny/subscriptions", - "organizations_url": "https://api.github.com/users/itchyny/orgs", - "repos_url": "https://api.github.com/users/itchyny/repos", - "events_url": "https://api.github.com/users/itchyny/events{/privacy}", - "received_events_url": "https://api.github.com/users/itchyny/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "emanuele6", - "id": 20175435, - "node_id": "MDQ6VXNlcjIwMTc1NDM1", - "avatar_url": "https://avatars.githubusercontent.com/u/20175435?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/emanuele6", - "html_url": "https://github.com/emanuele6", - "followers_url": "https://api.github.com/users/emanuele6/followers", - "following_url": "https://api.github.com/users/emanuele6/following{/other_user}", - "gists_url": "https://api.github.com/users/emanuele6/gists{/gist_id}", - "starred_url": "https://api.github.com/users/emanuele6/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/emanuele6/subscriptions", - "organizations_url": "https://api.github.com/users/emanuele6/orgs", - "repos_url": "https://api.github.com/users/emanuele6/repos", - "events_url": "https://api.github.com/users/emanuele6/events{/privacy}", - "received_events_url": "https://api.github.com/users/emanuele6/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "f86566b2631b777c0d0c9a4572eb21146a14829b", - "url": "https://api.github.com/repos/jqlang/jq/commits/f86566b2631b777c0d0c9a4572eb21146a14829b", - "html_url": "https://github.com/jqlang/jq/commit/f86566b2631b777c0d0c9a4572eb21146a14829b" - } - ] - }, - { - "sha": "f86566b2631b777c0d0c9a4572eb21146a14829b", - "node_id": "C_kwDOAE3WVdoAKGY4NjU2NmIyNjMxYjc3N2MwZDBjOWE0NTcyZWIyMTE0NmExNDgyOWI", - "commit": { - "author": { - "name": "itchyny", - "email": "itchyny@cybozu.co.jp", - "date": "2023-08-03T23:13:48Z" - }, - "committer": { - "name": "Emanuele Torre", - "email": "torreemanuele6@gmail.com", - "date": "2023-08-13T12:16:02Z" - }, - "message": "Rename jv_type_private.h to jv_private.h, move jvp_number_is_nan there", - "tree": { - "sha": "145f23c0525036ea0077083718bff0eaf949f201", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/145f23c0525036ea0077083718bff0eaf949f201" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/f86566b2631b777c0d0c9a4572eb21146a14829b", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/f86566b2631b777c0d0c9a4572eb21146a14829b", - "html_url": "https://github.com/jqlang/jq/commit/f86566b2631b777c0d0c9a4572eb21146a14829b", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/f86566b2631b777c0d0c9a4572eb21146a14829b/comments", - "author": { - "login": "itchyny", - "id": 375258, - "node_id": "MDQ6VXNlcjM3NTI1OA==", - "avatar_url": "https://avatars.githubusercontent.com/u/375258?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/itchyny", - "html_url": "https://github.com/itchyny", - "followers_url": "https://api.github.com/users/itchyny/followers", - "following_url": "https://api.github.com/users/itchyny/following{/other_user}", - "gists_url": "https://api.github.com/users/itchyny/gists{/gist_id}", - "starred_url": "https://api.github.com/users/itchyny/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/itchyny/subscriptions", - "organizations_url": "https://api.github.com/users/itchyny/orgs", - "repos_url": "https://api.github.com/users/itchyny/repos", - "events_url": "https://api.github.com/users/itchyny/events{/privacy}", - "received_events_url": "https://api.github.com/users/itchyny/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "emanuele6", - "id": 20175435, - "node_id": "MDQ6VXNlcjIwMTc1NDM1", - "avatar_url": "https://avatars.githubusercontent.com/u/20175435?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/emanuele6", - "html_url": "https://github.com/emanuele6", - "followers_url": "https://api.github.com/users/emanuele6/followers", - "following_url": "https://api.github.com/users/emanuele6/following{/other_user}", - "gists_url": "https://api.github.com/users/emanuele6/gists{/gist_id}", - "starred_url": "https://api.github.com/users/emanuele6/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/emanuele6/subscriptions", - "organizations_url": "https://api.github.com/users/emanuele6/orgs", - "repos_url": "https://api.github.com/users/emanuele6/repos", - "events_url": "https://api.github.com/users/emanuele6/events{/privacy}", - "received_events_url": "https://api.github.com/users/emanuele6/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "f31c180e8f38c085c4366a91f9bfffc2dd7c2bc2", - "url": "https://api.github.com/repos/jqlang/jq/commits/f31c180e8f38c085c4366a91f9bfffc2dd7c2bc2", - "html_url": "https://github.com/jqlang/jq/commit/f31c180e8f38c085c4366a91f9bfffc2dd7c2bc2" - } - ] - }, - { - "sha": "f31c180e8f38c085c4366a91f9bfffc2dd7c2bc2", - "node_id": "C_kwDOAE3WVdoAKGYzMWMxODBlOGYzOGMwODVjNDM2NmE5MWY5YmZmZmMyZGQ3YzJiYzI", - "commit": { - "author": { - "name": "Alex Wilson", - "email": "gpg@probablyfine.co.uk", - "date": "2023-08-12T11:04:27Z" - }, - "committer": { - "name": "Nico Williams", - "email": "nico@cryptonector.com", - "date": "2023-08-13T01:46:36Z" - }, - "message": "Update documentation to reflect new `defs` field on `modulemeta`", - "tree": { - "sha": "25f4c65810c0abf284ae7e26b92df29820d2a576", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/25f4c65810c0abf284ae7e26b92df29820d2a576" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/f31c180e8f38c085c4366a91f9bfffc2dd7c2bc2", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/f31c180e8f38c085c4366a91f9bfffc2dd7c2bc2", - "html_url": "https://github.com/jqlang/jq/commit/f31c180e8f38c085c4366a91f9bfffc2dd7c2bc2", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/f31c180e8f38c085c4366a91f9bfffc2dd7c2bc2/comments", - "author": { - "login": "mrwilson", - "id": 460299, - "node_id": "MDQ6VXNlcjQ2MDI5OQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/460299?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/mrwilson", - "html_url": "https://github.com/mrwilson", - "followers_url": "https://api.github.com/users/mrwilson/followers", - "following_url": "https://api.github.com/users/mrwilson/following{/other_user}", - "gists_url": "https://api.github.com/users/mrwilson/gists{/gist_id}", - "starred_url": "https://api.github.com/users/mrwilson/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/mrwilson/subscriptions", - "organizations_url": "https://api.github.com/users/mrwilson/orgs", - "repos_url": "https://api.github.com/users/mrwilson/repos", - "events_url": "https://api.github.com/users/mrwilson/events{/privacy}", - "received_events_url": "https://api.github.com/users/mrwilson/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "65ed95c93aeaeea96796eb6af5dfe8870eda0992", - "url": "https://api.github.com/repos/jqlang/jq/commits/65ed95c93aeaeea96796eb6af5dfe8870eda0992", - "html_url": "https://github.com/jqlang/jq/commit/65ed95c93aeaeea96796eb6af5dfe8870eda0992" - } - ] - }, - { - "sha": "65ed95c93aeaeea96796eb6af5dfe8870eda0992", - "node_id": "C_kwDOAE3WVdoAKDY1ZWQ5NWM5M2FlYWVlYTk2Nzk2ZWI2YWY1ZGZlODg3MGVkYTA5OTI", - "commit": { - "author": { - "name": "Alex Wilson", - "email": "gpg@probablyfine.co.uk", - "date": "2023-08-12T11:04:00Z" - }, - "committer": { - "name": "Nico Williams", - "email": "nico@cryptonector.com", - "date": "2023-08-13T01:46:36Z" - }, - "message": "Expose the names of a module's defined function via `modulemeta`\n\nThis reuses the existing `block_list_funcs` capability and adds an extra field on the `modulemeta` output, called `defs`, containing that list of functions.", - "tree": { - "sha": "5840f220e3763b289e3dccfa6582e8a0c18d8d04", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/5840f220e3763b289e3dccfa6582e8a0c18d8d04" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/65ed95c93aeaeea96796eb6af5dfe8870eda0992", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/65ed95c93aeaeea96796eb6af5dfe8870eda0992", - "html_url": "https://github.com/jqlang/jq/commit/65ed95c93aeaeea96796eb6af5dfe8870eda0992", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/65ed95c93aeaeea96796eb6af5dfe8870eda0992/comments", - "author": { - "login": "mrwilson", - "id": 460299, - "node_id": "MDQ6VXNlcjQ2MDI5OQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/460299?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/mrwilson", - "html_url": "https://github.com/mrwilson", - "followers_url": "https://api.github.com/users/mrwilson/followers", - "following_url": "https://api.github.com/users/mrwilson/following{/other_user}", - "gists_url": "https://api.github.com/users/mrwilson/gists{/gist_id}", - "starred_url": "https://api.github.com/users/mrwilson/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/mrwilson/subscriptions", - "organizations_url": "https://api.github.com/users/mrwilson/orgs", - "repos_url": "https://api.github.com/users/mrwilson/repos", - "events_url": "https://api.github.com/users/mrwilson/events{/privacy}", - "received_events_url": "https://api.github.com/users/mrwilson/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "fdab39bc7b8d41c1ae410f03a42afc10a9322c99", - "url": "https://api.github.com/repos/jqlang/jq/commits/fdab39bc7b8d41c1ae410f03a42afc10a9322c99", - "html_url": "https://github.com/jqlang/jq/commit/fdab39bc7b8d41c1ae410f03a42afc10a9322c99" - } - ] - }, - { - "sha": "fdab39bc7b8d41c1ae410f03a42afc10a9322c99", - "node_id": "C_kwDOAE3WVdoAKGZkYWIzOWJjN2I4ZDQxYzFhZTQxMGYwM2E0MmFmYzEwYTkzMjJjOTk", - "commit": { - "author": { - "name": "Mattias Wadman", - "email": "mattias.wadman@gmail.com", - "date": "2023-08-12T18:18:45Z" - }, - "committer": { - "name": "GitHub", - "email": "noreply@github.com", - "date": "2023-08-12T18:18:45Z" - }, - "message": "Build windows 64bit binary using UCRT64 (#2832)\n\n* Build windows 64bit binary using UCRT64\r\n\r\nIs the default and recommended msystem setting. Will produce\r\nbinaries that are compatible with windows 10 and later.\r\n\r\nAlso run tests for 32bit build.\r\n\r\nRelated to #2831\r\n\r\n* Use jq -b in tests/shtest\r\n\r\n* Add Windows strptime\r\n\r\n* Make Windows-optional tests not run on Windows again\r\n\r\n---------\r\n\r\nCo-authored-by: Nicolas Williams ", - "tree": { - "sha": "bbc3acf5253585e348a720b4706bd0427e81e392", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/bbc3acf5253585e348a720b4706bd0427e81e392" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/fdab39bc7b8d41c1ae410f03a42afc10a9322c99", - "comment_count": 0, - "verification": { - "verified": true, - "reason": "valid", - "signature": "-----BEGIN PGP SIGNATURE-----\n\nwsBcBAABCAAQBQJk180FCRBK7hj4Ov3rIwAAdMkIAKgkvGVHq+i5pZIhmOPcOFJM\nE2YdPsWcQ5CF67PJC/qinJx9UV+MA6XzoPtGzaJyJBiWzDXK2OhO/EALtLHZOMeU\na/YodAq3+P/ZSxcBhVOkMQpriJl8IZdd0sfuW8zBIf/XC6+amqzy6NRrfdImyPk6\nNDwSj2hkRTC+3KC9VbMaKqaQcMC2+tfxp4+BLre6CO3FVU0lHhu5xNPBnDhFwVhD\nB03cL5OzsU75cTeWHpypEd057UpbILcNxuyRgyRf4Aovc4P0TQjeNofr3XPpucj0\ncY1IZ8Cn93nHWfYAIGGYX/SC5DWk0HCbwKH5saj3rIOOrP5Rje1P37Mts0trguY=\n=uE99\n-----END PGP SIGNATURE-----\n", - "payload": "tree bbc3acf5253585e348a720b4706bd0427e81e392\nparent 5a52553a3be6ef3e44928cab20f96cdaa3e8b5dc\nauthor Mattias Wadman 1691864325 +0200\ncommitter GitHub 1691864325 +0200\n\nBuild windows 64bit binary using UCRT64 (#2832)\n\n* Build windows 64bit binary using UCRT64\r\n\r\nIs the default and recommended msystem setting. Will produce\r\nbinaries that are compatible with windows 10 and later.\r\n\r\nAlso run tests for 32bit build.\r\n\r\nRelated to #2831\r\n\r\n* Use jq -b in tests/shtest\r\n\r\n* Add Windows strptime\r\n\r\n* Make Windows-optional tests not run on Windows again\r\n\r\n---------\r\n\r\nCo-authored-by: Nicolas Williams " - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/fdab39bc7b8d41c1ae410f03a42afc10a9322c99", - "html_url": "https://github.com/jqlang/jq/commit/fdab39bc7b8d41c1ae410f03a42afc10a9322c99", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/fdab39bc7b8d41c1ae410f03a42afc10a9322c99/comments", - "author": { - "login": "wader", - "id": 185566, - "node_id": "MDQ6VXNlcjE4NTU2Ng==", - "avatar_url": "https://avatars.githubusercontent.com/u/185566?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/wader", - "html_url": "https://github.com/wader", - "followers_url": "https://api.github.com/users/wader/followers", - "following_url": "https://api.github.com/users/wader/following{/other_user}", - "gists_url": "https://api.github.com/users/wader/gists{/gist_id}", - "starred_url": "https://api.github.com/users/wader/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/wader/subscriptions", - "organizations_url": "https://api.github.com/users/wader/orgs", - "repos_url": "https://api.github.com/users/wader/repos", - "events_url": "https://api.github.com/users/wader/events{/privacy}", - "received_events_url": "https://api.github.com/users/wader/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "web-flow", - "id": 19864447, - "node_id": "MDQ6VXNlcjE5ODY0NDQ3", - "avatar_url": "https://avatars.githubusercontent.com/u/19864447?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/web-flow", - "html_url": "https://github.com/web-flow", - "followers_url": "https://api.github.com/users/web-flow/followers", - "following_url": "https://api.github.com/users/web-flow/following{/other_user}", - "gists_url": "https://api.github.com/users/web-flow/gists{/gist_id}", - "starred_url": "https://api.github.com/users/web-flow/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/web-flow/subscriptions", - "organizations_url": "https://api.github.com/users/web-flow/orgs", - "repos_url": "https://api.github.com/users/web-flow/repos", - "events_url": "https://api.github.com/users/web-flow/events{/privacy}", - "received_events_url": "https://api.github.com/users/web-flow/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "5a52553a3be6ef3e44928cab20f96cdaa3e8b5dc", - "url": "https://api.github.com/repos/jqlang/jq/commits/5a52553a3be6ef3e44928cab20f96cdaa3e8b5dc", - "html_url": "https://github.com/jqlang/jq/commit/5a52553a3be6ef3e44928cab20f96cdaa3e8b5dc" - } - ] - }, - { - "sha": "5a52553a3be6ef3e44928cab20f96cdaa3e8b5dc", - "node_id": "C_kwDOAE3WVdoAKDVhNTI1NTNhM2JlNmVmM2U0NDkyOGNhYjIwZjk2Y2RhYTNlOGI1ZGM", - "commit": { - "author": { - "name": "Mattias Wadman", - "email": "mattias.wadman@gmail.com", - "date": "2023-08-10T17:13:58Z" - }, - "committer": { - "name": "Nico Williams", - "email": "nico@cryptonector.com", - "date": "2023-08-10T18:06:03Z" - }, - "message": "Make sure to init key and dbl_key also on win32\n\nHopefully fixes page fault for mingw build\n\nRelated to #2831", - "tree": { - "sha": "c00ad020b914a83031e1195d7d6eaa3f8845beb6", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/c00ad020b914a83031e1195d7d6eaa3f8845beb6" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/5a52553a3be6ef3e44928cab20f96cdaa3e8b5dc", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/5a52553a3be6ef3e44928cab20f96cdaa3e8b5dc", - "html_url": "https://github.com/jqlang/jq/commit/5a52553a3be6ef3e44928cab20f96cdaa3e8b5dc", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/5a52553a3be6ef3e44928cab20f96cdaa3e8b5dc/comments", - "author": { - "login": "wader", - "id": 185566, - "node_id": "MDQ6VXNlcjE4NTU2Ng==", - "avatar_url": "https://avatars.githubusercontent.com/u/185566?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/wader", - "html_url": "https://github.com/wader", - "followers_url": "https://api.github.com/users/wader/followers", - "following_url": "https://api.github.com/users/wader/following{/other_user}", - "gists_url": "https://api.github.com/users/wader/gists{/gist_id}", - "starred_url": "https://api.github.com/users/wader/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/wader/subscriptions", - "organizations_url": "https://api.github.com/users/wader/orgs", - "repos_url": "https://api.github.com/users/wader/repos", - "events_url": "https://api.github.com/users/wader/events{/privacy}", - "received_events_url": "https://api.github.com/users/wader/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "765a5c77eb919bca04a20c000b8a1df65f8d81eb", - "url": "https://api.github.com/repos/jqlang/jq/commits/765a5c77eb919bca04a20c000b8a1df65f8d81eb", - "html_url": "https://github.com/jqlang/jq/commit/765a5c77eb919bca04a20c000b8a1df65f8d81eb" - } - ] - }, - { - "sha": "765a5c77eb919bca04a20c000b8a1df65f8d81eb", - "node_id": "C_kwDOAE3WVdoAKDc2NWE1Yzc3ZWI5MTliY2EwNGEyMGMwMDBiOGExZGY2NWY4ZDgxZWI", - "commit": { - "author": { - "name": "Mattias Wadman", - "email": "mattias.wadman@gmail.com", - "date": "2023-08-10T16:53:50Z" - }, - "committer": { - "name": "GitHub", - "email": "noreply@github.com", - "date": "2023-08-10T16:53:50Z" - }, - "message": "Make sure to init dtoa_ctx_key also on win32 (#2834)\n\nFixes page fault for mingw build\r\n\r\nRelated to #2831", - "tree": { - "sha": "36f251aec82c746c1fc40094290bd58de3f6a279", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/36f251aec82c746c1fc40094290bd58de3f6a279" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/765a5c77eb919bca04a20c000b8a1df65f8d81eb", - "comment_count": 0, - "verification": { - "verified": true, - "reason": "valid", - "signature": "-----BEGIN PGP SIGNATURE-----\n\nwsBcBAABCAAQBQJk1RYeCRBK7hj4Ov3rIwAAObAIAF4hP/G4HQfAxdt8yGMwXubs\n/K/rzBfLkyoCDLON65toD+76sC9bwmQfmyI0ng+jdlSkvw/7YRdREOdmdOznl6af\nwpHoYsUN89QAmzF4ZOI5krZWJ1TuNntEUgTVCMyv6IysQhci+EC6VCugIn07kwFt\nYR1SpJASQOk6fug7GTUtzSM6ffw3pi3HdX53VR0RlmxSGisSQHdTYZlm4/sdLoDa\n7QZVEb8MbdyvnBVRmDUbS74DOCR18uXmqtcntj9BPVkMpwyF66dh+9N+HLOoyy0R\nwB5ev1HbXCwn4WIA1uDK4/7osS1M4KnVZi7uU99nnG9qh3ISmc6SzlmTH2qHTt0=\n=CVeF\n-----END PGP SIGNATURE-----\n", - "payload": "tree 36f251aec82c746c1fc40094290bd58de3f6a279\nparent d1a6da22054fc249ae4cbe04402709b029101786\nauthor Mattias Wadman 1691686430 +0200\ncommitter GitHub 1691686430 +0200\n\nMake sure to init dtoa_ctx_key also on win32 (#2834)\n\nFixes page fault for mingw build\r\n\r\nRelated to #2831" - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/765a5c77eb919bca04a20c000b8a1df65f8d81eb", - "html_url": "https://github.com/jqlang/jq/commit/765a5c77eb919bca04a20c000b8a1df65f8d81eb", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/765a5c77eb919bca04a20c000b8a1df65f8d81eb/comments", - "author": { - "login": "wader", - "id": 185566, - "node_id": "MDQ6VXNlcjE4NTU2Ng==", - "avatar_url": "https://avatars.githubusercontent.com/u/185566?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/wader", - "html_url": "https://github.com/wader", - "followers_url": "https://api.github.com/users/wader/followers", - "following_url": "https://api.github.com/users/wader/following{/other_user}", - "gists_url": "https://api.github.com/users/wader/gists{/gist_id}", - "starred_url": "https://api.github.com/users/wader/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/wader/subscriptions", - "organizations_url": "https://api.github.com/users/wader/orgs", - "repos_url": "https://api.github.com/users/wader/repos", - "events_url": "https://api.github.com/users/wader/events{/privacy}", - "received_events_url": "https://api.github.com/users/wader/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "web-flow", - "id": 19864447, - "node_id": "MDQ6VXNlcjE5ODY0NDQ3", - "avatar_url": "https://avatars.githubusercontent.com/u/19864447?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/web-flow", - "html_url": "https://github.com/web-flow", - "followers_url": "https://api.github.com/users/web-flow/followers", - "following_url": "https://api.github.com/users/web-flow/following{/other_user}", - "gists_url": "https://api.github.com/users/web-flow/gists{/gist_id}", - "starred_url": "https://api.github.com/users/web-flow/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/web-flow/subscriptions", - "organizations_url": "https://api.github.com/users/web-flow/orgs", - "repos_url": "https://api.github.com/users/web-flow/repos", - "events_url": "https://api.github.com/users/web-flow/events{/privacy}", - "received_events_url": "https://api.github.com/users/web-flow/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "d1a6da22054fc249ae4cbe04402709b029101786", - "url": "https://api.github.com/repos/jqlang/jq/commits/d1a6da22054fc249ae4cbe04402709b029101786", - "html_url": "https://github.com/jqlang/jq/commit/d1a6da22054fc249ae4cbe04402709b029101786" - } - ] - }, - { - "sha": "d1a6da22054fc249ae4cbe04402709b029101786", - "node_id": "C_kwDOAE3WVdoAKGQxYTZkYTIyMDU0ZmMyNDlhZTRjYmUwNDQwMjcwOWIwMjkxMDE3ODY", - "commit": { - "author": { - "name": "Naïm Favier", - "email": "n@monade.li", - "date": "2023-08-09T15:51:22Z" - }, - "committer": { - "name": "Emanuele Torre", - "email": "torreemanuele6@gmail.com", - "date": "2023-08-09T16:20:04Z" - }, - "message": "docs: fix delpaths description", - "tree": { - "sha": "a274e39cb67d66a17e60ee2e4a2220c72f3eda66", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/a274e39cb67d66a17e60ee2e4a2220c72f3eda66" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/d1a6da22054fc249ae4cbe04402709b029101786", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/d1a6da22054fc249ae4cbe04402709b029101786", - "html_url": "https://github.com/jqlang/jq/commit/d1a6da22054fc249ae4cbe04402709b029101786", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/d1a6da22054fc249ae4cbe04402709b029101786/comments", - "author": { - "login": "ncfavier", - "id": 4323933, - "node_id": "MDQ6VXNlcjQzMjM5MzM=", - "avatar_url": "https://avatars.githubusercontent.com/u/4323933?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/ncfavier", - "html_url": "https://github.com/ncfavier", - "followers_url": "https://api.github.com/users/ncfavier/followers", - "following_url": "https://api.github.com/users/ncfavier/following{/other_user}", - "gists_url": "https://api.github.com/users/ncfavier/gists{/gist_id}", - "starred_url": "https://api.github.com/users/ncfavier/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/ncfavier/subscriptions", - "organizations_url": "https://api.github.com/users/ncfavier/orgs", - "repos_url": "https://api.github.com/users/ncfavier/repos", - "events_url": "https://api.github.com/users/ncfavier/events{/privacy}", - "received_events_url": "https://api.github.com/users/ncfavier/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "emanuele6", - "id": 20175435, - "node_id": "MDQ6VXNlcjIwMTc1NDM1", - "avatar_url": "https://avatars.githubusercontent.com/u/20175435?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/emanuele6", - "html_url": "https://github.com/emanuele6", - "followers_url": "https://api.github.com/users/emanuele6/followers", - "following_url": "https://api.github.com/users/emanuele6/following{/other_user}", - "gists_url": "https://api.github.com/users/emanuele6/gists{/gist_id}", - "starred_url": "https://api.github.com/users/emanuele6/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/emanuele6/subscriptions", - "organizations_url": "https://api.github.com/users/emanuele6/orgs", - "repos_url": "https://api.github.com/users/emanuele6/repos", - "events_url": "https://api.github.com/users/emanuele6/events{/privacy}", - "received_events_url": "https://api.github.com/users/emanuele6/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "a6920601299913ec5f9c9a8883517ec10dd71ffe", - "url": "https://api.github.com/repos/jqlang/jq/commits/a6920601299913ec5f9c9a8883517ec10dd71ffe", - "html_url": "https://github.com/jqlang/jq/commit/a6920601299913ec5f9c9a8883517ec10dd71ffe" - } - ] - }, - { - "sha": "a6920601299913ec5f9c9a8883517ec10dd71ffe", - "node_id": "C_kwDOAE3WVdoAKGE2OTIwNjAxMjk5OTEzZWM1ZjljOWE4ODgzNTE3ZWMxMGRkNzFmZmU", - "commit": { - "author": { - "name": "itchyny", - "email": "itchyny@cybozu.co.jp", - "date": "2023-08-05T10:18:07Z" - }, - "committer": { - "name": "Nico Williams", - "email": "nico@cryptonector.com", - "date": "2023-08-06T04:21:12Z" - }, - "message": "Change the default color of null to Bright Black", - "tree": { - "sha": "abe1dbc2eb65473186a4962dd4ff156562c2a5e3", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/abe1dbc2eb65473186a4962dd4ff156562c2a5e3" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/a6920601299913ec5f9c9a8883517ec10dd71ffe", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/a6920601299913ec5f9c9a8883517ec10dd71ffe", - "html_url": "https://github.com/jqlang/jq/commit/a6920601299913ec5f9c9a8883517ec10dd71ffe", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/a6920601299913ec5f9c9a8883517ec10dd71ffe/comments", - "author": { - "login": "itchyny", - "id": 375258, - "node_id": "MDQ6VXNlcjM3NTI1OA==", - "avatar_url": "https://avatars.githubusercontent.com/u/375258?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/itchyny", - "html_url": "https://github.com/itchyny", - "followers_url": "https://api.github.com/users/itchyny/followers", - "following_url": "https://api.github.com/users/itchyny/following{/other_user}", - "gists_url": "https://api.github.com/users/itchyny/gists{/gist_id}", - "starred_url": "https://api.github.com/users/itchyny/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/itchyny/subscriptions", - "organizations_url": "https://api.github.com/users/itchyny/orgs", - "repos_url": "https://api.github.com/users/itchyny/repos", - "events_url": "https://api.github.com/users/itchyny/events{/privacy}", - "received_events_url": "https://api.github.com/users/itchyny/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "f94a9d463ffb3422861a0da140470dbf5ce76632", - "url": "https://api.github.com/repos/jqlang/jq/commits/f94a9d463ffb3422861a0da140470dbf5ce76632", - "html_url": "https://github.com/jqlang/jq/commit/f94a9d463ffb3422861a0da140470dbf5ce76632" - } - ] - }, - { - "sha": "f94a9d463ffb3422861a0da140470dbf5ce76632", - "node_id": "C_kwDOAE3WVdoAKGY5NGE5ZDQ2M2ZmYjM0MjI4NjFhMGRhMTQwNDcwZGJmNWNlNzY2MzI", - "commit": { - "author": { - "name": "Emanuele Torre", - "email": "torreemanuele6@gmail.com", - "date": "2023-08-04T20:52:27Z" - }, - "committer": { - "name": "Nico Williams", - "email": "nico@cryptonector.com", - "date": "2023-08-04T22:38:52Z" - }, - "message": "Let error(null) throw null\n\nThis patch removes the weird behaviour of jv_invalid_with_msg(jv_null())\nthat returns jv_invalid() (i.e. empty), instead of a boxed jv_null().\n\nThe previous behaviour of null|error was obviously unintentional, and\nallowing is jv_invalid_with_msg() to return values on which you can't\ncall jv_invalid_get_msg() is only error prone.", - "tree": { - "sha": "b63b841402177b23758f6ab54a835d34ae716156", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/b63b841402177b23758f6ab54a835d34ae716156" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/f94a9d463ffb3422861a0da140470dbf5ce76632", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/f94a9d463ffb3422861a0da140470dbf5ce76632", - "html_url": "https://github.com/jqlang/jq/commit/f94a9d463ffb3422861a0da140470dbf5ce76632", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/f94a9d463ffb3422861a0da140470dbf5ce76632/comments", - "author": { - "login": "emanuele6", - "id": 20175435, - "node_id": "MDQ6VXNlcjIwMTc1NDM1", - "avatar_url": "https://avatars.githubusercontent.com/u/20175435?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/emanuele6", - "html_url": "https://github.com/emanuele6", - "followers_url": "https://api.github.com/users/emanuele6/followers", - "following_url": "https://api.github.com/users/emanuele6/following{/other_user}", - "gists_url": "https://api.github.com/users/emanuele6/gists{/gist_id}", - "starred_url": "https://api.github.com/users/emanuele6/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/emanuele6/subscriptions", - "organizations_url": "https://api.github.com/users/emanuele6/orgs", - "repos_url": "https://api.github.com/users/emanuele6/repos", - "events_url": "https://api.github.com/users/emanuele6/events{/privacy}", - "received_events_url": "https://api.github.com/users/emanuele6/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "3b6e7ddd72d6080959a44bdcca068c3a200eb2ef", - "url": "https://api.github.com/repos/jqlang/jq/commits/3b6e7ddd72d6080959a44bdcca068c3a200eb2ef", - "html_url": "https://github.com/jqlang/jq/commit/3b6e7ddd72d6080959a44bdcca068c3a200eb2ef" - } - ] - }, - { - "sha": "3b6e7ddd72d6080959a44bdcca068c3a200eb2ef", - "node_id": "C_kwDOAE3WVdoAKDNiNmU3ZGRkNzJkNjA4MDk1OWE0NGJkY2NhMDY4YzNhMjAwZWIyZWY", - "commit": { - "author": { - "name": "Emanuele Torre", - "email": "torreemanuele6@gmail.com", - "date": "2023-08-03T22:12:48Z" - }, - "committer": { - "name": "Nico Williams", - "email": "nico@cryptonector.com", - "date": "2023-08-04T16:47:34Z" - }, - "message": "Constant fold all kinds of constants\n\nThis patch exports all the binary operator builtins functions from\nbuiltin.c and uses them for constant folding in the parser, allowing\nconstant folding to work will all kinds and combinations of constants.\n\nNow string*number, $ARGS+$ARGS, string/string, etc will also be\nconstant folded and the implementation of constant folded operators and\nruntime operators will be the same.\n\nAnd thanks to the new ERRORK bytecode operation, errors are constant\nfolded too! (e.g. 1 / 0 [] * {} etc)", - "tree": { - "sha": "951edc6c11af2d4a59edb1bb0770b9bf8b4a6968", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/951edc6c11af2d4a59edb1bb0770b9bf8b4a6968" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/3b6e7ddd72d6080959a44bdcca068c3a200eb2ef", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/3b6e7ddd72d6080959a44bdcca068c3a200eb2ef", - "html_url": "https://github.com/jqlang/jq/commit/3b6e7ddd72d6080959a44bdcca068c3a200eb2ef", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/3b6e7ddd72d6080959a44bdcca068c3a200eb2ef/comments", - "author": { - "login": "emanuele6", - "id": 20175435, - "node_id": "MDQ6VXNlcjIwMTc1NDM1", - "avatar_url": "https://avatars.githubusercontent.com/u/20175435?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/emanuele6", - "html_url": "https://github.com/emanuele6", - "followers_url": "https://api.github.com/users/emanuele6/followers", - "following_url": "https://api.github.com/users/emanuele6/following{/other_user}", - "gists_url": "https://api.github.com/users/emanuele6/gists{/gist_id}", - "starred_url": "https://api.github.com/users/emanuele6/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/emanuele6/subscriptions", - "organizations_url": "https://api.github.com/users/emanuele6/orgs", - "repos_url": "https://api.github.com/users/emanuele6/repos", - "events_url": "https://api.github.com/users/emanuele6/events{/privacy}", - "received_events_url": "https://api.github.com/users/emanuele6/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "5fc5453409b858e4c6f68507f4147cf4a275f82b", - "url": "https://api.github.com/repos/jqlang/jq/commits/5fc5453409b858e4c6f68507f4147cf4a275f82b", - "html_url": "https://github.com/jqlang/jq/commit/5fc5453409b858e4c6f68507f4147cf4a275f82b" - } - ] - }, - { - "sha": "5fc5453409b858e4c6f68507f4147cf4a275f82b", - "node_id": "C_kwDOAE3WVdoAKDVmYzU0NTM0MDliODU4ZTRjNmY2ODUwN2Y0MTQ3Y2Y0YTI3NWY4MmI", - "commit": { - "author": { - "name": "Emanuele Torre", - "email": "torreemanuele6@gmail.com", - "date": "2023-08-04T00:50:05Z" - }, - "committer": { - "name": "Nico Williams", - "email": "nico@cryptonector.com", - "date": "2023-08-04T16:47:34Z" - }, - "message": "Add ERRORK opcode to trigger constant errors", - "tree": { - "sha": "514605dbcf667579c987176e967be40a6fdea0c7", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/514605dbcf667579c987176e967be40a6fdea0c7" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/5fc5453409b858e4c6f68507f4147cf4a275f82b", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/5fc5453409b858e4c6f68507f4147cf4a275f82b", - "html_url": "https://github.com/jqlang/jq/commit/5fc5453409b858e4c6f68507f4147cf4a275f82b", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/5fc5453409b858e4c6f68507f4147cf4a275f82b/comments", - "author": { - "login": "emanuele6", - "id": 20175435, - "node_id": "MDQ6VXNlcjIwMTc1NDM1", - "avatar_url": "https://avatars.githubusercontent.com/u/20175435?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/emanuele6", - "html_url": "https://github.com/emanuele6", - "followers_url": "https://api.github.com/users/emanuele6/followers", - "following_url": "https://api.github.com/users/emanuele6/following{/other_user}", - "gists_url": "https://api.github.com/users/emanuele6/gists{/gist_id}", - "starred_url": "https://api.github.com/users/emanuele6/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/emanuele6/subscriptions", - "organizations_url": "https://api.github.com/users/emanuele6/orgs", - "repos_url": "https://api.github.com/users/emanuele6/repos", - "events_url": "https://api.github.com/users/emanuele6/events{/privacy}", - "received_events_url": "https://api.github.com/users/emanuele6/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "71941a0d4706fecf641df249c27ec73771bc149c", - "url": "https://api.github.com/repos/jqlang/jq/commits/71941a0d4706fecf641df249c27ec73771bc149c", - "html_url": "https://github.com/jqlang/jq/commit/71941a0d4706fecf641df249c27ec73771bc149c" - } - ] - }, - { - "sha": "71941a0d4706fecf641df249c27ec73771bc149c", - "node_id": "C_kwDOAE3WVdoAKDcxOTQxYTBkNDcwNmZlY2Y2NDFkZjI0OWMyN2VjNzM3NzFiYzE0OWM", - "commit": { - "author": { - "name": "Nicolas Williams", - "email": "nico@cryptonector.com", - "date": "2023-08-04T04:24:06Z" - }, - "committer": { - "name": "Nicolas Williams", - "email": "nico@cryptonector.com", - "date": "2023-08-04T04:24:12Z" - }, - "message": "Clarify the `//` operator (fix typo)", - "tree": { - "sha": "c7d01a748482d24210d74f524ea47f639fc9a342", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/c7d01a748482d24210d74f524ea47f639fc9a342" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/71941a0d4706fecf641df249c27ec73771bc149c", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/71941a0d4706fecf641df249c27ec73771bc149c", - "html_url": "https://github.com/jqlang/jq/commit/71941a0d4706fecf641df249c27ec73771bc149c", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/71941a0d4706fecf641df249c27ec73771bc149c/comments", - "author": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "dcaf701ef66dd0a9c27df49959e4eae9c45c73c4", - "url": "https://api.github.com/repos/jqlang/jq/commits/dcaf701ef66dd0a9c27df49959e4eae9c45c73c4", - "html_url": "https://github.com/jqlang/jq/commit/dcaf701ef66dd0a9c27df49959e4eae9c45c73c4" - } - ] - }, - { - "sha": "dcaf701ef66dd0a9c27df49959e4eae9c45c73c4", - "node_id": "C_kwDOAE3WVdoAKGRjYWY3MDFlZjY2ZGQwYTljMjdkZjQ5OTU5ZTRlYWU5YzQ1YzczYzQ", - "commit": { - "author": { - "name": "Emanuele Torre", - "email": "torreemanuele6@gmail.com", - "date": "2023-08-03T23:21:25Z" - }, - "committer": { - "name": "GitHub", - "email": "noreply@github.com", - "date": "2023-08-03T23:21:25Z" - }, - "message": "Simplify String rule in parser (#2805)\n\nUse a StringStart component that is either FORMAT QQSTRING_START or\r\nQQSTRING_START instead of having two similar rules for String.\r\n\r\nThis is simpler and avoids having to use an untyped mid-rule action\r\ncomponent to copy FORMAT at the top of the stack before QQString, and\r\nhaving to use jv_free($3) instead of jv_free($1) just to make\r\nbison not complain about the \"unused\" mid-rule component.", - "tree": { - "sha": "6b9a6b8c29730827b23da6e95cded66acc0b150d", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/6b9a6b8c29730827b23da6e95cded66acc0b150d" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/dcaf701ef66dd0a9c27df49959e4eae9c45c73c4", - "comment_count": 0, - "verification": { - "verified": true, - "reason": "valid", - "signature": "-----BEGIN PGP SIGNATURE-----\n\nwsBcBAABCAAQBQJkzDZ1CRBK7hj4Ov3rIwAAEyUIACzEKPbYZQtYEZgnS2oOOUXa\nnw9QcYvSfUXjeNc2m3GnxdOpq5Yze0pLdumW7h2TalYol2uxXuFVVuMSuphbj7cl\nhQg81YFDTyPZbwAVYR3V0VB7IL/8FWZ452RTM3SEKNPK96vfVb1Hsa85gjvjHNfx\nMbkOz8m+wIUgLx9YLmVFtVE9E92tp+Qk8zeyryOmozbfIKmal6GCYq2L8t007z0r\nnW3HIbFpKBkU6HM8PYW5cpuSRdBeNbMZ3Ol/ZfkKY14I/NB4vheRpgLD38nO6xGF\ngw/p1PxzAeIJduUPrVdzh7GoB+GeQO1GWmUdcmuxu9dHJQgsdmvazb/Kw6DZDQQ=\n=DEfZ\n-----END PGP SIGNATURE-----\n", - "payload": "tree 6b9a6b8c29730827b23da6e95cded66acc0b150d\nparent d8327a90b86e0e066f2e04e9d5251a34ea4dea04\nauthor Emanuele Torre 1691104885 +0200\ncommitter GitHub 1691104885 +0900\n\nSimplify String rule in parser (#2805)\n\nUse a StringStart component that is either FORMAT QQSTRING_START or\r\nQQSTRING_START instead of having two similar rules for String.\r\n\r\nThis is simpler and avoids having to use an untyped mid-rule action\r\ncomponent to copy FORMAT at the top of the stack before QQString, and\r\nhaving to use jv_free($3) instead of jv_free($1) just to make\r\nbison not complain about the \"unused\" mid-rule component." - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/dcaf701ef66dd0a9c27df49959e4eae9c45c73c4", - "html_url": "https://github.com/jqlang/jq/commit/dcaf701ef66dd0a9c27df49959e4eae9c45c73c4", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/dcaf701ef66dd0a9c27df49959e4eae9c45c73c4/comments", - "author": { - "login": "emanuele6", - "id": 20175435, - "node_id": "MDQ6VXNlcjIwMTc1NDM1", - "avatar_url": "https://avatars.githubusercontent.com/u/20175435?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/emanuele6", - "html_url": "https://github.com/emanuele6", - "followers_url": "https://api.github.com/users/emanuele6/followers", - "following_url": "https://api.github.com/users/emanuele6/following{/other_user}", - "gists_url": "https://api.github.com/users/emanuele6/gists{/gist_id}", - "starred_url": "https://api.github.com/users/emanuele6/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/emanuele6/subscriptions", - "organizations_url": "https://api.github.com/users/emanuele6/orgs", - "repos_url": "https://api.github.com/users/emanuele6/repos", - "events_url": "https://api.github.com/users/emanuele6/events{/privacy}", - "received_events_url": "https://api.github.com/users/emanuele6/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "web-flow", - "id": 19864447, - "node_id": "MDQ6VXNlcjE5ODY0NDQ3", - "avatar_url": "https://avatars.githubusercontent.com/u/19864447?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/web-flow", - "html_url": "https://github.com/web-flow", - "followers_url": "https://api.github.com/users/web-flow/followers", - "following_url": "https://api.github.com/users/web-flow/following{/other_user}", - "gists_url": "https://api.github.com/users/web-flow/gists{/gist_id}", - "starred_url": "https://api.github.com/users/web-flow/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/web-flow/subscriptions", - "organizations_url": "https://api.github.com/users/web-flow/orgs", - "repos_url": "https://api.github.com/users/web-flow/repos", - "events_url": "https://api.github.com/users/web-flow/events{/privacy}", - "received_events_url": "https://api.github.com/users/web-flow/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "d8327a90b86e0e066f2e04e9d5251a34ea4dea04", - "url": "https://api.github.com/repos/jqlang/jq/commits/d8327a90b86e0e066f2e04e9d5251a34ea4dea04", - "html_url": "https://github.com/jqlang/jq/commit/d8327a90b86e0e066f2e04e9d5251a34ea4dea04" - } - ] - }, - { - "sha": "d8327a90b86e0e066f2e04e9d5251a34ea4dea04", - "node_id": "C_kwDOAE3WVdoAKGQ4MzI3YTkwYjg2ZTBlMDY2ZjJlMDRlOWQ1MjUxYTM0ZWE0ZGVhMDQ", - "commit": { - "author": { - "name": "Nicolas Williams", - "email": "nico@cryptonector.com", - "date": "2023-07-30T23:09:45Z" - }, - "committer": { - "name": "Nico Williams", - "email": "nico@cryptonector.com", - "date": "2023-08-03T19:41:53Z" - }, - "message": "Add a bit more text about generators", - "tree": { - "sha": "c22c82c3e688870cb1ee32e95b1d2a77e4ea8c96", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/c22c82c3e688870cb1ee32e95b1d2a77e4ea8c96" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/d8327a90b86e0e066f2e04e9d5251a34ea4dea04", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/d8327a90b86e0e066f2e04e9d5251a34ea4dea04", - "html_url": "https://github.com/jqlang/jq/commit/d8327a90b86e0e066f2e04e9d5251a34ea4dea04", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/d8327a90b86e0e066f2e04e9d5251a34ea4dea04/comments", - "author": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "ddef804945e0a49162e11e155a9b32cf840fe90e", - "url": "https://api.github.com/repos/jqlang/jq/commits/ddef804945e0a49162e11e155a9b32cf840fe90e", - "html_url": "https://github.com/jqlang/jq/commit/ddef804945e0a49162e11e155a9b32cf840fe90e" - } - ] - }, - { - "sha": "ddef804945e0a49162e11e155a9b32cf840fe90e", - "node_id": "C_kwDOAE3WVdoAKGRkZWY4MDQ5NDVlMGE0OTE2MmUxMWUxNTVhOWIzMmNmODQwZmU5MGU", - "commit": { - "author": { - "name": "Nicolas Williams", - "email": "nico@cryptonector.com", - "date": "2023-07-30T23:09:18Z" - }, - "committer": { - "name": "Nico Williams", - "email": "nico@cryptonector.com", - "date": "2023-08-03T19:41:53Z" - }, - "message": "Clarify the `//` operator (close #2189)", - "tree": { - "sha": "55bc07de8a417bdca3cb1e75669bae7a8e59e871", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/55bc07de8a417bdca3cb1e75669bae7a8e59e871" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/ddef804945e0a49162e11e155a9b32cf840fe90e", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/ddef804945e0a49162e11e155a9b32cf840fe90e", - "html_url": "https://github.com/jqlang/jq/commit/ddef804945e0a49162e11e155a9b32cf840fe90e", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/ddef804945e0a49162e11e155a9b32cf840fe90e/comments", - "author": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "949d38e6dc7330712b50697d7fe833eec85dede1", - "url": "https://api.github.com/repos/jqlang/jq/commits/949d38e6dc7330712b50697d7fe833eec85dede1", - "html_url": "https://github.com/jqlang/jq/commit/949d38e6dc7330712b50697d7fe833eec85dede1" - } - ] - }, - { - "sha": "949d38e6dc7330712b50697d7fe833eec85dede1", - "node_id": "C_kwDOAE3WVdoAKDk0OWQzOGU2ZGM3MzMwNzEyYjUwNjk3ZDdmZTgzM2VlYzg1ZGVkZTE", - "commit": { - "author": { - "name": "itchyny", - "email": "itchyny@cybozu.co.jp", - "date": "2023-08-03T14:19:52Z" - }, - "committer": { - "name": "GitHub", - "email": "noreply@github.com", - "date": "2023-08-03T14:19:52Z" - }, - "message": "Fix crash on numeric comparison (ref #2804) (#2818)", - "tree": { - "sha": "1188cf0735c4501d074e3e0a6013624f1a030530", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/1188cf0735c4501d074e3e0a6013624f1a030530" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/949d38e6dc7330712b50697d7fe833eec85dede1", - "comment_count": 0, - "verification": { - "verified": true, - "reason": "valid", - "signature": "-----BEGIN PGP SIGNATURE-----\n\nwsBcBAABCAAQBQJky7eICRBK7hj4Ov3rIwAAsI8IALKuXsLXBEGKjonCqMjiRthk\n4W5F0LpRTIn7QOpjPfPJUZR6yfY/Ig4KaMcjtlO2yI3JXIJD6eVhR88kZ0DoshTD\ncv3rWTaC1MK77MjAuCqogk0eF0Xc2MHcRFZ7gVuWRm03R+1+29cvjpfpq8ISAJXm\nbHuWhDLzw1wJ5rlsKxore71diX8XWIq488UeAX9bchCxv/XC9mluTCHJ/pVQCRl3\nqdimQDhMUpnKka94BdjbVmtKedQ4zDuKH18DjnIa/IsKOSgnPkg3oOrDPqHWq2kY\nRRgfivivWBYJCJKRMV0DBP52RlPMh9G/bkc+nenHZsxlaESVc0Oxi/HUX1KOJGw=\n=57zz\n-----END PGP SIGNATURE-----\n", - "payload": "tree 1188cf0735c4501d074e3e0a6013624f1a030530\nparent 53a62cf2b06ea58973a7880096d959bfc42677d6\nauthor itchyny 1691072392 +0900\ncommitter GitHub 1691072392 +0900\n\nFix crash on numeric comparison (ref #2804) (#2818)\n\n" - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/949d38e6dc7330712b50697d7fe833eec85dede1", - "html_url": "https://github.com/jqlang/jq/commit/949d38e6dc7330712b50697d7fe833eec85dede1", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/949d38e6dc7330712b50697d7fe833eec85dede1/comments", - "author": { - "login": "itchyny", - "id": 375258, - "node_id": "MDQ6VXNlcjM3NTI1OA==", - "avatar_url": "https://avatars.githubusercontent.com/u/375258?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/itchyny", - "html_url": "https://github.com/itchyny", - "followers_url": "https://api.github.com/users/itchyny/followers", - "following_url": "https://api.github.com/users/itchyny/following{/other_user}", - "gists_url": "https://api.github.com/users/itchyny/gists{/gist_id}", - "starred_url": "https://api.github.com/users/itchyny/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/itchyny/subscriptions", - "organizations_url": "https://api.github.com/users/itchyny/orgs", - "repos_url": "https://api.github.com/users/itchyny/repos", - "events_url": "https://api.github.com/users/itchyny/events{/privacy}", - "received_events_url": "https://api.github.com/users/itchyny/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "web-flow", - "id": 19864447, - "node_id": "MDQ6VXNlcjE5ODY0NDQ3", - "avatar_url": "https://avatars.githubusercontent.com/u/19864447?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/web-flow", - "html_url": "https://github.com/web-flow", - "followers_url": "https://api.github.com/users/web-flow/followers", - "following_url": "https://api.github.com/users/web-flow/following{/other_user}", - "gists_url": "https://api.github.com/users/web-flow/gists{/gist_id}", - "starred_url": "https://api.github.com/users/web-flow/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/web-flow/subscriptions", - "organizations_url": "https://api.github.com/users/web-flow/orgs", - "repos_url": "https://api.github.com/users/web-flow/repos", - "events_url": "https://api.github.com/users/web-flow/events{/privacy}", - "received_events_url": "https://api.github.com/users/web-flow/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "53a62cf2b06ea58973a7880096d959bfc42677d6", - "url": "https://api.github.com/repos/jqlang/jq/commits/53a62cf2b06ea58973a7880096d959bfc42677d6", - "html_url": "https://github.com/jqlang/jq/commit/53a62cf2b06ea58973a7880096d959bfc42677d6" - } - ] - }, - { - "sha": "53a62cf2b06ea58973a7880096d959bfc42677d6", - "node_id": "C_kwDOAE3WVdoAKDUzYTYyY2YyYjA2ZWE1ODk3M2E3ODgwMDk2ZDk1OWJmYzQyNjc3ZDY", - "commit": { - "author": { - "name": "Owen Ou", - "email": "169064+owenthereal@users.noreply.github.com", - "date": "2023-08-03T13:27:09Z" - }, - "committer": { - "name": "GitHub", - "email": "noreply@github.com", - "date": "2023-08-03T13:27:09Z" - }, - "message": "Improve README to be more structural and more readable (#2814)", - "tree": { - "sha": "3e416ee944cdcb4a76a9d30715b9d1ae2a3488c7", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/3e416ee944cdcb4a76a9d30715b9d1ae2a3488c7" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/53a62cf2b06ea58973a7880096d959bfc42677d6", - "comment_count": 0, - "verification": { - "verified": true, - "reason": "valid", - "signature": "-----BEGIN PGP SIGNATURE-----\n\nwsBcBAABCAAQBQJky6stCRBK7hj4Ov3rIwAAya8IAGDEGuo13W6I2jbt24nVzdLV\npLJiuT6nn2b0EkQJfQV7orldaCpRESJve29oF78/XT7Oa7iE+xQob9kzstOyyFSL\nSrn8VkHk8XIv8DNLgGg1LXUkf/oDSFlMYqTWmNsPWjlZDvUxZTkHFr0JXFAxfeJl\nbUrYw6ezZmqvda4rbNalw7Oqsf/+yE6fpEsLnmPE7AWR/vLVb3wU6xTwKNnQneyO\ntaZs2bzvS1Sk4FHyOO2skjMKhyG/dq3+TMohXVv+pysDK2aGLpVfdi2X9N5d9lEG\nCP8u/ofBmHGwaY6TEtjTpnzc+DNNNhGjUSCOc554vc8lqNR1qUuiOZD6rCI5rTM=\n=JpsW\n-----END PGP SIGNATURE-----\n", - "payload": "tree 3e416ee944cdcb4a76a9d30715b9d1ae2a3488c7\nparent ff4bf68b29a4bf75387bc1918e49937758509e78\nauthor Owen Ou <169064+owenthereal@users.noreply.github.com> 1691069229 -0700\ncommitter GitHub 1691069229 +0900\n\nImprove README to be more structural and more readable (#2814)\n\n" - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/53a62cf2b06ea58973a7880096d959bfc42677d6", - "html_url": "https://github.com/jqlang/jq/commit/53a62cf2b06ea58973a7880096d959bfc42677d6", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/53a62cf2b06ea58973a7880096d959bfc42677d6/comments", - "author": { - "login": "owenthereal", - "id": 169064, - "node_id": "MDQ6VXNlcjE2OTA2NA==", - "avatar_url": "https://avatars.githubusercontent.com/u/169064?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/owenthereal", - "html_url": "https://github.com/owenthereal", - "followers_url": "https://api.github.com/users/owenthereal/followers", - "following_url": "https://api.github.com/users/owenthereal/following{/other_user}", - "gists_url": "https://api.github.com/users/owenthereal/gists{/gist_id}", - "starred_url": "https://api.github.com/users/owenthereal/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/owenthereal/subscriptions", - "organizations_url": "https://api.github.com/users/owenthereal/orgs", - "repos_url": "https://api.github.com/users/owenthereal/repos", - "events_url": "https://api.github.com/users/owenthereal/events{/privacy}", - "received_events_url": "https://api.github.com/users/owenthereal/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "web-flow", - "id": 19864447, - "node_id": "MDQ6VXNlcjE5ODY0NDQ3", - "avatar_url": "https://avatars.githubusercontent.com/u/19864447?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/web-flow", - "html_url": "https://github.com/web-flow", - "followers_url": "https://api.github.com/users/web-flow/followers", - "following_url": "https://api.github.com/users/web-flow/following{/other_user}", - "gists_url": "https://api.github.com/users/web-flow/gists{/gist_id}", - "starred_url": "https://api.github.com/users/web-flow/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/web-flow/subscriptions", - "organizations_url": "https://api.github.com/users/web-flow/orgs", - "repos_url": "https://api.github.com/users/web-flow/repos", - "events_url": "https://api.github.com/users/web-flow/events{/privacy}", - "received_events_url": "https://api.github.com/users/web-flow/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "ff4bf68b29a4bf75387bc1918e49937758509e78", - "url": "https://api.github.com/repos/jqlang/jq/commits/ff4bf68b29a4bf75387bc1918e49937758509e78", - "html_url": "https://github.com/jqlang/jq/commit/ff4bf68b29a4bf75387bc1918e49937758509e78" - } - ] - }, - { - "sha": "ff4bf68b29a4bf75387bc1918e49937758509e78", - "node_id": "C_kwDOAE3WVdoAKGZmNGJmNjhiMjlhNGJmNzUzODdiYzE5MThlNDk5Mzc3NTg1MDllNzg", - "commit": { - "author": { - "name": "Nicolas Williams", - "email": "nico@cryptonector.com", - "date": "2023-07-31T22:30:35Z" - }, - "committer": { - "name": "Nico Williams", - "email": "nico@cryptonector.com", - "date": "2023-08-02T17:19:19Z" - }, - "message": "Enable stack protection (CI release executables)", - "tree": { - "sha": "a085a715dbdfbe1181857f7aa3f7bf3aaf596227", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/a085a715dbdfbe1181857f7aa3f7bf3aaf596227" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/ff4bf68b29a4bf75387bc1918e49937758509e78", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/ff4bf68b29a4bf75387bc1918e49937758509e78", - "html_url": "https://github.com/jqlang/jq/commit/ff4bf68b29a4bf75387bc1918e49937758509e78", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/ff4bf68b29a4bf75387bc1918e49937758509e78/comments", - "author": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "fd0d475694bdaf5261340aff9a6a4437b04124dc", - "url": "https://api.github.com/repos/jqlang/jq/commits/fd0d475694bdaf5261340aff9a6a4437b04124dc", - "html_url": "https://github.com/jqlang/jq/commit/fd0d475694bdaf5261340aff9a6a4437b04124dc" - } - ] - }, - { - "sha": "fd0d475694bdaf5261340aff9a6a4437b04124dc", - "node_id": "C_kwDOAE3WVdoAKGZkMGQ0NzU2OTRiZGFmNTI2MTM0MGFmZjlhNmE0NDM3YjA0MTI0ZGM", - "commit": { - "author": { - "name": "itchyny", - "email": "itchyny@cybozu.co.jp", - "date": "2023-08-02T13:33:09Z" - }, - "committer": { - "name": "itchyny", - "email": "itchyny@cybozu.co.jp", - "date": "2023-08-02T13:33:09Z" - }, - "message": "Fix a test case added in #2790", - "tree": { - "sha": "67735c55391318b73c8f2e6eef7de53c9303841c", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/67735c55391318b73c8f2e6eef7de53c9303841c" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/fd0d475694bdaf5261340aff9a6a4437b04124dc", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/fd0d475694bdaf5261340aff9a6a4437b04124dc", - "html_url": "https://github.com/jqlang/jq/commit/fd0d475694bdaf5261340aff9a6a4437b04124dc", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/fd0d475694bdaf5261340aff9a6a4437b04124dc/comments", - "author": { - "login": "itchyny", - "id": 375258, - "node_id": "MDQ6VXNlcjM3NTI1OA==", - "avatar_url": "https://avatars.githubusercontent.com/u/375258?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/itchyny", - "html_url": "https://github.com/itchyny", - "followers_url": "https://api.github.com/users/itchyny/followers", - "following_url": "https://api.github.com/users/itchyny/following{/other_user}", - "gists_url": "https://api.github.com/users/itchyny/gists{/gist_id}", - "starred_url": "https://api.github.com/users/itchyny/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/itchyny/subscriptions", - "organizations_url": "https://api.github.com/users/itchyny/orgs", - "repos_url": "https://api.github.com/users/itchyny/repos", - "events_url": "https://api.github.com/users/itchyny/events{/privacy}", - "received_events_url": "https://api.github.com/users/itchyny/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "itchyny", - "id": 375258, - "node_id": "MDQ6VXNlcjM3NTI1OA==", - "avatar_url": "https://avatars.githubusercontent.com/u/375258?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/itchyny", - "html_url": "https://github.com/itchyny", - "followers_url": "https://api.github.com/users/itchyny/followers", - "following_url": "https://api.github.com/users/itchyny/following{/other_user}", - "gists_url": "https://api.github.com/users/itchyny/gists{/gist_id}", - "starred_url": "https://api.github.com/users/itchyny/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/itchyny/subscriptions", - "organizations_url": "https://api.github.com/users/itchyny/orgs", - "repos_url": "https://api.github.com/users/itchyny/repos", - "events_url": "https://api.github.com/users/itchyny/events{/privacy}", - "received_events_url": "https://api.github.com/users/itchyny/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "680baeffeb7983e7570b5e68db07fe47f94db8c7", - "url": "https://api.github.com/repos/jqlang/jq/commits/680baeffeb7983e7570b5e68db07fe47f94db8c7", - "html_url": "https://github.com/jqlang/jq/commit/680baeffeb7983e7570b5e68db07fe47f94db8c7" - } - ] - }, - { - "sha": "680baeffeb7983e7570b5e68db07fe47f94db8c7", - "node_id": "C_kwDOAE3WVdoAKDY4MGJhZWZmZWI3OTgzZTc1NzBiNWU2OGRiMDdmZTQ3Zjk0ZGI4Yzc", - "commit": { - "author": { - "name": "itchyny", - "email": "itchyny@cybozu.co.jp", - "date": "2023-08-01T00:06:12Z" - }, - "committer": { - "name": "Nico Williams", - "email": "nico@cryptonector.com", - "date": "2023-08-02T05:32:32Z" - }, - "message": "Fix rounding small (but not too small) numbers to zero on calculation\n\nCo-authored-by: Leonid S. Usov ", - "tree": { - "sha": "e560115131c384d1b8b74f32a2abd322a46585bd", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/e560115131c384d1b8b74f32a2abd322a46585bd" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/680baeffeb7983e7570b5e68db07fe47f94db8c7", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/680baeffeb7983e7570b5e68db07fe47f94db8c7", - "html_url": "https://github.com/jqlang/jq/commit/680baeffeb7983e7570b5e68db07fe47f94db8c7", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/680baeffeb7983e7570b5e68db07fe47f94db8c7/comments", - "author": { - "login": "itchyny", - "id": 375258, - "node_id": "MDQ6VXNlcjM3NTI1OA==", - "avatar_url": "https://avatars.githubusercontent.com/u/375258?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/itchyny", - "html_url": "https://github.com/itchyny", - "followers_url": "https://api.github.com/users/itchyny/followers", - "following_url": "https://api.github.com/users/itchyny/following{/other_user}", - "gists_url": "https://api.github.com/users/itchyny/gists{/gist_id}", - "starred_url": "https://api.github.com/users/itchyny/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/itchyny/subscriptions", - "organizations_url": "https://api.github.com/users/itchyny/orgs", - "repos_url": "https://api.github.com/users/itchyny/repos", - "events_url": "https://api.github.com/users/itchyny/events{/privacy}", - "received_events_url": "https://api.github.com/users/itchyny/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "27a4d5757e42d9653585eeddda78e8d313bad194", - "url": "https://api.github.com/repos/jqlang/jq/commits/27a4d5757e42d9653585eeddda78e8d313bad194", - "html_url": "https://github.com/jqlang/jq/commit/27a4d5757e42d9653585eeddda78e8d313bad194" - } - ] - }, - { - "sha": "27a4d5757e42d9653585eeddda78e8d313bad194", - "node_id": "C_kwDOAE3WVdoAKDI3YTRkNTc1N2U0MmQ5NjUzNTg1ZWVkZGRhNzhlOGQzMTNiYWQxOTQ", - "commit": { - "author": { - "name": "Nicolas Williams", - "email": "nico@cryptonector.com", - "date": "2023-07-29T18:44:14Z" - }, - "committer": { - "name": "Nico Williams", - "email": "nico@cryptonector.com", - "date": "2023-08-02T04:06:01Z" - }, - "message": "Require a main program (fix #2785)", - "tree": { - "sha": "6ab7361f58b7316d1546b1d344e6f035015b2afb", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/6ab7361f58b7316d1546b1d344e6f035015b2afb" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/27a4d5757e42d9653585eeddda78e8d313bad194", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/27a4d5757e42d9653585eeddda78e8d313bad194", - "html_url": "https://github.com/jqlang/jq/commit/27a4d5757e42d9653585eeddda78e8d313bad194", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/27a4d5757e42d9653585eeddda78e8d313bad194/comments", - "author": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "044b38595cc2d6670fed510ecba9df87f6b39e1b", - "url": "https://api.github.com/repos/jqlang/jq/commits/044b38595cc2d6670fed510ecba9df87f6b39e1b", - "html_url": "https://github.com/jqlang/jq/commit/044b38595cc2d6670fed510ecba9df87f6b39e1b" - } - ] - }, - { - "sha": "044b38595cc2d6670fed510ecba9df87f6b39e1b", - "node_id": "C_kwDOAE3WVdoAKDA0NGIzODU5NWNjMmQ2NjcwZmVkNTEwZWNiYTlkZjg3ZjZiMzllMWI", - "commit": { - "author": { - "name": "pkoppstein", - "email": "pkoppstein@gmail.com", - "date": "2023-08-01T23:38:27Z" - }, - "committer": { - "name": "GitHub", - "email": "noreply@github.com", - "date": "2023-08-01T23:38:27Z" - }, - "message": "NEWS.md - sub and gsub (#2809)", - "tree": { - "sha": "cd92f2151c07c2571cbbb14748b0cb6636be0581", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/cd92f2151c07c2571cbbb14748b0cb6636be0581" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/044b38595cc2d6670fed510ecba9df87f6b39e1b", - "comment_count": 0, - "verification": { - "verified": true, - "reason": "valid", - "signature": "-----BEGIN PGP SIGNATURE-----\n\nwsBcBAABCAAQBQJkyZdzCRBK7hj4Ov3rIwAASCYIAC+ZhrLwwrq3yujdfcImRkz3\nUoMO/fsG1V826JREkMxFvLJF5Ej5HVE1Ukt9YAy5EOYiA5q/qOdYluNMGAhy1Iqc\nk+s6l8iwsLpsxz/KTe5I+mgUbcH0gpCmS6eYoLsRS/X7u7wmpx1HWMk24R6k4o/T\nT3Zl+4JDGHI/WK8svQ2YFQZ9m+0F6AWWQFSiWRZ7TUUfT2b95m9hDqPbguGhMjMh\nmmBl+u7xz5E8aYjZk+A54aEeJ65q/jo0uGA3Ur6SfjeMUBJdIQ4FagHH5d1pUiTa\nWo7632uD9Qm83losqQGI2NLmatNS9r8XHvpFR4X2z50WZU9tHVt50WMRn1LBeK4=\n=SqkJ\n-----END PGP SIGNATURE-----\n", - "payload": "tree cd92f2151c07c2571cbbb14748b0cb6636be0581\nparent 161ab0402b0ea1f694a47946df4ca9083183f32e\nauthor pkoppstein 1690933107 -0400\ncommitter GitHub 1690933107 +0900\n\nNEWS.md - sub and gsub (#2809)\n\n" - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/044b38595cc2d6670fed510ecba9df87f6b39e1b", - "html_url": "https://github.com/jqlang/jq/commit/044b38595cc2d6670fed510ecba9df87f6b39e1b", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/044b38595cc2d6670fed510ecba9df87f6b39e1b/comments", - "author": { - "login": "pkoppstein", - "id": 172847, - "node_id": "MDQ6VXNlcjE3Mjg0Nw==", - "avatar_url": "https://avatars.githubusercontent.com/u/172847?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/pkoppstein", - "html_url": "https://github.com/pkoppstein", - "followers_url": "https://api.github.com/users/pkoppstein/followers", - "following_url": "https://api.github.com/users/pkoppstein/following{/other_user}", - "gists_url": "https://api.github.com/users/pkoppstein/gists{/gist_id}", - "starred_url": "https://api.github.com/users/pkoppstein/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/pkoppstein/subscriptions", - "organizations_url": "https://api.github.com/users/pkoppstein/orgs", - "repos_url": "https://api.github.com/users/pkoppstein/repos", - "events_url": "https://api.github.com/users/pkoppstein/events{/privacy}", - "received_events_url": "https://api.github.com/users/pkoppstein/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "web-flow", - "id": 19864447, - "node_id": "MDQ6VXNlcjE5ODY0NDQ3", - "avatar_url": "https://avatars.githubusercontent.com/u/19864447?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/web-flow", - "html_url": "https://github.com/web-flow", - "followers_url": "https://api.github.com/users/web-flow/followers", - "following_url": "https://api.github.com/users/web-flow/following{/other_user}", - "gists_url": "https://api.github.com/users/web-flow/gists{/gist_id}", - "starred_url": "https://api.github.com/users/web-flow/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/web-flow/subscriptions", - "organizations_url": "https://api.github.com/users/web-flow/orgs", - "repos_url": "https://api.github.com/users/web-flow/repos", - "events_url": "https://api.github.com/users/web-flow/events{/privacy}", - "received_events_url": "https://api.github.com/users/web-flow/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "161ab0402b0ea1f694a47946df4ca9083183f32e", - "url": "https://api.github.com/repos/jqlang/jq/commits/161ab0402b0ea1f694a47946df4ca9083183f32e", - "html_url": "https://github.com/jqlang/jq/commit/161ab0402b0ea1f694a47946df4ca9083183f32e" - } - ] - }, - { - "sha": "161ab0402b0ea1f694a47946df4ca9083183f32e", - "node_id": "C_kwDOAE3WVdoAKDE2MWFiMDQwMmIwZWExZjY5NGE0Nzk0NmRmNGNhOTA4MzE4M2YzMmU", - "commit": { - "author": { - "name": "Owen Ou", - "email": "169064+owenthereal@users.noreply.github.com", - "date": "2023-08-01T14:32:52Z" - }, - "committer": { - "name": "GitHub", - "email": "noreply@github.com", - "date": "2023-08-01T14:32:52Z" - }, - "message": "Fix typo in CI env vars for Linux build (#2810)\n\nFor some reason, the env vars are set correctly without refering the variable in `matrix` case-sensitvely:\r\n\r\n```\r\n2023-08-01T05:05:58.4626090Z env:\r\n2023-08-01T05:05:58.4626367Z AR: arm-linux-gnueabihf-ar\r\n2023-08-01T05:05:58.4626690Z CHOST: arm-linux-gnueabihf\r\n2023-08-01T05:05:58.4626961Z CC: arm-linux-gnueabihf-gcc\r\n2023-08-01T05:05:58.4627332Z CPP: arm-linux-gnueabihf-cpp\r\n2023-08-01T05:05:58.4627662Z CXX: arm-linux-gnueabihf-g++\r\n```\r\n\r\nFor clarify, we update them to match the definitions. Besides, `CXX` is\r\nnot needed and removed.", - "tree": { - "sha": "ca4c74940607ca719e7967ea94d3224960ed5b78", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/ca4c74940607ca719e7967ea94d3224960ed5b78" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/161ab0402b0ea1f694a47946df4ca9083183f32e", - "comment_count": 0, - "verification": { - "verified": true, - "reason": "valid", - "signature": "-----BEGIN PGP SIGNATURE-----\n\nwsBcBAABCAAQBQJkyReUCRBK7hj4Ov3rIwAAa2cIALHmt5BfYyyBRdOpvXNA1rmK\nBwpOHuaz6MvwgYYZXWTQLN8koULqs8RFL9wBEdWc7u+WL8ojLGsO15PVouCxWwoY\nQiQqOWWMiJP3TkhFJvFMiNfpQucg2Fr5ruaMa4zOXhn8F5WEIPEzxmbP2VlzCMA0\nYzzJWtqhyxJGiRgyVIuWoGZ+nHO7TOnrib+6RjdBf4RZn5zCT2Oh4h2OVGcyAEm2\noFPiRc8DP0FawDxT20yZ+rzXHPRhnyrIAUJr5QuFhnCLkaE5vLgTpPuABnZdxL01\na5OiJcdxL+67jCsSwW+vcqZEWAOnqZAIcLYnxGsy48g6fgtlRCAACZxX1kxOrno=\n=NutM\n-----END PGP SIGNATURE-----\n", - "payload": "tree ca4c74940607ca719e7967ea94d3224960ed5b78\nparent 29698118c51d2f04ccdacb3518b0c86551970a7a\nauthor Owen Ou <169064+owenthereal@users.noreply.github.com> 1690900372 -0700\ncommitter GitHub 1690900372 -0700\n\nFix typo in CI env vars for Linux build (#2810)\n\nFor some reason, the env vars are set correctly without refering the variable in `matrix` case-sensitvely:\r\n\r\n```\r\n2023-08-01T05:05:58.4626090Z env:\r\n2023-08-01T05:05:58.4626367Z AR: arm-linux-gnueabihf-ar\r\n2023-08-01T05:05:58.4626690Z CHOST: arm-linux-gnueabihf\r\n2023-08-01T05:05:58.4626961Z CC: arm-linux-gnueabihf-gcc\r\n2023-08-01T05:05:58.4627332Z CPP: arm-linux-gnueabihf-cpp\r\n2023-08-01T05:05:58.4627662Z CXX: arm-linux-gnueabihf-g++\r\n```\r\n\r\nFor clarify, we update them to match the definitions. Besides, `CXX` is\r\nnot needed and removed." - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/161ab0402b0ea1f694a47946df4ca9083183f32e", - "html_url": "https://github.com/jqlang/jq/commit/161ab0402b0ea1f694a47946df4ca9083183f32e", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/161ab0402b0ea1f694a47946df4ca9083183f32e/comments", - "author": { - "login": "owenthereal", - "id": 169064, - "node_id": "MDQ6VXNlcjE2OTA2NA==", - "avatar_url": "https://avatars.githubusercontent.com/u/169064?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/owenthereal", - "html_url": "https://github.com/owenthereal", - "followers_url": "https://api.github.com/users/owenthereal/followers", - "following_url": "https://api.github.com/users/owenthereal/following{/other_user}", - "gists_url": "https://api.github.com/users/owenthereal/gists{/gist_id}", - "starred_url": "https://api.github.com/users/owenthereal/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/owenthereal/subscriptions", - "organizations_url": "https://api.github.com/users/owenthereal/orgs", - "repos_url": "https://api.github.com/users/owenthereal/repos", - "events_url": "https://api.github.com/users/owenthereal/events{/privacy}", - "received_events_url": "https://api.github.com/users/owenthereal/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "web-flow", - "id": 19864447, - "node_id": "MDQ6VXNlcjE5ODY0NDQ3", - "avatar_url": "https://avatars.githubusercontent.com/u/19864447?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/web-flow", - "html_url": "https://github.com/web-flow", - "followers_url": "https://api.github.com/users/web-flow/followers", - "following_url": "https://api.github.com/users/web-flow/following{/other_user}", - "gists_url": "https://api.github.com/users/web-flow/gists{/gist_id}", - "starred_url": "https://api.github.com/users/web-flow/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/web-flow/subscriptions", - "organizations_url": "https://api.github.com/users/web-flow/orgs", - "repos_url": "https://api.github.com/users/web-flow/repos", - "events_url": "https://api.github.com/users/web-flow/events{/privacy}", - "received_events_url": "https://api.github.com/users/web-flow/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "29698118c51d2f04ccdacb3518b0c86551970a7a", - "url": "https://api.github.com/repos/jqlang/jq/commits/29698118c51d2f04ccdacb3518b0c86551970a7a", - "html_url": "https://github.com/jqlang/jq/commit/29698118c51d2f04ccdacb3518b0c86551970a7a" - } - ] - }, - { - "sha": "29698118c51d2f04ccdacb3518b0c86551970a7a", - "node_id": "C_kwDOAE3WVdoAKDI5Njk4MTE4YzUxZDJmMDRjY2RhY2IzNTE4YjBjODY1NTE5NzBhN2E", - "commit": { - "author": { - "name": "Nicolas Williams", - "email": "nico@cryptonector.com", - "date": "2023-08-01T04:10:41Z" - }, - "committer": { - "name": "Nico Williams", - "email": "nico@cryptonector.com", - "date": "2023-08-01T04:59:09Z" - }, - "message": "Update download page with new release key", - "tree": { - "sha": "b982054971ecadbb35efad0a42229f2cbe56e7a9", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/b982054971ecadbb35efad0a42229f2cbe56e7a9" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/29698118c51d2f04ccdacb3518b0c86551970a7a", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/29698118c51d2f04ccdacb3518b0c86551970a7a", - "html_url": "https://github.com/jqlang/jq/commit/29698118c51d2f04ccdacb3518b0c86551970a7a", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/29698118c51d2f04ccdacb3518b0c86551970a7a/comments", - "author": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "96263f2e4b490714a069ac5b54ccd3ca52067a1a", - "url": "https://api.github.com/repos/jqlang/jq/commits/96263f2e4b490714a069ac5b54ccd3ca52067a1a", - "html_url": "https://github.com/jqlang/jq/commit/96263f2e4b490714a069ac5b54ccd3ca52067a1a" - } - ] - }, - { - "sha": "96263f2e4b490714a069ac5b54ccd3ca52067a1a", - "node_id": "C_kwDOAE3WVdoAKDk2MjYzZjJlNGI0OTA3MTRhMDY5YWM1YjU0Y2NkM2NhNTIwNjdhMWE", - "commit": { - "author": { - "name": "Emanuele Torre", - "email": "torreemanuele6@gmail.com", - "date": "2023-08-01T02:56:58Z" - }, - "committer": { - "name": "Nico Williams", - "email": "nico@cryptonector.com", - "date": "2023-08-01T04:16:02Z" - }, - "message": "Don't unnecessarily ignore missing-field-initializers warnings", - "tree": { - "sha": "3ee9328d7d4f2864af7ec5e8a24c24679224f832", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/3ee9328d7d4f2864af7ec5e8a24c24679224f832" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/96263f2e4b490714a069ac5b54ccd3ca52067a1a", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/96263f2e4b490714a069ac5b54ccd3ca52067a1a", - "html_url": "https://github.com/jqlang/jq/commit/96263f2e4b490714a069ac5b54ccd3ca52067a1a", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/96263f2e4b490714a069ac5b54ccd3ca52067a1a/comments", - "author": { - "login": "emanuele6", - "id": 20175435, - "node_id": "MDQ6VXNlcjIwMTc1NDM1", - "avatar_url": "https://avatars.githubusercontent.com/u/20175435?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/emanuele6", - "html_url": "https://github.com/emanuele6", - "followers_url": "https://api.github.com/users/emanuele6/followers", - "following_url": "https://api.github.com/users/emanuele6/following{/other_user}", - "gists_url": "https://api.github.com/users/emanuele6/gists{/gist_id}", - "starred_url": "https://api.github.com/users/emanuele6/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/emanuele6/subscriptions", - "organizations_url": "https://api.github.com/users/emanuele6/orgs", - "repos_url": "https://api.github.com/users/emanuele6/repos", - "events_url": "https://api.github.com/users/emanuele6/events{/privacy}", - "received_events_url": "https://api.github.com/users/emanuele6/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "90a6b2d9e6b88b2ec9be301d832f5c02e1311d86", - "url": "https://api.github.com/repos/jqlang/jq/commits/90a6b2d9e6b88b2ec9be301d832f5c02e1311d86", - "html_url": "https://github.com/jqlang/jq/commit/90a6b2d9e6b88b2ec9be301d832f5c02e1311d86" - } - ] - }, - { - "sha": "90a6b2d9e6b88b2ec9be301d832f5c02e1311d86", - "node_id": "C_kwDOAE3WVdoAKDkwYTZiMmQ5ZTZiODhiMmVjOWJlMzAxZDgzMmY1YzAyZTEzMTFkODY", - "commit": { - "author": { - "name": "Nicolas Williams", - "email": "nico@cryptonector.com", - "date": "2023-08-01T01:04:32Z" - }, - "committer": { - "name": "Nicolas Williams", - "email": "nico@cryptonector.com", - "date": "2023-08-01T01:04:41Z" - }, - "message": "Re-generate src/parser.[ch]", - "tree": { - "sha": "ec884a655a52fcd3530a52297627b29d8cc3f26c", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/ec884a655a52fcd3530a52297627b29d8cc3f26c" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/90a6b2d9e6b88b2ec9be301d832f5c02e1311d86", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/90a6b2d9e6b88b2ec9be301d832f5c02e1311d86", - "html_url": "https://github.com/jqlang/jq/commit/90a6b2d9e6b88b2ec9be301d832f5c02e1311d86", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/90a6b2d9e6b88b2ec9be301d832f5c02e1311d86/comments", - "author": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "4d4c17ca6a9e11fc49e98f5d8fa0ac4da34fb298", - "url": "https://api.github.com/repos/jqlang/jq/commits/4d4c17ca6a9e11fc49e98f5d8fa0ac4da34fb298", - "html_url": "https://github.com/jqlang/jq/commit/4d4c17ca6a9e11fc49e98f5d8fa0ac4da34fb298" - } - ] - }, - { - "sha": "4d4c17ca6a9e11fc49e98f5d8fa0ac4da34fb298", - "node_id": "C_kwDOAE3WVdoAKDRkNGMxN2NhNmE5ZTExZmM0OWU5OGY1ZDhmYTBhYzRkYTM0ZmIyOTg", - "commit": { - "author": { - "name": "pkoppstein", - "email": "pkoppstein@gmail.com", - "date": "2023-07-31T22:54:21Z" - }, - "committer": { - "name": "GitHub", - "email": "noreply@github.com", - "date": "2023-07-31T22:54:21Z" - }, - "message": "Simple and efficient implementation of walk/1 (#2795)", - "tree": { - "sha": "7c7c3831cb45b26329bba1a9e569627ba74dc961", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/7c7c3831cb45b26329bba1a9e569627ba74dc961" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/4d4c17ca6a9e11fc49e98f5d8fa0ac4da34fb298", - "comment_count": 0, - "verification": { - "verified": true, - "reason": "valid", - "signature": "-----BEGIN PGP SIGNATURE-----\n\nwsBcBAABCAAQBQJkyDudCRBK7hj4Ov3rIwAAg1kIAC3GdjAn/ItpjYzSCZhYgGeT\nli/x8h0wHKlDjxVAuLsAct8vby5aZdS34Hmeqm2AFOGPLeS1QhB+aMpZDEYbHbmU\nK2uyx5WGpsEzOzpFWz6m8pdlspkWPSpoqIOsmNyKd9aJELoetl1XTSkSgptm1gZL\nVdCKo1DM3Q7qtmUz5E/IiB/pbIneRWGBXqO0ug4nnFCuLzOeZ53w4cB/EOGUa+fq\nFnQPr+VVJdveuGUXKsBbm+IMgsGOwWa2NfkbfAF4oTF795l/lNeXO1FjNxQ/jUsF\nvhNnKkGFL4dvstuMBKo5JnpZQM+B58ZJqZcYoAVRBlBBB+9Pocv28HrD+/9Jj4Q=\n=HTzB\n-----END PGP SIGNATURE-----\n", - "payload": "tree 7c7c3831cb45b26329bba1a9e569627ba74dc961\nparent 0f80921268edcc3d502e6d84612ba71fed6b0947\nauthor pkoppstein 1690844061 -0400\ncommitter GitHub 1690844061 +0900\n\nSimple and efficient implementation of walk/1 (#2795)\n\n" - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/4d4c17ca6a9e11fc49e98f5d8fa0ac4da34fb298", - "html_url": "https://github.com/jqlang/jq/commit/4d4c17ca6a9e11fc49e98f5d8fa0ac4da34fb298", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/4d4c17ca6a9e11fc49e98f5d8fa0ac4da34fb298/comments", - "author": { - "login": "pkoppstein", - "id": 172847, - "node_id": "MDQ6VXNlcjE3Mjg0Nw==", - "avatar_url": "https://avatars.githubusercontent.com/u/172847?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/pkoppstein", - "html_url": "https://github.com/pkoppstein", - "followers_url": "https://api.github.com/users/pkoppstein/followers", - "following_url": "https://api.github.com/users/pkoppstein/following{/other_user}", - "gists_url": "https://api.github.com/users/pkoppstein/gists{/gist_id}", - "starred_url": "https://api.github.com/users/pkoppstein/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/pkoppstein/subscriptions", - "organizations_url": "https://api.github.com/users/pkoppstein/orgs", - "repos_url": "https://api.github.com/users/pkoppstein/repos", - "events_url": "https://api.github.com/users/pkoppstein/events{/privacy}", - "received_events_url": "https://api.github.com/users/pkoppstein/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "web-flow", - "id": 19864447, - "node_id": "MDQ6VXNlcjE5ODY0NDQ3", - "avatar_url": "https://avatars.githubusercontent.com/u/19864447?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/web-flow", - "html_url": "https://github.com/web-flow", - "followers_url": "https://api.github.com/users/web-flow/followers", - "following_url": "https://api.github.com/users/web-flow/following{/other_user}", - "gists_url": "https://api.github.com/users/web-flow/gists{/gist_id}", - "starred_url": "https://api.github.com/users/web-flow/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/web-flow/subscriptions", - "organizations_url": "https://api.github.com/users/web-flow/orgs", - "repos_url": "https://api.github.com/users/web-flow/repos", - "events_url": "https://api.github.com/users/web-flow/events{/privacy}", - "received_events_url": "https://api.github.com/users/web-flow/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "0f80921268edcc3d502e6d84612ba71fed6b0947", - "url": "https://api.github.com/repos/jqlang/jq/commits/0f80921268edcc3d502e6d84612ba71fed6b0947", - "html_url": "https://github.com/jqlang/jq/commit/0f80921268edcc3d502e6d84612ba71fed6b0947" - } - ] - }, - { - "sha": "0f80921268edcc3d502e6d84612ba71fed6b0947", - "node_id": "C_kwDOAE3WVdoAKDBmODA5MjEyNjhlZGNjM2Q1MDJlNmQ4NDYxMmJhNzFmZWQ2YjA5NDc", - "commit": { - "author": { - "name": "itchyny", - "email": "itchyny@cybozu.co.jp", - "date": "2023-07-31T03:48:14Z" - }, - "committer": { - "name": "Nico Williams", - "email": "nico@cryptonector.com", - "date": "2023-07-31T20:39:13Z" - }, - "message": "Fix constant folding of division and reminder with zero divisor\n\nPreviously constant folding of zero division (e.x. 1/0) produces a\ncompile error. This was incorrectly implemented by checking if the\ndivision result is infinite, so produces wrong results compared to the\nquery where no constant folding is processed (e.x. 1e308/0.1). This\npatch delays the operation when the divisor is zero. This makes the\nresults more consistent, but changes the exit code on zero division from\n3 to 5. Also 0/0 now produces the zero division error, not NaN.\n\nThis patch also fixes the modulo operation. Previously constant folding\nlogic does not take care of the % operator, but now it folds if the both\ndividend and divisor are safe numbers to cast to the integer type, and\nthe divisor is not zero. This patch also fixes some code that relies on\nundefined cast behaviors in C. The modulo operation produces NaN if\neither the dividend or divisor is NaN.", - "tree": { - "sha": "40da8d84c1235bd94b5018a3fd015a60a7cda44f", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/40da8d84c1235bd94b5018a3fd015a60a7cda44f" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/0f80921268edcc3d502e6d84612ba71fed6b0947", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/0f80921268edcc3d502e6d84612ba71fed6b0947", - "html_url": "https://github.com/jqlang/jq/commit/0f80921268edcc3d502e6d84612ba71fed6b0947", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/0f80921268edcc3d502e6d84612ba71fed6b0947/comments", - "author": { - "login": "itchyny", - "id": 375258, - "node_id": "MDQ6VXNlcjM3NTI1OA==", - "avatar_url": "https://avatars.githubusercontent.com/u/375258?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/itchyny", - "html_url": "https://github.com/itchyny", - "followers_url": "https://api.github.com/users/itchyny/followers", - "following_url": "https://api.github.com/users/itchyny/following{/other_user}", - "gists_url": "https://api.github.com/users/itchyny/gists{/gist_id}", - "starred_url": "https://api.github.com/users/itchyny/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/itchyny/subscriptions", - "organizations_url": "https://api.github.com/users/itchyny/orgs", - "repos_url": "https://api.github.com/users/itchyny/repos", - "events_url": "https://api.github.com/users/itchyny/events{/privacy}", - "received_events_url": "https://api.github.com/users/itchyny/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "6716e23ae6d534db0d3f2af2d1610f17444fb5a9", - "url": "https://api.github.com/repos/jqlang/jq/commits/6716e23ae6d534db0d3f2af2d1610f17444fb5a9", - "html_url": "https://github.com/jqlang/jq/commit/6716e23ae6d534db0d3f2af2d1610f17444fb5a9" - } - ] - }, - { - "sha": "6716e23ae6d534db0d3f2af2d1610f17444fb5a9", - "node_id": "C_kwDOAE3WVdoAKDY3MTZlMjNhZTZkNTM0ZGIwZDNmMmFmMmQxNjEwZjE3NDQ0ZmI1YTk", - "commit": { - "author": { - "name": "Emanuele Torre", - "email": "torreemanuele6@gmail.com", - "date": "2023-07-31T19:56:15Z" - }, - "committer": { - "name": "Nico Williams", - "email": "nico@cryptonector.com", - "date": "2023-07-31T20:28:01Z" - }, - "message": "Declare cfunction.fptr as jv (*)() to avoid having to cast everywhere\n\nYou only need to specify the return type in a function pointer\ndeclaration in C.\n\nIf you use () in the declaration, the function pointer can be called\nwith any arguments, and the type of the arguments is decided for each\nfunction call based on the types of the arguments used for the call.\n(To declare a function pointer for a function with no arguments, you use\n`(void)'.)\n\nSince all the cfunction structs have a fptr that points to a functions\nthat return jv, not void, we can we can just declare cfunction.fptr as\njv (*)() and avoid having those annoying and technically not C-standard\ncompliant casts everywhere.", - "tree": { - "sha": "b2afefc6b28ed9831c0473861c49ab1f3c023b41", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/b2afefc6b28ed9831c0473861c49ab1f3c023b41" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/6716e23ae6d534db0d3f2af2d1610f17444fb5a9", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/6716e23ae6d534db0d3f2af2d1610f17444fb5a9", - "html_url": "https://github.com/jqlang/jq/commit/6716e23ae6d534db0d3f2af2d1610f17444fb5a9", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/6716e23ae6d534db0d3f2af2d1610f17444fb5a9/comments", - "author": { - "login": "emanuele6", - "id": 20175435, - "node_id": "MDQ6VXNlcjIwMTc1NDM1", - "avatar_url": "https://avatars.githubusercontent.com/u/20175435?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/emanuele6", - "html_url": "https://github.com/emanuele6", - "followers_url": "https://api.github.com/users/emanuele6/followers", - "following_url": "https://api.github.com/users/emanuele6/following{/other_user}", - "gists_url": "https://api.github.com/users/emanuele6/gists{/gist_id}", - "starred_url": "https://api.github.com/users/emanuele6/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/emanuele6/subscriptions", - "organizations_url": "https://api.github.com/users/emanuele6/orgs", - "repos_url": "https://api.github.com/users/emanuele6/repos", - "events_url": "https://api.github.com/users/emanuele6/events{/privacy}", - "received_events_url": "https://api.github.com/users/emanuele6/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "f61f842ad0b4585cc493868e83f17a91c9f1a53e", - "url": "https://api.github.com/repos/jqlang/jq/commits/f61f842ad0b4585cc493868e83f17a91c9f1a53e", - "html_url": "https://github.com/jqlang/jq/commit/f61f842ad0b4585cc493868e83f17a91c9f1a53e" - } - ] - }, - { - "sha": "f61f842ad0b4585cc493868e83f17a91c9f1a53e", - "node_id": "C_kwDOAE3WVdoAKGY2MWY4NDJhZDBiNDU4NWNjNDkzODY4ZTgzZjE3YTkxYzlmMWE1M2U", - "commit": { - "author": { - "name": "Mattias Wadman", - "email": "mattias.wadman@gmail.com", - "date": "2023-07-31T15:08:53Z" - }, - "committer": { - "name": "Emanuele Torre", - "email": "torreemanuele6@gmail.com", - "date": "2023-07-31T16:05:35Z" - }, - "message": "Massage --help text to use max 72 characters width", - "tree": { - "sha": "419afd0d956dc3a2f1c109156bdeeecd98023da7", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/419afd0d956dc3a2f1c109156bdeeecd98023da7" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/f61f842ad0b4585cc493868e83f17a91c9f1a53e", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/f61f842ad0b4585cc493868e83f17a91c9f1a53e", - "html_url": "https://github.com/jqlang/jq/commit/f61f842ad0b4585cc493868e83f17a91c9f1a53e", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/f61f842ad0b4585cc493868e83f17a91c9f1a53e/comments", - "author": { - "login": "wader", - "id": 185566, - "node_id": "MDQ6VXNlcjE4NTU2Ng==", - "avatar_url": "https://avatars.githubusercontent.com/u/185566?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/wader", - "html_url": "https://github.com/wader", - "followers_url": "https://api.github.com/users/wader/followers", - "following_url": "https://api.github.com/users/wader/following{/other_user}", - "gists_url": "https://api.github.com/users/wader/gists{/gist_id}", - "starred_url": "https://api.github.com/users/wader/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/wader/subscriptions", - "organizations_url": "https://api.github.com/users/wader/orgs", - "repos_url": "https://api.github.com/users/wader/repos", - "events_url": "https://api.github.com/users/wader/events{/privacy}", - "received_events_url": "https://api.github.com/users/wader/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "emanuele6", - "id": 20175435, - "node_id": "MDQ6VXNlcjIwMTc1NDM1", - "avatar_url": "https://avatars.githubusercontent.com/u/20175435?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/emanuele6", - "html_url": "https://github.com/emanuele6", - "followers_url": "https://api.github.com/users/emanuele6/followers", - "following_url": "https://api.github.com/users/emanuele6/following{/other_user}", - "gists_url": "https://api.github.com/users/emanuele6/gists{/gist_id}", - "starred_url": "https://api.github.com/users/emanuele6/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/emanuele6/subscriptions", - "organizations_url": "https://api.github.com/users/emanuele6/orgs", - "repos_url": "https://api.github.com/users/emanuele6/repos", - "events_url": "https://api.github.com/users/emanuele6/events{/privacy}", - "received_events_url": "https://api.github.com/users/emanuele6/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "69deec63e5de429b5c883a1a3c920eba8558cb41", - "url": "https://api.github.com/repos/jqlang/jq/commits/69deec63e5de429b5c883a1a3c920eba8558cb41", - "html_url": "https://github.com/jqlang/jq/commit/69deec63e5de429b5c883a1a3c920eba8558cb41" - } - ] - }, - { - "sha": "69deec63e5de429b5c883a1a3c920eba8558cb41", - "node_id": "C_kwDOAE3WVdoAKDY5ZGVlYzYzZTVkZTQyOWI1Yzg4M2ExYTNjOTIwZWJhODU1OGNiNDE", - "commit": { - "author": { - "name": "Nicolas Williams", - "email": "nico@cryptonector.com", - "date": "2023-07-31T15:00:49Z" - }, - "committer": { - "name": "Nico Williams", - "email": "nico@cryptonector.com", - "date": "2023-07-31T15:12:18Z" - }, - "message": "Add new release public key", - "tree": { - "sha": "0332f5e295b97af4dcbafa10f1fe6ff638c27bf9", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/0332f5e295b97af4dcbafa10f1fe6ff638c27bf9" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/69deec63e5de429b5c883a1a3c920eba8558cb41", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/69deec63e5de429b5c883a1a3c920eba8558cb41", - "html_url": "https://github.com/jqlang/jq/commit/69deec63e5de429b5c883a1a3c920eba8558cb41", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/69deec63e5de429b5c883a1a3c920eba8558cb41/comments", - "author": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "77c4c8afc57c2d5cb386b3cde943edee4174eab3", - "url": "https://api.github.com/repos/jqlang/jq/commits/77c4c8afc57c2d5cb386b3cde943edee4174eab3", - "html_url": "https://github.com/jqlang/jq/commit/77c4c8afc57c2d5cb386b3cde943edee4174eab3" - } - ] - }, - { - "sha": "77c4c8afc57c2d5cb386b3cde943edee4174eab3", - "node_id": "C_kwDOAE3WVdoAKDc3YzRjOGFmYzU3YzJkNWNiMzg2YjNjZGU5NDNlZGVlNDE3NGVhYjM", - "commit": { - "author": { - "name": "github-actions[bot]", - "email": "github-actions[bot]@users.noreply.github.com", - "date": "2023-07-31T03:31:35Z" - }, - "committer": { - "name": "Nico Williams", - "email": "nico@cryptonector.com", - "date": "2023-07-31T14:31:05Z" - }, - "message": "Update signatures of 1.7rc1", - "tree": { - "sha": "a22af68e4645e8346a6702c9967a041ce78dddc1", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/a22af68e4645e8346a6702c9967a041ce78dddc1" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/77c4c8afc57c2d5cb386b3cde943edee4174eab3", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/77c4c8afc57c2d5cb386b3cde943edee4174eab3", - "html_url": "https://github.com/jqlang/jq/commit/77c4c8afc57c2d5cb386b3cde943edee4174eab3", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/77c4c8afc57c2d5cb386b3cde943edee4174eab3/comments", - "author": { - "login": "github-actions[bot]", - "id": 41898282, - "node_id": "MDM6Qm90NDE4OTgyODI=", - "avatar_url": "https://avatars.githubusercontent.com/in/15368?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/github-actions%5Bbot%5D", - "html_url": "https://github.com/apps/github-actions", - "followers_url": "https://api.github.com/users/github-actions%5Bbot%5D/followers", - "following_url": "https://api.github.com/users/github-actions%5Bbot%5D/following{/other_user}", - "gists_url": "https://api.github.com/users/github-actions%5Bbot%5D/gists{/gist_id}", - "starred_url": "https://api.github.com/users/github-actions%5Bbot%5D/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/github-actions%5Bbot%5D/subscriptions", - "organizations_url": "https://api.github.com/users/github-actions%5Bbot%5D/orgs", - "repos_url": "https://api.github.com/users/github-actions%5Bbot%5D/repos", - "events_url": "https://api.github.com/users/github-actions%5Bbot%5D/events{/privacy}", - "received_events_url": "https://api.github.com/users/github-actions%5Bbot%5D/received_events", - "type": "Bot", - "site_admin": false - }, - "committer": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "c8e28da12973f8844ac0457e2db6ccd56286b34a", - "url": "https://api.github.com/repos/jqlang/jq/commits/c8e28da12973f8844ac0457e2db6ccd56286b34a", - "html_url": "https://github.com/jqlang/jq/commit/c8e28da12973f8844ac0457e2db6ccd56286b34a" - } - ] - }, - { - "sha": "c8e28da12973f8844ac0457e2db6ccd56286b34a", - "node_id": "C_kwDOAE3WVdoAKGM4ZTI4ZGExMjk3M2Y4ODQ0YWMwNDU3ZTJkYjZjY2Q1NjI4NmIzNGE", - "commit": { - "author": { - "name": "itchyny", - "email": "itchyny@cybozu.co.jp", - "date": "2023-07-31T00:52:52Z" - }, - "committer": { - "name": "GitHub", - "email": "noreply@github.com", - "date": "2023-07-31T00:52:52Z" - }, - "message": "Redesign website (#2628)\n\n* Bump up Bootstrap to v5.3.1, Bootstrap Icon to v1.10.5.\r\n* Use autoComplete.js to drop dependency on jQuery and typeahead.js.\r\n* Support dark mode.\r\n* New svg logo and icon with responsive color mode support.\r\n* Normalize section ids to lower kebab-case for easiness of linking.\r\n* Use relative paths for links for local development (--root /output).\r\n* Various markup cleanups and accessibility improvements.", - "tree": { - "sha": "614af32689cf652eb7446eb9dfa4f1d91a2f1c97", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/614af32689cf652eb7446eb9dfa4f1d91a2f1c97" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/c8e28da12973f8844ac0457e2db6ccd56286b34a", - "comment_count": 0, - "verification": { - "verified": true, - "reason": "valid", - "signature": "-----BEGIN PGP SIGNATURE-----\n\nwsBcBAABCAAQBQJkxwXkCRBK7hj4Ov3rIwAAlCsIAAvIuL5z8eW5rmVZxbb3uld8\nZ/YIDBvUr5KOcfi7gbXjkDuCYdrG9u//AYt05H/+QYDWZMBTGnHNec6Ny4sH2fw9\nQGGDBX4DEcxbpm98Zan24PAOi7Iswj56YsSO9hJboWdyBxKgfm5fr2QTGMOwaF6b\nE1F9dGd7+tGhbG9XWKTlCFGEsZkygg8c/IwUJsqTkssAec/kYA2PjzK6foP5oOIo\n/5FulkrNqX4AziHuwo6u7lOR4bryQCjVdFwQSHky22CPKBpRMV+aTijcigJ3W2uK\nLTervwn56YsRT7h79lP7Q55xUjTVljv/AWjRNZFNTb2Vckg/bzkjwjx6hxN1Nl8=\n=sCDf\n-----END PGP SIGNATURE-----\n", - "payload": "tree 614af32689cf652eb7446eb9dfa4f1d91a2f1c97\nparent 4af3f99728f924b327b6f455c52452ef0ca09e1a\nauthor itchyny 1690764772 +0900\ncommitter GitHub 1690764772 +0900\n\nRedesign website (#2628)\n\n* Bump up Bootstrap to v5.3.1, Bootstrap Icon to v1.10.5.\r\n* Use autoComplete.js to drop dependency on jQuery and typeahead.js.\r\n* Support dark mode.\r\n* New svg logo and icon with responsive color mode support.\r\n* Normalize section ids to lower kebab-case for easiness of linking.\r\n* Use relative paths for links for local development (--root /output).\r\n* Various markup cleanups and accessibility improvements." - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/c8e28da12973f8844ac0457e2db6ccd56286b34a", - "html_url": "https://github.com/jqlang/jq/commit/c8e28da12973f8844ac0457e2db6ccd56286b34a", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/c8e28da12973f8844ac0457e2db6ccd56286b34a/comments", - "author": { - "login": "itchyny", - "id": 375258, - "node_id": "MDQ6VXNlcjM3NTI1OA==", - "avatar_url": "https://avatars.githubusercontent.com/u/375258?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/itchyny", - "html_url": "https://github.com/itchyny", - "followers_url": "https://api.github.com/users/itchyny/followers", - "following_url": "https://api.github.com/users/itchyny/following{/other_user}", - "gists_url": "https://api.github.com/users/itchyny/gists{/gist_id}", - "starred_url": "https://api.github.com/users/itchyny/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/itchyny/subscriptions", - "organizations_url": "https://api.github.com/users/itchyny/orgs", - "repos_url": "https://api.github.com/users/itchyny/repos", - "events_url": "https://api.github.com/users/itchyny/events{/privacy}", - "received_events_url": "https://api.github.com/users/itchyny/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "web-flow", - "id": 19864447, - "node_id": "MDQ6VXNlcjE5ODY0NDQ3", - "avatar_url": "https://avatars.githubusercontent.com/u/19864447?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/web-flow", - "html_url": "https://github.com/web-flow", - "followers_url": "https://api.github.com/users/web-flow/followers", - "following_url": "https://api.github.com/users/web-flow/following{/other_user}", - "gists_url": "https://api.github.com/users/web-flow/gists{/gist_id}", - "starred_url": "https://api.github.com/users/web-flow/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/web-flow/subscriptions", - "organizations_url": "https://api.github.com/users/web-flow/orgs", - "repos_url": "https://api.github.com/users/web-flow/repos", - "events_url": "https://api.github.com/users/web-flow/events{/privacy}", - "received_events_url": "https://api.github.com/users/web-flow/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "4af3f99728f924b327b6f455c52452ef0ca09e1a", - "url": "https://api.github.com/repos/jqlang/jq/commits/4af3f99728f924b327b6f455c52452ef0ca09e1a", - "html_url": "https://github.com/jqlang/jq/commit/4af3f99728f924b327b6f455c52452ef0ca09e1a" - } - ] - }, - { - "sha": "4af3f99728f924b327b6f455c52452ef0ca09e1a", - "node_id": "C_kwDOAE3WVdoAKDRhZjNmOTk3MjhmOTI0YjMyN2I2ZjQ1NWM1MjQ1MmVmMGNhMDllMWE", - "commit": { - "author": { - "name": "Owen Ou", - "email": "o@owenou.com", - "date": "2023-07-29T14:20:48Z" - }, - "committer": { - "name": "Emanuele Torre", - "email": "torreemanuele6@gmail.com", - "date": "2023-07-30T02:28:38Z" - }, - "message": "Update `bug_report.md` with Discord link", - "tree": { - "sha": "6b1dcc6f20a7dd205e8c313729a6a1a1f2bf7df1", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/6b1dcc6f20a7dd205e8c313729a6a1a1f2bf7df1" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/4af3f99728f924b327b6f455c52452ef0ca09e1a", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/4af3f99728f924b327b6f455c52452ef0ca09e1a", - "html_url": "https://github.com/jqlang/jq/commit/4af3f99728f924b327b6f455c52452ef0ca09e1a", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/4af3f99728f924b327b6f455c52452ef0ca09e1a/comments", - "author": { - "login": "owenthereal", - "id": 169064, - "node_id": "MDQ6VXNlcjE2OTA2NA==", - "avatar_url": "https://avatars.githubusercontent.com/u/169064?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/owenthereal", - "html_url": "https://github.com/owenthereal", - "followers_url": "https://api.github.com/users/owenthereal/followers", - "following_url": "https://api.github.com/users/owenthereal/following{/other_user}", - "gists_url": "https://api.github.com/users/owenthereal/gists{/gist_id}", - "starred_url": "https://api.github.com/users/owenthereal/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/owenthereal/subscriptions", - "organizations_url": "https://api.github.com/users/owenthereal/orgs", - "repos_url": "https://api.github.com/users/owenthereal/repos", - "events_url": "https://api.github.com/users/owenthereal/events{/privacy}", - "received_events_url": "https://api.github.com/users/owenthereal/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "emanuele6", - "id": 20175435, - "node_id": "MDQ6VXNlcjIwMTc1NDM1", - "avatar_url": "https://avatars.githubusercontent.com/u/20175435?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/emanuele6", - "html_url": "https://github.com/emanuele6", - "followers_url": "https://api.github.com/users/emanuele6/followers", - "following_url": "https://api.github.com/users/emanuele6/following{/other_user}", - "gists_url": "https://api.github.com/users/emanuele6/gists{/gist_id}", - "starred_url": "https://api.github.com/users/emanuele6/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/emanuele6/subscriptions", - "organizations_url": "https://api.github.com/users/emanuele6/orgs", - "repos_url": "https://api.github.com/users/emanuele6/repos", - "events_url": "https://api.github.com/users/emanuele6/events{/privacy}", - "received_events_url": "https://api.github.com/users/emanuele6/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "82f7f772e6bc7f74c37eb36cddda76570f46cd3e", - "url": "https://api.github.com/repos/jqlang/jq/commits/82f7f772e6bc7f74c37eb36cddda76570f46cd3e", - "html_url": "https://github.com/jqlang/jq/commit/82f7f772e6bc7f74c37eb36cddda76570f46cd3e" - } - ] - }, - { - "sha": "82f7f772e6bc7f74c37eb36cddda76570f46cd3e", - "node_id": "C_kwDOAE3WVdoAKDgyZjdmNzcyZTZiYzdmNzRjMzdlYjM2Y2RkZGE3NjU3MGY0NmNkM2U", - "commit": { - "author": { - "name": "Owen Ou", - "email": "o@owenou.com", - "date": "2023-07-29T14:15:57Z" - }, - "committer": { - "name": "Emanuele Torre", - "email": "torreemanuele6@gmail.com", - "date": "2023-07-30T02:28:38Z" - }, - "message": "Redirect questions to Discord\n\nWe now have an official Discord server and most maintainers are hanging\nout there. It would be a good idea to redirect questions to Discord.", - "tree": { - "sha": "cc5af93178bb5dc3c9b0a33c2d3fbe94f9e33ae1", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/cc5af93178bb5dc3c9b0a33c2d3fbe94f9e33ae1" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/82f7f772e6bc7f74c37eb36cddda76570f46cd3e", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/82f7f772e6bc7f74c37eb36cddda76570f46cd3e", - "html_url": "https://github.com/jqlang/jq/commit/82f7f772e6bc7f74c37eb36cddda76570f46cd3e", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/82f7f772e6bc7f74c37eb36cddda76570f46cd3e/comments", - "author": { - "login": "owenthereal", - "id": 169064, - "node_id": "MDQ6VXNlcjE2OTA2NA==", - "avatar_url": "https://avatars.githubusercontent.com/u/169064?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/owenthereal", - "html_url": "https://github.com/owenthereal", - "followers_url": "https://api.github.com/users/owenthereal/followers", - "following_url": "https://api.github.com/users/owenthereal/following{/other_user}", - "gists_url": "https://api.github.com/users/owenthereal/gists{/gist_id}", - "starred_url": "https://api.github.com/users/owenthereal/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/owenthereal/subscriptions", - "organizations_url": "https://api.github.com/users/owenthereal/orgs", - "repos_url": "https://api.github.com/users/owenthereal/repos", - "events_url": "https://api.github.com/users/owenthereal/events{/privacy}", - "received_events_url": "https://api.github.com/users/owenthereal/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "emanuele6", - "id": 20175435, - "node_id": "MDQ6VXNlcjIwMTc1NDM1", - "avatar_url": "https://avatars.githubusercontent.com/u/20175435?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/emanuele6", - "html_url": "https://github.com/emanuele6", - "followers_url": "https://api.github.com/users/emanuele6/followers", - "following_url": "https://api.github.com/users/emanuele6/following{/other_user}", - "gists_url": "https://api.github.com/users/emanuele6/gists{/gist_id}", - "starred_url": "https://api.github.com/users/emanuele6/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/emanuele6/subscriptions", - "organizations_url": "https://api.github.com/users/emanuele6/orgs", - "repos_url": "https://api.github.com/users/emanuele6/repos", - "events_url": "https://api.github.com/users/emanuele6/events{/privacy}", - "received_events_url": "https://api.github.com/users/emanuele6/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "f733a1535ed46ee7a021269c1b10eb6b27821d92", - "url": "https://api.github.com/repos/jqlang/jq/commits/f733a1535ed46ee7a021269c1b10eb6b27821d92", - "html_url": "https://github.com/jqlang/jq/commit/f733a1535ed46ee7a021269c1b10eb6b27821d92" - } - ] - }, - { - "sha": "f733a1535ed46ee7a021269c1b10eb6b27821d92", - "node_id": "C_kwDOAE3WVdoAKGY3MzNhMTUzNWVkNDZlZTdhMDIxMjY5YzFiMTBlYjZiMjc4MjFkOTI", - "commit": { - "author": { - "name": "Nicolas Williams", - "email": "nico@cryptonector.com", - "date": "2023-07-10T23:29:03Z" - }, - "committer": { - "name": "Emanuele Torre", - "email": "torreemanuele6@gmail.com", - "date": "2023-07-30T02:25:54Z" - }, - "message": "Use -Wno-cast-function-type to quiet many warnings", - "tree": { - "sha": "6ea0a9490317f343dc387d40bdb9796ee58c398e", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/6ea0a9490317f343dc387d40bdb9796ee58c398e" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/f733a1535ed46ee7a021269c1b10eb6b27821d92", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/f733a1535ed46ee7a021269c1b10eb6b27821d92", - "html_url": "https://github.com/jqlang/jq/commit/f733a1535ed46ee7a021269c1b10eb6b27821d92", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/f733a1535ed46ee7a021269c1b10eb6b27821d92/comments", - "author": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "emanuele6", - "id": 20175435, - "node_id": "MDQ6VXNlcjIwMTc1NDM1", - "avatar_url": "https://avatars.githubusercontent.com/u/20175435?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/emanuele6", - "html_url": "https://github.com/emanuele6", - "followers_url": "https://api.github.com/users/emanuele6/followers", - "following_url": "https://api.github.com/users/emanuele6/following{/other_user}", - "gists_url": "https://api.github.com/users/emanuele6/gists{/gist_id}", - "starred_url": "https://api.github.com/users/emanuele6/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/emanuele6/subscriptions", - "organizations_url": "https://api.github.com/users/emanuele6/orgs", - "repos_url": "https://api.github.com/users/emanuele6/repos", - "events_url": "https://api.github.com/users/emanuele6/events{/privacy}", - "received_events_url": "https://api.github.com/users/emanuele6/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "c8b30dff4a573e5efc23e30a5074011e39832e2c", - "url": "https://api.github.com/repos/jqlang/jq/commits/c8b30dff4a573e5efc23e30a5074011e39832e2c", - "html_url": "https://github.com/jqlang/jq/commit/c8b30dff4a573e5efc23e30a5074011e39832e2c" - } - ] - }, - { - "sha": "c8b30dff4a573e5efc23e30a5074011e39832e2c", - "node_id": "C_kwDOAE3WVdoAKGM4YjMwZGZmNGE1NzNlNWVmYzIzZTMwYTUwNzQwMTFlMzk4MzJlMmM", - "commit": { - "author": { - "name": "Nicolas Williams", - "email": "nico@cryptonector.com", - "date": "2023-07-10T23:28:33Z" - }, - "committer": { - "name": "Emanuele Torre", - "email": "torreemanuele6@gmail.com", - "date": "2023-07-30T02:25:54Z" - }, - "message": "Add JQ_FALLTHROUGH and use it to quiet warnings", - "tree": { - "sha": "664dd57be13c38405c3d2ae437165b221bb2b892", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/664dd57be13c38405c3d2ae437165b221bb2b892" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/c8b30dff4a573e5efc23e30a5074011e39832e2c", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/c8b30dff4a573e5efc23e30a5074011e39832e2c", - "html_url": "https://github.com/jqlang/jq/commit/c8b30dff4a573e5efc23e30a5074011e39832e2c", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/c8b30dff4a573e5efc23e30a5074011e39832e2c/comments", - "author": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "emanuele6", - "id": 20175435, - "node_id": "MDQ6VXNlcjIwMTc1NDM1", - "avatar_url": "https://avatars.githubusercontent.com/u/20175435?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/emanuele6", - "html_url": "https://github.com/emanuele6", - "followers_url": "https://api.github.com/users/emanuele6/followers", - "following_url": "https://api.github.com/users/emanuele6/following{/other_user}", - "gists_url": "https://api.github.com/users/emanuele6/gists{/gist_id}", - "starred_url": "https://api.github.com/users/emanuele6/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/emanuele6/subscriptions", - "organizations_url": "https://api.github.com/users/emanuele6/orgs", - "repos_url": "https://api.github.com/users/emanuele6/repos", - "events_url": "https://api.github.com/users/emanuele6/events{/privacy}", - "received_events_url": "https://api.github.com/users/emanuele6/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "a6eb055c47c980bba4ebdc60b026f2311e5a800a", - "url": "https://api.github.com/repos/jqlang/jq/commits/a6eb055c47c980bba4ebdc60b026f2311e5a800a", - "html_url": "https://github.com/jqlang/jq/commit/a6eb055c47c980bba4ebdc60b026f2311e5a800a" - } - ] - }, - { - "sha": "a6eb055c47c980bba4ebdc60b026f2311e5a800a", - "node_id": "C_kwDOAE3WVdoAKGE2ZWIwNTVjNDdjOTgwYmJhNGViZGM2MGIwMjZmMjMxMWU1YTgwMGE", - "commit": { - "author": { - "name": "Emanuele Torre", - "email": "torreemanuele6@gmail.com", - "date": "2023-07-29T19:57:40Z" - }, - "committer": { - "name": "Nico Williams", - "email": "nico@cryptonector.com", - "date": "2023-07-29T23:27:59Z" - }, - "message": "Fix typo in manual: \"-seq\" => \"--seq\"", - "tree": { - "sha": "24780d52e52ebc7c724fd8677c608e657868ccbd", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/24780d52e52ebc7c724fd8677c608e657868ccbd" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/a6eb055c47c980bba4ebdc60b026f2311e5a800a", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/a6eb055c47c980bba4ebdc60b026f2311e5a800a", - "html_url": "https://github.com/jqlang/jq/commit/a6eb055c47c980bba4ebdc60b026f2311e5a800a", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/a6eb055c47c980bba4ebdc60b026f2311e5a800a/comments", - "author": { - "login": "emanuele6", - "id": 20175435, - "node_id": "MDQ6VXNlcjIwMTc1NDM1", - "avatar_url": "https://avatars.githubusercontent.com/u/20175435?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/emanuele6", - "html_url": "https://github.com/emanuele6", - "followers_url": "https://api.github.com/users/emanuele6/followers", - "following_url": "https://api.github.com/users/emanuele6/following{/other_user}", - "gists_url": "https://api.github.com/users/emanuele6/gists{/gist_id}", - "starred_url": "https://api.github.com/users/emanuele6/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/emanuele6/subscriptions", - "organizations_url": "https://api.github.com/users/emanuele6/orgs", - "repos_url": "https://api.github.com/users/emanuele6/repos", - "events_url": "https://api.github.com/users/emanuele6/events{/privacy}", - "received_events_url": "https://api.github.com/users/emanuele6/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "ee2a215f2eb0bde3d4a6cfff1a656dcc684abbb3", - "url": "https://api.github.com/repos/jqlang/jq/commits/ee2a215f2eb0bde3d4a6cfff1a656dcc684abbb3", - "html_url": "https://github.com/jqlang/jq/commit/ee2a215f2eb0bde3d4a6cfff1a656dcc684abbb3" - } - ] - }, - { - "sha": "ee2a215f2eb0bde3d4a6cfff1a656dcc684abbb3", - "node_id": "C_kwDOAE3WVdoAKGVlMmEyMTVmMmViMGJkZTNkNGE2Y2ZmZjFhNjU2ZGNjNjg0YWJiYjM", - "commit": { - "author": { - "name": "Owen Ou", - "email": "169064+owenthereal@users.noreply.github.com", - "date": "2023-07-29T14:38:08Z" - }, - "committer": { - "name": "GitHub", - "email": "noreply@github.com", - "date": "2023-07-29T14:38:08Z" - }, - "message": "Backfill with references in NEWS.md (#2788)\n\nBackfill with references to PRs & issues in NEWS.md", - "tree": { - "sha": "03e4a1c2a495272c8616c4a7ec1a5b9621fadf12", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/03e4a1c2a495272c8616c4a7ec1a5b9621fadf12" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/ee2a215f2eb0bde3d4a6cfff1a656dcc684abbb3", - "comment_count": 0, - "verification": { - "verified": true, - "reason": "valid", - "signature": "-----BEGIN PGP SIGNATURE-----\n\nwsBcBAABCAAQBQJkxSRQCRBK7hj4Ov3rIwAAnoUIAH0fFjRpMbICIDk6Zd8QvMNY\nt7xEY4MTsR0RpiHKhWK2zFpq9jC1Zgam0obi0e4zlDewzOkCNRWp/p5Xg+mjiCYT\nsUWZhsxKrWn591hqAGh6Lirnzb3jzg7mMuIf4EqXIaula/oT0XfHJkujqBn8riwD\nd0yD1XT8zIButBES2N9poeE7wuNuRPr5qN3gzU1kEmKubMpzpX2xNTafhz7lDi3Q\nKmMbLMzv2pAWsCNTyl18S3u9JM+dDTFULPvq/J5IrlPJ+J9nUQCN3Hax7KUkC+FM\nGaAvjNqevr/Cf+L0s8Eyz7O3OGtRMZoKOYAeV5EGuIe44rsM6CtnkhuENkfHrA4=\n=bVTw\n-----END PGP SIGNATURE-----\n", - "payload": "tree 03e4a1c2a495272c8616c4a7ec1a5b9621fadf12\nparent 70bbd10b0b58e797d03963264fc934879bb44454\nauthor Owen Ou <169064+owenthereal@users.noreply.github.com> 1690641488 -0700\ncommitter GitHub 1690641488 -0700\n\nBackfill with references in NEWS.md (#2788)\n\nBackfill with references to PRs & issues in NEWS.md" - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/ee2a215f2eb0bde3d4a6cfff1a656dcc684abbb3", - "html_url": "https://github.com/jqlang/jq/commit/ee2a215f2eb0bde3d4a6cfff1a656dcc684abbb3", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/ee2a215f2eb0bde3d4a6cfff1a656dcc684abbb3/comments", - "author": { - "login": "owenthereal", - "id": 169064, - "node_id": "MDQ6VXNlcjE2OTA2NA==", - "avatar_url": "https://avatars.githubusercontent.com/u/169064?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/owenthereal", - "html_url": "https://github.com/owenthereal", - "followers_url": "https://api.github.com/users/owenthereal/followers", - "following_url": "https://api.github.com/users/owenthereal/following{/other_user}", - "gists_url": "https://api.github.com/users/owenthereal/gists{/gist_id}", - "starred_url": "https://api.github.com/users/owenthereal/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/owenthereal/subscriptions", - "organizations_url": "https://api.github.com/users/owenthereal/orgs", - "repos_url": "https://api.github.com/users/owenthereal/repos", - "events_url": "https://api.github.com/users/owenthereal/events{/privacy}", - "received_events_url": "https://api.github.com/users/owenthereal/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "web-flow", - "id": 19864447, - "node_id": "MDQ6VXNlcjE5ODY0NDQ3", - "avatar_url": "https://avatars.githubusercontent.com/u/19864447?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/web-flow", - "html_url": "https://github.com/web-flow", - "followers_url": "https://api.github.com/users/web-flow/followers", - "following_url": "https://api.github.com/users/web-flow/following{/other_user}", - "gists_url": "https://api.github.com/users/web-flow/gists{/gist_id}", - "starred_url": "https://api.github.com/users/web-flow/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/web-flow/subscriptions", - "organizations_url": "https://api.github.com/users/web-flow/orgs", - "repos_url": "https://api.github.com/users/web-flow/repos", - "events_url": "https://api.github.com/users/web-flow/events{/privacy}", - "received_events_url": "https://api.github.com/users/web-flow/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "70bbd10b0b58e797d03963264fc934879bb44454", - "url": "https://api.github.com/repos/jqlang/jq/commits/70bbd10b0b58e797d03963264fc934879bb44454", - "html_url": "https://github.com/jqlang/jq/commit/70bbd10b0b58e797d03963264fc934879bb44454" - } - ] - }, - { - "sha": "70bbd10b0b58e797d03963264fc934879bb44454", - "node_id": "C_kwDOAE3WVdoAKDcwYmJkMTBiMGI1OGU3OTdkMDM5NjMyNjRmYzkzNDg3OWJiNDQ0NTQ", - "commit": { - "author": { - "name": "pkoppstein", - "email": "pkoppstein@gmail.com", - "date": "2023-07-28T20:32:08Z" - }, - "committer": { - "name": "Nico Williams", - "email": "nico@cryptonector.com", - "date": "2023-07-28T22:25:41Z" - }, - "message": "NEWS.md: tweaks\n\ncorrect grammar, add attributions, clarify abs", - "tree": { - "sha": "9aa82749d2d19e3173d89f41fd27eecea7936a72", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/9aa82749d2d19e3173d89f41fd27eecea7936a72" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/70bbd10b0b58e797d03963264fc934879bb44454", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/70bbd10b0b58e797d03963264fc934879bb44454", - "html_url": "https://github.com/jqlang/jq/commit/70bbd10b0b58e797d03963264fc934879bb44454", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/70bbd10b0b58e797d03963264fc934879bb44454/comments", - "author": { - "login": "pkoppstein", - "id": 172847, - "node_id": "MDQ6VXNlcjE3Mjg0Nw==", - "avatar_url": "https://avatars.githubusercontent.com/u/172847?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/pkoppstein", - "html_url": "https://github.com/pkoppstein", - "followers_url": "https://api.github.com/users/pkoppstein/followers", - "following_url": "https://api.github.com/users/pkoppstein/following{/other_user}", - "gists_url": "https://api.github.com/users/pkoppstein/gists{/gist_id}", - "starred_url": "https://api.github.com/users/pkoppstein/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/pkoppstein/subscriptions", - "organizations_url": "https://api.github.com/users/pkoppstein/orgs", - "repos_url": "https://api.github.com/users/pkoppstein/repos", - "events_url": "https://api.github.com/users/pkoppstein/events{/privacy}", - "received_events_url": "https://api.github.com/users/pkoppstein/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "28af00751812d6ef28b05374b28794b25db91d97", - "url": "https://api.github.com/repos/jqlang/jq/commits/28af00751812d6ef28b05374b28794b25db91d97", - "html_url": "https://github.com/jqlang/jq/commit/28af00751812d6ef28b05374b28794b25db91d97" - } - ] - }, - { - "sha": "28af00751812d6ef28b05374b28794b25db91d97", - "node_id": "C_kwDOAE3WVdoAKDI4YWYwMDc1MTgxMmQ2ZWYyOGIwNTM3NGIyODc5NGIyNWRiOTFkOTc", - "commit": { - "author": { - "name": "Mattias Wadman", - "email": "mattias.wadman@gmail.com", - "date": "2023-06-02T14:47:02Z" - }, - "committer": { - "name": "Nico Williams", - "email": "nico@cryptonector.com", - "date": "2023-07-28T18:43:14Z" - }, - "message": "Replace NEWS with NEWS.md with more details and examples\n\nChanges mentioned based on picking user facing changes from:\ngit log --oneline -r master...jq-1.6 | grep -v Merge", - "tree": { - "sha": "7d920482736fc5f8469728eaa533ab0e062bb8c5", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/7d920482736fc5f8469728eaa533ab0e062bb8c5" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/28af00751812d6ef28b05374b28794b25db91d97", - "comment_count": 1, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/28af00751812d6ef28b05374b28794b25db91d97", - "html_url": "https://github.com/jqlang/jq/commit/28af00751812d6ef28b05374b28794b25db91d97", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/28af00751812d6ef28b05374b28794b25db91d97/comments", - "author": { - "login": "wader", - "id": 185566, - "node_id": "MDQ6VXNlcjE4NTU2Ng==", - "avatar_url": "https://avatars.githubusercontent.com/u/185566?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/wader", - "html_url": "https://github.com/wader", - "followers_url": "https://api.github.com/users/wader/followers", - "following_url": "https://api.github.com/users/wader/following{/other_user}", - "gists_url": "https://api.github.com/users/wader/gists{/gist_id}", - "starred_url": "https://api.github.com/users/wader/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/wader/subscriptions", - "organizations_url": "https://api.github.com/users/wader/orgs", - "repos_url": "https://api.github.com/users/wader/repos", - "events_url": "https://api.github.com/users/wader/events{/privacy}", - "received_events_url": "https://api.github.com/users/wader/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "336c3deb8a9f4d30d1cf27fb98aecf61ef20f99d", - "url": "https://api.github.com/repos/jqlang/jq/commits/336c3deb8a9f4d30d1cf27fb98aecf61ef20f99d", - "html_url": "https://github.com/jqlang/jq/commit/336c3deb8a9f4d30d1cf27fb98aecf61ef20f99d" - } - ] - }, - { - "sha": "336c3deb8a9f4d30d1cf27fb98aecf61ef20f99d", - "node_id": "C_kwDOAE3WVdoAKDMzNmMzZGViOGE5ZjRkMzBkMWNmMjdmYjk4YWVjZjYxZWYyMGY5OWQ", - "commit": { - "author": { - "name": "pkoppstein", - "email": "pkoppstein@gmail.com", - "date": "2023-07-16T01:50:19Z" - }, - "committer": { - "name": "Nico Williams", - "email": "nico@cryptonector.com", - "date": "2023-07-28T17:34:26Z" - }, - "message": "Test negative indices in path expressions", - "tree": { - "sha": "504e45cf7e983db3df6f397e7633d3bdfc049e93", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/504e45cf7e983db3df6f397e7633d3bdfc049e93" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/336c3deb8a9f4d30d1cf27fb98aecf61ef20f99d", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/336c3deb8a9f4d30d1cf27fb98aecf61ef20f99d", - "html_url": "https://github.com/jqlang/jq/commit/336c3deb8a9f4d30d1cf27fb98aecf61ef20f99d", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/336c3deb8a9f4d30d1cf27fb98aecf61ef20f99d/comments", - "author": { - "login": "pkoppstein", - "id": 172847, - "node_id": "MDQ6VXNlcjE3Mjg0Nw==", - "avatar_url": "https://avatars.githubusercontent.com/u/172847?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/pkoppstein", - "html_url": "https://github.com/pkoppstein", - "followers_url": "https://api.github.com/users/pkoppstein/followers", - "following_url": "https://api.github.com/users/pkoppstein/following{/other_user}", - "gists_url": "https://api.github.com/users/pkoppstein/gists{/gist_id}", - "starred_url": "https://api.github.com/users/pkoppstein/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/pkoppstein/subscriptions", - "organizations_url": "https://api.github.com/users/pkoppstein/orgs", - "repos_url": "https://api.github.com/users/pkoppstein/repos", - "events_url": "https://api.github.com/users/pkoppstein/events{/privacy}", - "received_events_url": "https://api.github.com/users/pkoppstein/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "086a156ec389de167edc72e8bd1752984b117349", - "url": "https://api.github.com/repos/jqlang/jq/commits/086a156ec389de167edc72e8bd1752984b117349", - "html_url": "https://github.com/jqlang/jq/commit/086a156ec389de167edc72e8bd1752984b117349" - } - ] - }, - { - "sha": "086a156ec389de167edc72e8bd1752984b117349", - "node_id": "C_kwDOAE3WVdoAKDA4NmExNTZlYzM4OWRlMTY3ZWRjNzJlOGJkMTc1Mjk4NGIxMTczNDk", - "commit": { - "author": { - "name": "Nicolas Williams", - "email": "nico@cryptonector.com", - "date": "2023-07-16T01:00:00Z" - }, - "committer": { - "name": "Nico Williams", - "email": "nico@cryptonector.com", - "date": "2023-07-28T17:34:26Z" - }, - "message": "Allow .[-1] in path expressions", - "tree": { - "sha": "7f5828035b04c819c53f599e19b1c5ce315d49d6", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/7f5828035b04c819c53f599e19b1c5ce315d49d6" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/086a156ec389de167edc72e8bd1752984b117349", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/086a156ec389de167edc72e8bd1752984b117349", - "html_url": "https://github.com/jqlang/jq/commit/086a156ec389de167edc72e8bd1752984b117349", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/086a156ec389de167edc72e8bd1752984b117349/comments", - "author": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "d319eb21879eba6ad34f24c51883bc1b1682d3fe", - "url": "https://api.github.com/repos/jqlang/jq/commits/d319eb21879eba6ad34f24c51883bc1b1682d3fe", - "html_url": "https://github.com/jqlang/jq/commit/d319eb21879eba6ad34f24c51883bc1b1682d3fe" - } - ] - }, - { - "sha": "d319eb21879eba6ad34f24c51883bc1b1682d3fe", - "node_id": "C_kwDOAE3WVdoAKGQzMTllYjIxODc5ZWJhNmFkMzRmMjRjNTE4ODNiYzFiMTY4MmQzZmU", - "commit": { - "author": { - "name": "itchyny", - "email": "itchyny@cybozu.co.jp", - "date": "2023-07-28T08:47:51Z" - }, - "committer": { - "name": "GitHub", - "email": "noreply@github.com", - "date": "2023-07-28T08:47:51Z" - }, - "message": "Fix PR creation by using fully qualified refname on release", - "tree": { - "sha": "7ccedaff18e518da76257d14f3604f2c35b709af", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/7ccedaff18e518da76257d14f3604f2c35b709af" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/d319eb21879eba6ad34f24c51883bc1b1682d3fe", - "comment_count": 0, - "verification": { - "verified": true, - "reason": "valid", - "signature": "-----BEGIN PGP SIGNATURE-----\n\nwsBcBAABCAAQBQJkw4C3CRBK7hj4Ov3rIwAAMHcIAAsUfwv3HM1ZomrrXLcwPqEB\n2jkjUY440ZKHFM8Y3iY87DhmCFdKT+9mmGqkA6DOQw+pnBlXFcw481OaQJQmcklp\n/D3CTZ1ixLAq6ArkqJhWTpc/2mJYk6aIa4Wou+jauiQC1lzwQI/EsYoMADYRHLn/\nGZuZUi/K4ZxMoDLlDka1VD6NKAPfVl3RoOQQUSSpo+zgezfCQgEwm3kLHqJQI8Lj\n5LPG/EP5GgzdGHnzXkba3T4W4V4xM+FTkmtR0yl24WI864wL4fHJjHp3NUbVqvPm\nvtRrmgzh3unVY01K0aTyL5lAkNROWCGRlY88OYj8QIUzCvlpUqaS8+eQYdymr0I=\n=SV87\n-----END PGP SIGNATURE-----\n", - "payload": "tree 7ccedaff18e518da76257d14f3604f2c35b709af\nparent 17889a1a85c79b8e08179370aec51131f69a503e\nauthor itchyny 1690534071 +0900\ncommitter GitHub 1690534071 +0900\n\nFix PR creation by using fully qualified refname on release" - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/d319eb21879eba6ad34f24c51883bc1b1682d3fe", - "html_url": "https://github.com/jqlang/jq/commit/d319eb21879eba6ad34f24c51883bc1b1682d3fe", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/d319eb21879eba6ad34f24c51883bc1b1682d3fe/comments", - "author": { - "login": "itchyny", - "id": 375258, - "node_id": "MDQ6VXNlcjM3NTI1OA==", - "avatar_url": "https://avatars.githubusercontent.com/u/375258?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/itchyny", - "html_url": "https://github.com/itchyny", - "followers_url": "https://api.github.com/users/itchyny/followers", - "following_url": "https://api.github.com/users/itchyny/following{/other_user}", - "gists_url": "https://api.github.com/users/itchyny/gists{/gist_id}", - "starred_url": "https://api.github.com/users/itchyny/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/itchyny/subscriptions", - "organizations_url": "https://api.github.com/users/itchyny/orgs", - "repos_url": "https://api.github.com/users/itchyny/repos", - "events_url": "https://api.github.com/users/itchyny/events{/privacy}", - "received_events_url": "https://api.github.com/users/itchyny/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "web-flow", - "id": 19864447, - "node_id": "MDQ6VXNlcjE5ODY0NDQ3", - "avatar_url": "https://avatars.githubusercontent.com/u/19864447?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/web-flow", - "html_url": "https://github.com/web-flow", - "followers_url": "https://api.github.com/users/web-flow/followers", - "following_url": "https://api.github.com/users/web-flow/following{/other_user}", - "gists_url": "https://api.github.com/users/web-flow/gists{/gist_id}", - "starred_url": "https://api.github.com/users/web-flow/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/web-flow/subscriptions", - "organizations_url": "https://api.github.com/users/web-flow/orgs", - "repos_url": "https://api.github.com/users/web-flow/repos", - "events_url": "https://api.github.com/users/web-flow/events{/privacy}", - "received_events_url": "https://api.github.com/users/web-flow/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "17889a1a85c79b8e08179370aec51131f69a503e", - "url": "https://api.github.com/repos/jqlang/jq/commits/17889a1a85c79b8e08179370aec51131f69a503e", - "html_url": "https://github.com/jqlang/jq/commit/17889a1a85c79b8e08179370aec51131f69a503e" - } - ] - }, - { - "sha": "17889a1a85c79b8e08179370aec51131f69a503e", - "node_id": "C_kwDOAE3WVdoAKDE3ODg5YTFhODVjNzliOGUwODE3OTM3MGFlYzUxMTMxZjY5YTUwM2U", - "commit": { - "author": { - "name": "Emanuele Torre", - "email": "torreemanuele6@gmail.com", - "date": "2023-07-28T00:09:44Z" - }, - "committer": { - "name": "Nico Williams", - "email": "nico@cryptonector.com", - "date": "2023-07-28T01:59:35Z" - }, - "message": "Fix memory leak for { $foo: bar }\n\n{ BINDING: ExpD } wasn't freeing BINDING.\n\nFixes https://bugs.chromium.org/p/oss-fuzz/issues/detail?id=60865", - "tree": { - "sha": "6149a6821668859bf419a0d373d039ace6b396c6", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/6149a6821668859bf419a0d373d039ace6b396c6" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/17889a1a85c79b8e08179370aec51131f69a503e", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/17889a1a85c79b8e08179370aec51131f69a503e", - "html_url": "https://github.com/jqlang/jq/commit/17889a1a85c79b8e08179370aec51131f69a503e", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/17889a1a85c79b8e08179370aec51131f69a503e/comments", - "author": { - "login": "emanuele6", - "id": 20175435, - "node_id": "MDQ6VXNlcjIwMTc1NDM1", - "avatar_url": "https://avatars.githubusercontent.com/u/20175435?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/emanuele6", - "html_url": "https://github.com/emanuele6", - "followers_url": "https://api.github.com/users/emanuele6/followers", - "following_url": "https://api.github.com/users/emanuele6/following{/other_user}", - "gists_url": "https://api.github.com/users/emanuele6/gists{/gist_id}", - "starred_url": "https://api.github.com/users/emanuele6/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/emanuele6/subscriptions", - "organizations_url": "https://api.github.com/users/emanuele6/orgs", - "repos_url": "https://api.github.com/users/emanuele6/repos", - "events_url": "https://api.github.com/users/emanuele6/events{/privacy}", - "received_events_url": "https://api.github.com/users/emanuele6/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "5b9d0750db13a39bec3b54828b0b6b00d50767ca", - "url": "https://api.github.com/repos/jqlang/jq/commits/5b9d0750db13a39bec3b54828b0b6b00d50767ca", - "html_url": "https://github.com/jqlang/jq/commit/5b9d0750db13a39bec3b54828b0b6b00d50767ca" - } - ] - }, - { - "sha": "5b9d0750db13a39bec3b54828b0b6b00d50767ca", - "node_id": "C_kwDOAE3WVdoAKDViOWQwNzUwZGIxM2EzOWJlYzNiNTQ4MjhiMGI2YjAwZDUwNzY3Y2E", - "commit": { - "author": { - "name": "itchyny", - "email": "itchyny@cybozu.co.jp", - "date": "2023-07-28T01:23:01Z" - }, - "committer": { - "name": "itchyny", - "email": "itchyny@cybozu.co.jp", - "date": "2023-07-28T01:25:06Z" - }, - "message": "Fix PR creation by specifying the branch on release", - "tree": { - "sha": "8db6b20f6e253fe2610c77893291d1abce94b63c", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/8db6b20f6e253fe2610c77893291d1abce94b63c" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/5b9d0750db13a39bec3b54828b0b6b00d50767ca", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/5b9d0750db13a39bec3b54828b0b6b00d50767ca", - "html_url": "https://github.com/jqlang/jq/commit/5b9d0750db13a39bec3b54828b0b6b00d50767ca", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/5b9d0750db13a39bec3b54828b0b6b00d50767ca/comments", - "author": { - "login": "itchyny", - "id": 375258, - "node_id": "MDQ6VXNlcjM3NTI1OA==", - "avatar_url": "https://avatars.githubusercontent.com/u/375258?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/itchyny", - "html_url": "https://github.com/itchyny", - "followers_url": "https://api.github.com/users/itchyny/followers", - "following_url": "https://api.github.com/users/itchyny/following{/other_user}", - "gists_url": "https://api.github.com/users/itchyny/gists{/gist_id}", - "starred_url": "https://api.github.com/users/itchyny/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/itchyny/subscriptions", - "organizations_url": "https://api.github.com/users/itchyny/orgs", - "repos_url": "https://api.github.com/users/itchyny/repos", - "events_url": "https://api.github.com/users/itchyny/events{/privacy}", - "received_events_url": "https://api.github.com/users/itchyny/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "itchyny", - "id": 375258, - "node_id": "MDQ6VXNlcjM3NTI1OA==", - "avatar_url": "https://avatars.githubusercontent.com/u/375258?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/itchyny", - "html_url": "https://github.com/itchyny", - "followers_url": "https://api.github.com/users/itchyny/followers", - "following_url": "https://api.github.com/users/itchyny/following{/other_user}", - "gists_url": "https://api.github.com/users/itchyny/gists{/gist_id}", - "starred_url": "https://api.github.com/users/itchyny/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/itchyny/subscriptions", - "organizations_url": "https://api.github.com/users/itchyny/orgs", - "repos_url": "https://api.github.com/users/itchyny/repos", - "events_url": "https://api.github.com/users/itchyny/events{/privacy}", - "received_events_url": "https://api.github.com/users/itchyny/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "b33725c96e36d82e4eb8d3871e7565f43a0c6251", - "url": "https://api.github.com/repos/jqlang/jq/commits/b33725c96e36d82e4eb8d3871e7565f43a0c6251", - "html_url": "https://github.com/jqlang/jq/commit/b33725c96e36d82e4eb8d3871e7565f43a0c6251" - } - ] - }, - { - "sha": "b33725c96e36d82e4eb8d3871e7565f43a0c6251", - "node_id": "C_kwDOAE3WVdoAKGIzMzcyNWM5NmUzNmQ4MmU0ZWI4ZDM4NzFlNzU2NWY0M2EwYzYyNTE", - "commit": { - "author": { - "name": "itchyny", - "email": "itchyny@cybozu.co.jp", - "date": "2023-07-28T01:04:35Z" - }, - "committer": { - "name": "itchyny", - "email": "itchyny@cybozu.co.jp", - "date": "2023-07-28T01:04:35Z" - }, - "message": "Fix gh pr create option on release", - "tree": { - "sha": "c15eb44a91cf0cf748b382378e5a3607daa9c165", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/c15eb44a91cf0cf748b382378e5a3607daa9c165" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/b33725c96e36d82e4eb8d3871e7565f43a0c6251", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/b33725c96e36d82e4eb8d3871e7565f43a0c6251", - "html_url": "https://github.com/jqlang/jq/commit/b33725c96e36d82e4eb8d3871e7565f43a0c6251", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/b33725c96e36d82e4eb8d3871e7565f43a0c6251/comments", - "author": { - "login": "itchyny", - "id": 375258, - "node_id": "MDQ6VXNlcjM3NTI1OA==", - "avatar_url": "https://avatars.githubusercontent.com/u/375258?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/itchyny", - "html_url": "https://github.com/itchyny", - "followers_url": "https://api.github.com/users/itchyny/followers", - "following_url": "https://api.github.com/users/itchyny/following{/other_user}", - "gists_url": "https://api.github.com/users/itchyny/gists{/gist_id}", - "starred_url": "https://api.github.com/users/itchyny/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/itchyny/subscriptions", - "organizations_url": "https://api.github.com/users/itchyny/orgs", - "repos_url": "https://api.github.com/users/itchyny/repos", - "events_url": "https://api.github.com/users/itchyny/events{/privacy}", - "received_events_url": "https://api.github.com/users/itchyny/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "itchyny", - "id": 375258, - "node_id": "MDQ6VXNlcjM3NTI1OA==", - "avatar_url": "https://avatars.githubusercontent.com/u/375258?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/itchyny", - "html_url": "https://github.com/itchyny", - "followers_url": "https://api.github.com/users/itchyny/followers", - "following_url": "https://api.github.com/users/itchyny/following{/other_user}", - "gists_url": "https://api.github.com/users/itchyny/gists{/gist_id}", - "starred_url": "https://api.github.com/users/itchyny/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/itchyny/subscriptions", - "organizations_url": "https://api.github.com/users/itchyny/orgs", - "repos_url": "https://api.github.com/users/itchyny/repos", - "events_url": "https://api.github.com/users/itchyny/events{/privacy}", - "received_events_url": "https://api.github.com/users/itchyny/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "72f147e82e8051490e6ddfdb18c90ef84ef1d70c", - "url": "https://api.github.com/repos/jqlang/jq/commits/72f147e82e8051490e6ddfdb18c90ef84ef1d70c", - "html_url": "https://github.com/jqlang/jq/commit/72f147e82e8051490e6ddfdb18c90ef84ef1d70c" - } - ] - }, - { - "sha": "72f147e82e8051490e6ddfdb18c90ef84ef1d70c", - "node_id": "C_kwDOAE3WVdoAKDcyZjE0N2U4MmU4MDUxNDkwZTZkZGZkYjE4YzkwZWY4NGVmMWQ3MGM", - "commit": { - "author": { - "name": "itchyny", - "email": "itchyny@cybozu.co.jp", - "date": "2023-07-27T23:46:56Z" - }, - "committer": { - "name": "Nico Williams", - "email": "nico@cryptonector.com", - "date": "2023-07-28T00:18:16Z" - }, - "message": "Fix release job to create a pull request for signatures", - "tree": { - "sha": "e7a4381ffabdd0632c89586c8bbb9c13ce6df53a", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/e7a4381ffabdd0632c89586c8bbb9c13ce6df53a" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/72f147e82e8051490e6ddfdb18c90ef84ef1d70c", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/72f147e82e8051490e6ddfdb18c90ef84ef1d70c", - "html_url": "https://github.com/jqlang/jq/commit/72f147e82e8051490e6ddfdb18c90ef84ef1d70c", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/72f147e82e8051490e6ddfdb18c90ef84ef1d70c/comments", - "author": { - "login": "itchyny", - "id": 375258, - "node_id": "MDQ6VXNlcjM3NTI1OA==", - "avatar_url": "https://avatars.githubusercontent.com/u/375258?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/itchyny", - "html_url": "https://github.com/itchyny", - "followers_url": "https://api.github.com/users/itchyny/followers", - "following_url": "https://api.github.com/users/itchyny/following{/other_user}", - "gists_url": "https://api.github.com/users/itchyny/gists{/gist_id}", - "starred_url": "https://api.github.com/users/itchyny/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/itchyny/subscriptions", - "organizations_url": "https://api.github.com/users/itchyny/orgs", - "repos_url": "https://api.github.com/users/itchyny/repos", - "events_url": "https://api.github.com/users/itchyny/events{/privacy}", - "received_events_url": "https://api.github.com/users/itchyny/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "4160a36fb5dd29b20b5786e40d62f00368aa4108", - "url": "https://api.github.com/repos/jqlang/jq/commits/4160a36fb5dd29b20b5786e40d62f00368aa4108", - "html_url": "https://github.com/jqlang/jq/commit/4160a36fb5dd29b20b5786e40d62f00368aa4108" - } - ] - }, - { - "sha": "4160a36fb5dd29b20b5786e40d62f00368aa4108", - "node_id": "C_kwDOAE3WVdoAKDQxNjBhMzZmYjVkZDI5YjIwYjU3ODZlNDBkNjJmMDAzNjhhYTQxMDg", - "commit": { - "author": { - "name": "itchyny", - "email": "itchyny@cybozu.co.jp", - "date": "2023-07-27T19:57:51Z" - }, - "committer": { - "name": "Nico Williams", - "email": "nico@cryptonector.com", - "date": "2023-07-27T22:01:24Z" - }, - "message": "Commit GPG signatures on release", - "tree": { - "sha": "41951c51166d63b3378f547f02f119ca8bcd2c96", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/41951c51166d63b3378f547f02f119ca8bcd2c96" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/4160a36fb5dd29b20b5786e40d62f00368aa4108", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/4160a36fb5dd29b20b5786e40d62f00368aa4108", - "html_url": "https://github.com/jqlang/jq/commit/4160a36fb5dd29b20b5786e40d62f00368aa4108", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/4160a36fb5dd29b20b5786e40d62f00368aa4108/comments", - "author": { - "login": "itchyny", - "id": 375258, - "node_id": "MDQ6VXNlcjM3NTI1OA==", - "avatar_url": "https://avatars.githubusercontent.com/u/375258?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/itchyny", - "html_url": "https://github.com/itchyny", - "followers_url": "https://api.github.com/users/itchyny/followers", - "following_url": "https://api.github.com/users/itchyny/following{/other_user}", - "gists_url": "https://api.github.com/users/itchyny/gists{/gist_id}", - "starred_url": "https://api.github.com/users/itchyny/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/itchyny/subscriptions", - "organizations_url": "https://api.github.com/users/itchyny/orgs", - "repos_url": "https://api.github.com/users/itchyny/repos", - "events_url": "https://api.github.com/users/itchyny/events{/privacy}", - "received_events_url": "https://api.github.com/users/itchyny/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "668607e3054d70bee596681f4558da685df81b6f", - "url": "https://api.github.com/repos/jqlang/jq/commits/668607e3054d70bee596681f4558da685df81b6f", - "html_url": "https://github.com/jqlang/jq/commit/668607e3054d70bee596681f4558da685df81b6f" - } - ] - }, - { - "sha": "668607e3054d70bee596681f4558da685df81b6f", - "node_id": "C_kwDOAE3WVdoAKDY2ODYwN2UzMDU0ZDcwYmVlNTk2NjgxZjQ1NThkYTY4NWRmODFiNmY", - "commit": { - "author": { - "name": "itchyny", - "email": "itchyny@cybozu.co.jp", - "date": "2023-07-26T22:53:10Z" - }, - "committer": { - "name": "Nico Williams", - "email": "nico@cryptonector.com", - "date": "2023-07-27T04:56:01Z" - }, - "message": "Enable gamma, drem on macOS", - "tree": { - "sha": "b9fa5902f9c37af4cdcef53f70755b4363f7de60", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/b9fa5902f9c37af4cdcef53f70755b4363f7de60" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/668607e3054d70bee596681f4558da685df81b6f", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/668607e3054d70bee596681f4558da685df81b6f", - "html_url": "https://github.com/jqlang/jq/commit/668607e3054d70bee596681f4558da685df81b6f", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/668607e3054d70bee596681f4558da685df81b6f/comments", - "author": { - "login": "itchyny", - "id": 375258, - "node_id": "MDQ6VXNlcjM3NTI1OA==", - "avatar_url": "https://avatars.githubusercontent.com/u/375258?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/itchyny", - "html_url": "https://github.com/itchyny", - "followers_url": "https://api.github.com/users/itchyny/followers", - "following_url": "https://api.github.com/users/itchyny/following{/other_user}", - "gists_url": "https://api.github.com/users/itchyny/gists{/gist_id}", - "starred_url": "https://api.github.com/users/itchyny/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/itchyny/subscriptions", - "organizations_url": "https://api.github.com/users/itchyny/orgs", - "repos_url": "https://api.github.com/users/itchyny/repos", - "events_url": "https://api.github.com/users/itchyny/events{/privacy}", - "received_events_url": "https://api.github.com/users/itchyny/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "a1e791acf894722b766eceb9e3c0b6eac209f0a8", - "url": "https://api.github.com/repos/jqlang/jq/commits/a1e791acf894722b766eceb9e3c0b6eac209f0a8", - "html_url": "https://github.com/jqlang/jq/commit/a1e791acf894722b766eceb9e3c0b6eac209f0a8" - } - ] - }, - { - "sha": "a1e791acf894722b766eceb9e3c0b6eac209f0a8", - "node_id": "C_kwDOAE3WVdoAKGExZTc5MWFjZjg5NDcyMmI3NjZlY2ViOWUzYzBiNmVhYzIwOWYwYTg", - "commit": { - "author": { - "name": "itchyny", - "email": "itchyny@cybozu.co.jp", - "date": "2023-07-09T22:30:50Z" - }, - "committer": { - "name": "Nico Williams", - "email": "nico@cryptonector.com", - "date": "2023-07-27T04:55:00Z" - }, - "message": "Rename --nul-output to --raw-output0, abort on string containing NUL\n\nThe option naming --nul-output was confusing, especially when we have a\nsimilar option for input stream in the future (--nul-input vs --null-input).\nBased on the observation of other command line tools, we rename the option\nto --raw-output0. We also drop the short option -0 to avoid confusion on\nintroducing the NUL-delimited input option.\n\nUnlike the other command line tools outputting file names with NUL delimiter,\njq deals with JSON, and its strings may contain NUL character. To protect\nusers from the risk of injection attacks, we abort the program and print an\nerror message before outputting strings including NUL character. Closes #2683.", - "tree": { - "sha": "299787ef96ed6acf408e95ff16cdad8089975ab8", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/299787ef96ed6acf408e95ff16cdad8089975ab8" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/a1e791acf894722b766eceb9e3c0b6eac209f0a8", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/a1e791acf894722b766eceb9e3c0b6eac209f0a8", - "html_url": "https://github.com/jqlang/jq/commit/a1e791acf894722b766eceb9e3c0b6eac209f0a8", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/a1e791acf894722b766eceb9e3c0b6eac209f0a8/comments", - "author": { - "login": "itchyny", - "id": 375258, - "node_id": "MDQ6VXNlcjM3NTI1OA==", - "avatar_url": "https://avatars.githubusercontent.com/u/375258?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/itchyny", - "html_url": "https://github.com/itchyny", - "followers_url": "https://api.github.com/users/itchyny/followers", - "following_url": "https://api.github.com/users/itchyny/following{/other_user}", - "gists_url": "https://api.github.com/users/itchyny/gists{/gist_id}", - "starred_url": "https://api.github.com/users/itchyny/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/itchyny/subscriptions", - "organizations_url": "https://api.github.com/users/itchyny/orgs", - "repos_url": "https://api.github.com/users/itchyny/repos", - "events_url": "https://api.github.com/users/itchyny/events{/privacy}", - "received_events_url": "https://api.github.com/users/itchyny/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "13fbe98dff927dbe6a3eddd89e4487af3f009185", - "url": "https://api.github.com/repos/jqlang/jq/commits/13fbe98dff927dbe6a3eddd89e4487af3f009185", - "html_url": "https://github.com/jqlang/jq/commit/13fbe98dff927dbe6a3eddd89e4487af3f009185" - } - ] - }, - { - "sha": "13fbe98dff927dbe6a3eddd89e4487af3f009185", - "node_id": "C_kwDOAE3WVdoAKDEzZmJlOThkZmY5MjdkYmU2YTNlZGRkODllNDQ4N2FmM2YwMDkxODU", - "commit": { - "author": { - "name": "pkoppstein", - "email": "pkoppstein@gmail.com", - "date": "2023-07-25T23:19:13Z" - }, - "committer": { - "name": "Nico Williams", - "email": "nico@cryptonector.com", - "date": "2023-07-26T04:43:57Z" - }, - "message": "manual.yml: remove contingent tests\n\nAlso clarify non-prescriptive nature of some tests in jq.test", - "tree": { - "sha": "afed1454ca2c9afda5f96bdcd4b3fb6b6f69f5ea", - "url": "https://api.github.com/repos/jqlang/jq/git/trees/afed1454ca2c9afda5f96bdcd4b3fb6b6f69f5ea" - }, - "url": "https://api.github.com/repos/jqlang/jq/git/commits/13fbe98dff927dbe6a3eddd89e4487af3f009185", - "comment_count": 0, - "verification": { - "verified": false, - "reason": "unsigned", - "signature": null, - "payload": null - } - }, - "url": "https://api.github.com/repos/jqlang/jq/commits/13fbe98dff927dbe6a3eddd89e4487af3f009185", - "html_url": "https://github.com/jqlang/jq/commit/13fbe98dff927dbe6a3eddd89e4487af3f009185", - "comments_url": "https://api.github.com/repos/jqlang/jq/commits/13fbe98dff927dbe6a3eddd89e4487af3f009185/comments", - "author": { - "login": "pkoppstein", - "id": 172847, - "node_id": "MDQ6VXNlcjE3Mjg0Nw==", - "avatar_url": "https://avatars.githubusercontent.com/u/172847?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/pkoppstein", - "html_url": "https://github.com/pkoppstein", - "followers_url": "https://api.github.com/users/pkoppstein/followers", - "following_url": "https://api.github.com/users/pkoppstein/following{/other_user}", - "gists_url": "https://api.github.com/users/pkoppstein/gists{/gist_id}", - "starred_url": "https://api.github.com/users/pkoppstein/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/pkoppstein/subscriptions", - "organizations_url": "https://api.github.com/users/pkoppstein/orgs", - "repos_url": "https://api.github.com/users/pkoppstein/repos", - "events_url": "https://api.github.com/users/pkoppstein/events{/privacy}", - "received_events_url": "https://api.github.com/users/pkoppstein/received_events", - "type": "User", - "site_admin": false - }, - "committer": { - "login": "nicowilliams", - "id": 604851, - "node_id": "MDQ6VXNlcjYwNDg1MQ==", - "avatar_url": "https://avatars.githubusercontent.com/u/604851?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/nicowilliams", - "html_url": "https://github.com/nicowilliams", - "followers_url": "https://api.github.com/users/nicowilliams/followers", - "following_url": "https://api.github.com/users/nicowilliams/following{/other_user}", - "gists_url": "https://api.github.com/users/nicowilliams/gists{/gist_id}", - "starred_url": "https://api.github.com/users/nicowilliams/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/nicowilliams/subscriptions", - "organizations_url": "https://api.github.com/users/nicowilliams/orgs", - "repos_url": "https://api.github.com/users/nicowilliams/repos", - "events_url": "https://api.github.com/users/nicowilliams/events{/privacy}", - "received_events_url": "https://api.github.com/users/nicowilliams/received_events", - "type": "User", - "site_admin": false - }, - "parents": [ - { - "sha": "7b725378b9803a1df74054ebd3d700d9daeb2049", - "url": "https://api.github.com/repos/jqlang/jq/commits/7b725378b9803a1df74054ebd3d700d9daeb2049", - "html_url": "https://github.com/jqlang/jq/commit/7b725378b9803a1df74054ebd3d700d9daeb2049" - } - ] - } -] diff --git a/examples/assets/seaCreatures.json b/examples/assets/seaCreatures.json deleted file mode 100644 index 6b3f6ad..0000000 --- a/examples/assets/seaCreatures.json +++ /dev/null @@ -1,6 +0,0 @@ -[ - { "name": "Sammy", "type": "shark", "clams": 5 }, - { "name": "Bubbles", "type": "orca", "clams": 3 }, - { "name": "Splish", "type": "dolphin", "clams": 2 }, - { "name": "Splash", "type": "dolphin", "clams": 2 } -] diff --git a/examples/async.ds b/examples/async.ds deleted file mode 100644 index b4097fe..0000000 --- a/examples/async.ds +++ /dev/null @@ -1,19 +0,0 @@ -create_random_numbers = (count ) { - numbers = [] - - while length(numbers) < count { - numbers += random:integer() - } - - output("Made " + length(numbers) + " numbers.") -} - -output("This will print first.") - -async { - create_random_numbers(1000) - create_random_numbers(100) - create_random_numbers(10) -} - -output("This will print last.") diff --git a/examples/async_commands.ds b/examples/async_commands.ds deleted file mode 100644 index aba65b0..0000000 --- a/examples/async_commands.ds +++ /dev/null @@ -1,17 +0,0 @@ -async { - { - ^echo 'Starting 1...' - ^sleep 1 - ^echo 'Finished 1.' - } - { - ^echo 'Starting 2...' - ^sleep 2 - ^echo 'Finished 2.' - } - { - ^echo 'Starting 3...' - ^sleep 3 - ^echo 'Finished 3.' - } -} diff --git a/examples/async_download.ds b/examples/async_download.ds deleted file mode 100644 index 5c17f4f..0000000 --- a/examples/async_download.ds +++ /dev/null @@ -1,20 +0,0 @@ -cast_len = 0 -characters_len = 0 -episodes_len = 0 - -async { - { - cast = download("https://api.sampleapis.com/futurama/cast") - cast_len = length(from_json(cast)) - } - { - characters = download("https://api.sampleapis.com/futurama/characters") - characters_len = length(from_json(characters)) - } - { - episodes = download("https://api.sampleapis.com/futurama/episodes") - episodes_len = length(from_json(episodes)) - } -} - -output ([cast_len, characters_len, episodes_len]) diff --git a/examples/clue_solver.ds b/examples/clue_solver.ds deleted file mode 100644 index 57ed983..0000000 --- a/examples/clue_solver.ds +++ /dev/null @@ -1,53 +0,0 @@ -cards = { - rooms = ['Library' 'Kitchen' 'Conservatory'] - suspects = ['White' 'Green' 'Scarlett'] - weapons = ['Rope' 'Lead_Pipe' 'Knife'] -} - -is_ready_to_solve = (cards ) { - (length(cards:suspects) == 1) - && (length(cards:rooms) == 1) - && (length(cards:weapons) == 1) -} - -remove_card = (cards , opponent_card ) { - cards:rooms -= opponent_card - cards:suspects -= opponent_card - cards:weapons -= opponent_card -} - -make_guess = (cards , current_room ) { - if is_ready_to_solve(cards) { - output( - 'I accuse ' - + cards:suspects:0 - + ' in the ' - + cards:rooms:0 - + ' with the ' - + cards:weapons:0 - + '!' - ) - } else { - output( - 'I question ' - + random:from(cards:suspects) - + ' in the ' - + current_room - + ' with the ' - + random:from(cards:weapons) - + '.' - ) - } -} - -take_turn = (cards , opponent_card , current_room ) { - remove_card(cards opponent_card) - make_guess(cards current_room) -} - -take_turn(cards 'Rope' 'Kitchen') -take_turn(cards 'Library' 'Kitchen') -take_turn(cards 'Conservatory' 'Kitchen') -take_turn(cards 'White' 'Kitchen') -take_turn(cards 'Green' 'Kitchen') -take_turn(cards 'Knife' 'Kitchen') diff --git a/examples/download.ds b/examples/download.ds deleted file mode 100644 index b824505..0000000 --- a/examples/download.ds +++ /dev/null @@ -1,10 +0,0 @@ -raw_data = download("https://api.sampleapis.com/futurama/cast") -cast_data = from_json(raw_data) - -names = [] - -for cast_member in cast_data { - names += cast_member:name -} - -assert_equal("Billy West", names:0) diff --git a/examples/fibonacci.ds b/examples/fibonacci.ds deleted file mode 100644 index 7d47b8f..0000000 --- a/examples/fibonacci.ds +++ /dev/null @@ -1,9 +0,0 @@ -fib = (i ) { - if i <= 1 { - 1 - } else { - fib(i - 1) + fib(i - 2) - } -} - -fib(8) diff --git a/examples/fizzbuzz.ds b/examples/fizzbuzz.ds deleted file mode 100644 index 28211cc..0000000 --- a/examples/fizzbuzz.ds +++ /dev/null @@ -1,18 +0,0 @@ -count = 1 - -while count <= 15 { - divides_by_3 = count % 3 == 0 - divides_by_5 = count % 5 == 0 - - if divides_by_3 && divides_by_5 { - output('fizzbuzz') - } else if divides_by_3 { - output('fizz') - } else if divides_by_5 { - output('buzz') - } else { - output(count) - } - - count += 1 -} diff --git a/examples/guessing_game.ds b/examples/guessing_game.ds deleted file mode 100644 index 3655ecc..0000000 --- a/examples/guessing_game.ds +++ /dev/null @@ -1,26 +0,0 @@ -# This is a Dust version of an example from the Rust Book. -# -# https://doc.rust-lang.org/book/ch02-00-guessing-game-tutorial.html - -output("Guess the number.") - -secret_number = int:random_range(0..=100) - -loop { - output("Please input your guess.") - - input = io:stdin():expect("Failed to read line.") - guess = int:parse(input) - - output("You guessed: " + guess) - - match cmp(guess, secret_number) { - Ordering::Less -> output("Too small!") - Ordering::Greater -> output("Too big!") - Ordering::Equal -> { - output("You win!") - break - } - } -} - diff --git a/examples/hello_world.ds b/examples/hello_world.ds deleted file mode 100644 index 099542b..0000000 --- a/examples/hello_world.ds +++ /dev/null @@ -1 +0,0 @@ -output('Hello, world!') diff --git a/examples/jq_data.ds b/examples/jq_data.ds deleted file mode 100644 index d5292b0..0000000 --- a/examples/jq_data.ds +++ /dev/null @@ -1,12 +0,0 @@ -data = json:parse(fs:read_file('examples/assets/jq_data.json')) - -new_data = [] - -for commit_data in data as collection { - new_data += { - message = commit_data:commit:message - name = commit_data:commit:committer:name - } -} - -new_data diff --git a/examples/random.ds b/examples/random.ds deleted file mode 100644 index fb07cf1..0000000 --- a/examples/random.ds +++ /dev/null @@ -1,13 +0,0 @@ -stuff = [ - random:integer() - random:integer() - random:integer() - random:float() - random:float() - random:float() - random:boolean() - random:boolean() - random:boolean() -] - -random:from(stuff) diff --git a/examples/sea_creatures.ds b/examples/sea_creatures.ds deleted file mode 100644 index 2e4d446..0000000 --- a/examples/sea_creatures.ds +++ /dev/null @@ -1,19 +0,0 @@ -raw_data = fs:read_file('examples/assets/seaCreatures.json') -sea_creatures = json:parse(raw_data) - -data = { - creatures = [] - total_clams = 0 - dolphin_clams = 0 -} - -for creature in sea_creatures { - data:creatures += creature:name - data:total_clams += creature:clams - - if creature:type == 'dolphin' { - data:dolphin_clams += creature:clams - } -} - -data diff --git a/scripts/bench.fish b/scripts/bench.fish deleted file mode 100755 index 6db5f1a..0000000 --- a/scripts/bench.fish +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/fish -# This script is has the following prerequisites (aside from fish): -# - hyperfine -# - dust (can be installed with "cargo install dust-lang") -# - jq -# - nodejs -# - nushell -# - dielectron.json (can be downloaded from https://opendata.cern.ch/record/304) - -hyperfine \ - --shell none \ - --parameter-list data_path examples/assets/seaCreatures.json \ - --warmup 3 \ - "target/release/dust -c 'length(json:parse(fs:read_file(\"{data_path}\")))'" \ - "jq 'length' {data_path}" \ - "node --eval \"require('node:fs').readFile('{data_path}', (err, data)=>{console.log(JSON.parse(data).length)})\"" \ - "nu -c 'open {data_path} | length'" - -hyperfine \ - --shell none \ - --parameter-list data_path examples/assets/jq_data.json \ - --warmup 3 \ - "target/release/dust -c 'length(json:parse(fs:read_file(\"{data_path}\")))'" \ - "jq 'length' {data_path}" \ - "node --eval \"require('node:fs').readFile('{data_path}', (err, data)=>{console.log(JSON.parse(data).length)})\"" \ - "nu -c 'open {data_path} | length'" - -hyperfine \ - --shell none \ - --parameter-list data_path dielectron.json \ - --warmup 3 \ - "target/release/dust -c 'length(json:parse(fs:read_file(\"{data_path}\")))'" \ - "jq 'length' {data_path}" \ - "node --eval \"require('node:fs').readFile('{data_path}', (err, data)=>{console.log(JSON.parse(data).length)})\"" \ - "nu -c 'open {data_path} | length'" diff --git a/scripts/build_debug.fish b/scripts/build_debug.fish deleted file mode 100755 index 133ba25..0000000 --- a/scripts/build_debug.fish +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/fish -# Build the project in debug mode. - -cd tree-sitter-dust/ -tree-sitter generate --debug-build --no-bindings - -cd .. -cargo build diff --git a/scripts/build_release.fish b/scripts/build_release.fish deleted file mode 100755 index 2418e9c..0000000 --- a/scripts/build_release.fish +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/fish -# Build the project in release mode. - -cd tree-sitter-dust/ -tree-sitter generate --no-bindings - -cd .. -cargo build --release diff --git a/scripts/test.fish b/scripts/test.fish deleted file mode 100755 index 39698b9..0000000 --- a/scripts/test.fish +++ /dev/null @@ -1,9 +0,0 @@ -#!/usr/bin/fish -# Build the project in debug mode. - -cd tree-sitter-dust/ -tree-sitter generate --debug-build --no-bindings -tree-sitter test - -cd .. -cargo test diff --git a/src/abstract_tree/as.rs b/src/abstract_tree/as.rs deleted file mode 100644 index db33b07..0000000 --- a/src/abstract_tree/as.rs +++ /dev/null @@ -1,132 +0,0 @@ -use serde::{Deserialize, Serialize}; -use tree_sitter::Node; - -use crate::{ - error::{RuntimeError, SyntaxError, ValidationError}, - AbstractTree, Context, Expression, Format, List, SourcePosition, Type, Value, -}; - -#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq, PartialOrd, Ord)] -pub struct As { - expression: Expression, - r#type: Type, - position: SourcePosition, -} - -impl AbstractTree for As { - fn from_syntax(node: Node, source: &str, context: &Context) -> Result { - SyntaxError::expect_syntax_node("as", node)?; - - let expression_node = node.child(0).unwrap(); - let expression = Expression::from_syntax(expression_node, source, context)?; - - let type_node = node.child(2).unwrap(); - let r#type = Type::from_syntax(type_node, source, context)?; - - Ok(As { - expression, - r#type, - position: SourcePosition::from(node.range()), - }) - } - - fn expected_type(&self, _context: &Context) -> Result { - Ok(self.r#type.clone()) - } - - fn validate(&self, _source: &str, context: &Context) -> Result<(), ValidationError> { - let initial_type = self.expression.expected_type(context)?; - - if self.r#type.accepts(&initial_type) { - return Ok(()); - } - - if let Type::ListOf(item_type) = &self.r#type { - match &initial_type { - Type::ListOf(expected_item_type) => { - println!("{item_type} {expected_item_type}"); - - if !item_type.accepts(&expected_item_type) { - return Err(ValidationError::TypeCheck { - expected: self.r#type.clone(), - actual: initial_type.clone(), - position: self.position, - }); - } - } - Type::String => { - if let Type::String = item_type.as_ref() { - } else { - return Err(ValidationError::ConversionImpossible { - initial_type, - target_type: self.r#type.clone(), - }); - } - } - - Type::Any => { - // Do no validation when converting from "any" to a list. - // This effectively defers to runtime behavior, potentially - // causing a runtime error. - } - _ => { - return Err(ValidationError::ConversionImpossible { - initial_type, - target_type: self.r#type.clone(), - }) - } - } - } - - Ok(()) - } - - fn run(&self, source: &str, context: &Context) -> Result { - let value = self.expression.run(source, context)?; - let converted_value = if self.r#type.accepts(&value.r#type()?) { - return Ok(value); - } else if let Type::ListOf(_) = self.r#type { - match value { - Value::List(list) => Value::List(list), - Value::String(string) => { - let chars = string - .read()? - .chars() - .map(|char| Value::string(char)) - .collect(); - - Value::List(List::with_items(chars)) - } - _ => { - return Err(RuntimeError::ConversionImpossible { - from: value.r#type()?, - to: self.r#type.clone(), - position: self.position.clone(), - }); - } - } - } else if let Type::Integer = self.r#type { - match value { - Value::Integer(integer) => Value::Integer(integer), - Value::Float(float) => Value::Integer(float as i64), - _ => { - return Err(RuntimeError::ConversionImpossible { - from: value.r#type()?, - to: self.r#type.clone(), - position: self.position.clone(), - }) - } - } - } else { - todo!() - }; - - Ok(converted_value) - } -} - -impl Format for As { - fn format(&self, _output: &mut String, _indent_level: u8) { - todo!() - } -} diff --git a/src/abstract_tree/assignment.rs b/src/abstract_tree/assignment.rs deleted file mode 100644 index 2edb2a3..0000000 --- a/src/abstract_tree/assignment.rs +++ /dev/null @@ -1,186 +0,0 @@ -use serde::{Deserialize, Serialize}; - -use crate::{ - context::Context, - error::{RuntimeError, SyntaxError, ValidationError}, - AbstractTree, AssignmentOperator, Format, Function, Identifier, SourcePosition, Statement, - SyntaxNode, Type, TypeSpecification, Value, -}; - -/// Variable assignment, including add-assign and subtract-assign operations. -#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq, PartialOrd, Ord)] -pub struct Assignment { - identifier: Identifier, - type_specification: Option, - operator: AssignmentOperator, - statement: Statement, - syntax_position: SourcePosition, -} - -impl AbstractTree for Assignment { - fn from_syntax( - syntax_node: SyntaxNode, - source: &str, - context: &Context, - ) -> Result { - SyntaxError::expect_syntax_node("assignment", syntax_node)?; - - let child_count = syntax_node.child_count(); - - let identifier_node = syntax_node.child(0).unwrap(); - let identifier = Identifier::from_syntax(identifier_node, source, context)?; - - let type_node = syntax_node.child(1).unwrap(); - let type_specification = if type_node.kind() == "type_specification" { - Some(TypeSpecification::from_syntax(type_node, source, context)?) - } else { - None - }; - - let operator_node = syntax_node.child(child_count - 2).unwrap(); - let operator = AssignmentOperator::from_syntax(operator_node, source, context)?; - - let statement_node = syntax_node.child(child_count - 1).unwrap(); - let statement = Statement::from_syntax(statement_node, source, context)?; - - Ok(Assignment { - identifier, - type_specification, - operator, - statement, - syntax_position: syntax_node.range().into(), - }) - } - - fn validate(&self, source: &str, context: &Context) -> Result<(), ValidationError> { - if let AssignmentOperator::Equal = self.operator { - let r#type = if let Some(definition) = &self.type_specification { - definition.inner().clone() - } else { - self.statement.expected_type(context)? - }; - - log::info!("Setting type: {} <{}>", self.identifier, r#type); - - context.set_type(self.identifier.clone(), r#type)?; - } - - if let Some(type_specification) = &self.type_specification { - match self.operator { - AssignmentOperator::Equal => { - let expected = type_specification.inner(); - let actual = self.statement.expected_type(context)?; - - if !expected.accepts(&actual) { - return Err(ValidationError::TypeCheck { - expected: expected.clone(), - actual, - position: self.syntax_position, - }); - } - } - AssignmentOperator::PlusEqual => { - if let Type::ListOf(expected) = type_specification.inner() { - let actual = self.identifier.expected_type(context)?; - - if !expected.accepts(&actual) { - return Err(ValidationError::TypeCheck { - expected: expected.as_ref().clone(), - actual, - position: self.syntax_position, - }); - } - } else { - let expected = type_specification.inner(); - let actual = self.identifier.expected_type(context)?; - - if !expected.accepts(&actual) { - return Err(ValidationError::TypeCheck { - expected: expected.clone(), - actual, - position: self.syntax_position, - }); - } - } - } - AssignmentOperator::MinusEqual => todo!(), - } - } else { - match self.operator { - AssignmentOperator::Equal => {} - AssignmentOperator::PlusEqual => { - if let Type::ListOf(expected) = self.identifier.expected_type(context)? { - let actual = self.statement.expected_type(context)?; - - if !expected.accepts(&actual) { - return Err(ValidationError::TypeCheck { - expected: expected.as_ref().clone(), - actual, - position: self.syntax_position, - }); - } - } - } - AssignmentOperator::MinusEqual => todo!(), - } - } - - self.statement.validate(source, context)?; - - Ok(()) - } - - fn run(&self, source: &str, context: &Context) -> Result { - let right = self.statement.run(source, context)?; - - let new_value = match self.operator { - AssignmentOperator::PlusEqual => { - let left = self.identifier.run(source, context)?; - - left.add(right, self.syntax_position)? - } - AssignmentOperator::MinusEqual => { - if let Some(left) = context.get_value(&self.identifier)? { - left.subtract(right, self.syntax_position)? - } else { - return Err(RuntimeError::ValidationFailure( - ValidationError::VariableIdentifierNotFound(self.identifier.clone()), - )); - } - } - AssignmentOperator::Equal => right, - }; - - if let Value::Function(Function::ContextDefined(function_node)) = &new_value { - function_node - .context() - .set_value(self.identifier.clone(), new_value.clone())?; - } - - log::info!("RUN assignment: {} = {}", self.identifier, new_value); - - context.set_value(self.identifier.clone(), new_value)?; - - Ok(Value::none()) - } - - fn expected_type(&self, _context: &Context) -> Result { - Ok(Type::None) - } -} - -impl Format for Assignment { - fn format(&self, output: &mut String, indent_level: u8) { - self.identifier.format(output, indent_level); - - if let Some(type_specification) = &self.type_specification { - type_specification.format(output, indent_level); - } - - output.push(' '); - self.operator.format(output, indent_level); - output.push(' '); - - self.statement.format(output, 0); - } -} diff --git a/src/abstract_tree/assignment_operator.rs b/src/abstract_tree/assignment_operator.rs deleted file mode 100644 index 3e0f29a..0000000 --- a/src/abstract_tree/assignment_operator.rs +++ /dev/null @@ -1,62 +0,0 @@ -use serde::{Deserialize, Serialize}; - -use crate::{ - error::{RuntimeError, SyntaxError, ValidationError}, - AbstractTree, Context, Format, SyntaxNode, Type, Value, -}; - -/// Operators that be used in an assignment statement. -#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq, PartialOrd, Ord)] -pub enum AssignmentOperator { - Equal, - PlusEqual, - MinusEqual, -} - -impl AbstractTree for AssignmentOperator { - fn from_syntax( - node: SyntaxNode, - _source: &str, - _context: &Context, - ) -> Result { - SyntaxError::expect_syntax_node("assignment_operator", node)?; - - let operator_node = node.child(0).unwrap(); - let operator = match operator_node.kind() { - "=" => AssignmentOperator::Equal, - "+=" => AssignmentOperator::PlusEqual, - "-=" => AssignmentOperator::MinusEqual, - _ => { - return Err(SyntaxError::UnexpectedSyntaxNode { - expected: "=, += or -=".to_string(), - actual: operator_node.kind().to_string(), - position: node.range().into(), - }) - } - }; - - Ok(operator) - } - - fn run(&self, _source: &str, _context: &Context) -> Result { - Ok(Value::none()) - } - - fn expected_type(&self, _context: &Context) -> Result { - Ok(Type::None) - } - - fn validate(&self, _source: &str, _context: &Context) -> Result<(), ValidationError> { - Ok(()) - } -} - -impl Format for AssignmentOperator { - fn format(&self, output: &mut String, _indent_level: u8) { - match self { - AssignmentOperator::Equal => output.push('='), - AssignmentOperator::PlusEqual => output.push_str("+="), - AssignmentOperator::MinusEqual => output.push_str("-="), - } - } -} diff --git a/src/abstract_tree/block.rs b/src/abstract_tree/block.rs deleted file mode 100644 index 10fdbe4..0000000 --- a/src/abstract_tree/block.rs +++ /dev/null @@ -1,170 +0,0 @@ -use std::{ - fmt::{self, Formatter}, - sync::RwLock, -}; - -use rayon::prelude::*; -use serde::{Deserialize, Serialize}; - -use crate::{ - error::{rw_lock_error::RwLockError, RuntimeError, SyntaxError, ValidationError}, - AbstractTree, Context, Format, Statement, SyntaxNode, Type, Value, -}; - -/// Abstract representation of a block. -/// -/// A block is almost identical to the root except that it must have curly -/// braces and can optionally be asynchronous. A block evaluates to the value of -/// its final statement but an async block will short-circuit if a statement -/// results in an error. Note that this will be the first statement to encounter -/// an error at runtime, not necessarilly the first statement as they are -/// written. -#[derive(Clone, Serialize, Deserialize, Eq, PartialEq, PartialOrd, Ord)] -pub struct Block { - is_async: bool, - contains_return: bool, - statements: Vec, -} - -impl Block { - pub fn contains_return(&self) -> bool { - self.contains_return - } -} - -impl AbstractTree for Block { - fn from_syntax(node: SyntaxNode, source: &str, context: &Context) -> Result { - SyntaxError::expect_syntax_node("block", node)?; - - let first_child = node.child(0).unwrap(); - let is_async = first_child.kind() == "async"; - let mut contains_return = false; - - let statement_count = if is_async { - node.child_count() - 3 - } else { - node.child_count() - 2 - }; - let mut statements = Vec::with_capacity(statement_count); - let block_context = Context::with_variables_from(context)?; - - for index in 1..node.child_count() - 1 { - let child_node = node.child(index).unwrap(); - - if child_node.kind() == "statement" { - let statement = Statement::from_syntax(child_node, source, &block_context)?; - - if statement.is_return() { - contains_return = true; - } - - statements.push(statement); - } - } - - Ok(Block { - is_async, - contains_return, - statements, - }) - } - - fn validate(&self, _source: &str, _context: &Context) -> Result<(), ValidationError> { - for statement in &self.statements { - statement.validate(_source, _context)?; - } - - Ok(()) - } - - fn run(&self, _source: &str, _context: &Context) -> Result { - if self.is_async { - let statements = &self.statements; - let final_result = RwLock::new(Ok(Value::none())); - - statements - .into_par_iter() - .enumerate() - .find_map_first(|(index, statement)| { - let result = statement.run(_source, _context); - let should_return = if self.contains_return { - statement.is_return() - } else { - index == statements.len() - 1 - }; - - if should_return { - let get_write_lock = final_result.write(); - - match get_write_lock { - Ok(mut final_result) => { - *final_result = result; - None - } - Err(_error) => Some(Err(RuntimeError::RwLock(RwLockError))), - } - } else { - None - } - }) - .unwrap_or(final_result.into_inner().map_err(|_| RwLockError)?) - } else { - for (index, statement) in self.statements.iter().enumerate() { - if statement.is_return() { - return statement.run(_source, _context); - } - - if index == self.statements.len() - 1 { - return statement.run(_source, _context); - } - } - - Ok(Value::none()) - } - } - - fn expected_type(&self, _context: &Context) -> Result { - for (index, statement) in self.statements.iter().enumerate() { - if statement.is_return() { - return statement.expected_type(_context); - } - - if index == self.statements.len() - 1 { - return statement.expected_type(_context); - } - } - - Ok(Type::None) - } -} - -impl Format for Block { - fn format(&self, output: &mut String, indent_level: u8) { - if self.is_async { - output.push_str("async {\n"); - } else { - output.push_str("{\n"); - } - - for (index, statement) in self.statements.iter().enumerate() { - if index > 0 { - output.push('\n'); - } - - statement.format(output, indent_level + 1); - } - - output.push('\n'); - Block::indent(output, indent_level); - output.push('}'); - } -} - -impl fmt::Debug for Block { - fn fmt(&self, f: &mut Formatter) -> fmt::Result { - f.debug_struct("Block") - .field("is_async", &self.is_async) - .field("statements", &self.statements) - .finish() - } -} diff --git a/src/abstract_tree/command.rs b/src/abstract_tree/command.rs deleted file mode 100644 index cae3fc4..0000000 --- a/src/abstract_tree/command.rs +++ /dev/null @@ -1,76 +0,0 @@ -use std::process::{self, Stdio}; - -use serde::{Deserialize, Serialize}; -use tree_sitter::Node as SyntaxNode; - -use crate::{ - error::{RuntimeError, SyntaxError, ValidationError}, - AbstractTree, Context, Format, Type, Value, -}; - -/// An external program invokation. -#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq, PartialOrd, Ord)] -pub struct Command { - command_text: String, - command_arguments: Vec, -} - -impl AbstractTree for Command { - fn from_syntax( - node: SyntaxNode, - source: &str, - _context: &Context, - ) -> Result { - SyntaxError::expect_syntax_node("command", node)?; - - let command_text_node = node.child(1).unwrap(); - let command_text = source[command_text_node.byte_range()].to_string(); - - let mut command_arguments = Vec::new(); - - for index in 2..node.child_count() { - let text_node = node.child(index).unwrap(); - let mut text = source[text_node.byte_range()].to_string(); - - if (text.starts_with('\'') && text.ends_with('\'')) - || (text.starts_with('"') && text.ends_with('"')) - || (text.starts_with('`') && text.ends_with('`')) - { - text = text[1..text.len() - 1].to_string(); - } - - command_arguments.push(text); - } - - Ok(Command { - command_text, - command_arguments, - }) - } - - fn expected_type(&self, _context: &Context) -> Result { - Ok(Type::String) - } - - fn validate(&self, _source: &str, _context: &Context) -> Result<(), ValidationError> { - Ok(()) - } - - fn run(&self, _source: &str, _context: &Context) -> Result { - let output = process::Command::new(&self.command_text) - .args(&self.command_arguments) - .stdout(Stdio::piped()) - .stderr(Stdio::inherit()) - .spawn()? - .wait_with_output()? - .stdout; - - Ok(Value::string(String::from_utf8(output)?)) - } -} - -impl Format for Command { - fn format(&self, _output: &mut String, _indent_level: u8) { - todo!() - } -} diff --git a/src/abstract_tree/enum_defintion.rs b/src/abstract_tree/enum_defintion.rs deleted file mode 100644 index 014218d..0000000 --- a/src/abstract_tree/enum_defintion.rs +++ /dev/null @@ -1,92 +0,0 @@ -use serde::{Deserialize, Serialize}; -use tree_sitter::Node as SyntaxNode; - -use crate::{ - error::{RuntimeError, SyntaxError, ValidationError}, - AbstractTree, Context, EnumInstance, Format, Identifier, Type, TypeDefinition, Value, -}; - -#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq, PartialOrd, Ord)] -pub struct EnumDefinition { - identifier: Identifier, - variants: Vec<(Identifier, Vec)>, -} - -impl EnumDefinition { - pub fn new(identifier: Identifier, variants: Vec<(Identifier, Vec)>) -> Self { - Self { - identifier, - variants, - } - } - - pub fn instantiate(&self, variant: Identifier, content: Option) -> EnumInstance { - EnumInstance::new(self.identifier.clone(), variant, content) - } - - pub fn identifier(&self) -> &Identifier { - &self.identifier - } - - pub fn variants(&self) -> &Vec<(Identifier, Vec)> { - &self.variants - } -} - -impl AbstractTree for EnumDefinition { - fn from_syntax(node: SyntaxNode, source: &str, context: &Context) -> Result { - SyntaxError::expect_syntax_node("enum_definition", node)?; - - let identifier_node = node.child(1).unwrap(); - let identifier = Identifier::from_syntax(identifier_node, source, context)?; - - let mut variants = Vec::new(); - let mut current_identifier: Option = None; - let mut types = Vec::new(); - - for index in 3..node.child_count() - 1 { - let child = node.child(index).unwrap(); - - if child.kind() == "identifier" { - if let Some(identifier) = ¤t_identifier { - variants.push((identifier.clone(), types)); - } - - current_identifier = Some(Identifier::from_syntax(child, source, context)?); - types = Vec::new(); - } - - if child.kind() == "type" { - let r#type = Type::from_syntax(child, source, context)?; - - types.push(r#type); - } - } - - Ok(EnumDefinition { - identifier, - variants, - }) - } - - fn expected_type(&self, _context: &Context) -> Result { - Ok(Type::None) - } - - fn validate(&self, _source: &str, context: &Context) -> Result<(), ValidationError> { - context.set_definition(self.identifier.clone(), TypeDefinition::Enum(self.clone()))?; - self.identifier.validate(_source, context)?; - - Ok(()) - } - - fn run(&self, _source: &str, _context: &Context) -> Result { - Ok(Value::none()) - } -} - -impl Format for EnumDefinition { - fn format(&self, _output: &mut String, _indent_level: u8) { - todo!() - } -} diff --git a/src/abstract_tree/enum_pattern.rs b/src/abstract_tree/enum_pattern.rs deleted file mode 100644 index e14b2c3..0000000 --- a/src/abstract_tree/enum_pattern.rs +++ /dev/null @@ -1,70 +0,0 @@ -use serde::{Deserialize, Serialize}; -use tree_sitter::Node as SyntaxNode; - -use crate::{ - error::{RuntimeError, SyntaxError, ValidationError}, - AbstractTree, Context, Format, Identifier, Type, Value, -}; - -#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq, PartialOrd, Ord)] -pub struct EnumPattern { - name: Identifier, - variant: Identifier, - inner_identifier: Option, -} - -impl EnumPattern { - pub fn name(&self) -> &Identifier { - &self.name - } - - pub fn variant(&self) -> &Identifier { - &self.variant - } - - pub fn inner_identifier(&self) -> &Option { - &self.inner_identifier - } -} - -impl AbstractTree for EnumPattern { - fn from_syntax(node: SyntaxNode, source: &str, context: &Context) -> Result { - SyntaxError::expect_syntax_node("enum_pattern", node)?; - - let enum_name_node = node.child(0).unwrap(); - let name = Identifier::from_syntax(enum_name_node, source, context)?; - - let enum_variant_node = node.child(2).unwrap(); - let variant = Identifier::from_syntax(enum_variant_node, source, context)?; - - let inner_identifier = if let Some(child) = node.child(4) { - Some(Identifier::from_syntax(child, source, context)?) - } else { - None - }; - - Ok(EnumPattern { - name, - variant, - inner_identifier, - }) - } - - fn expected_type(&self, _context: &Context) -> Result { - Ok(Type::None) - } - - fn validate(&self, _source: &str, _context: &Context) -> Result<(), ValidationError> { - Ok(()) - } - - fn run(&self, _source: &str, _context: &Context) -> Result { - Ok(Value::none()) - } -} - -impl Format for EnumPattern { - fn format(&self, _output: &mut String, _indent_level: u8) { - todo!() - } -} diff --git a/src/abstract_tree/expression.rs b/src/abstract_tree/expression.rs deleted file mode 100644 index 5f400ed..0000000 --- a/src/abstract_tree/expression.rs +++ /dev/null @@ -1,120 +0,0 @@ -use serde::{Deserialize, Serialize}; - -use crate::{ - error::{RuntimeError, SyntaxError, ValidationError}, - value_node::ValueNode, - AbstractTree, As, Command, Context, Format, FunctionCall, Identifier, Index, Logic, Math, - SyntaxNode, Type, Value, -}; - -/// Abstract representation of an expression statement. -/// -/// Unlike statements, which can involve complex logic, an expression is -/// expected to evaluate to a value. However, an expression can still contain -/// nested statements and may evaluate to an empty value. -#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq, PartialOrd, Ord)] -pub enum Expression { - Value(ValueNode), - Identifier(Identifier), - Index(Box), - Math(Box), - Logic(Box), - FunctionCall(Box), - Command(Command), - As(Box), -} - -impl AbstractTree for Expression { - fn from_syntax( - node: SyntaxNode, - source: &str, - _context: &Context, - ) -> Result { - SyntaxError::expect_syntax_node("expression", node)?; - - let child = if node.child(0).unwrap().is_named() { - node.child(0).unwrap() - } else { - node.child(1).unwrap() - }; - - let expression = match child.kind() { - "as" => Expression::As(Box::new(As::from_syntax(child, source, _context)?)), - "value" => Expression::Value(ValueNode::from_syntax(child, source, _context)?), - "identifier" => { - Expression::Identifier(Identifier::from_syntax(child, source, _context)?) - } - "index" => Expression::Index(Box::new(Index::from_syntax(child, source, _context)?)), - "math" => Expression::Math(Box::new(Math::from_syntax(child, source, _context)?)), - "logic" => Expression::Logic(Box::new(Logic::from_syntax(child, source, _context)?)), - "function_call" => Expression::FunctionCall(Box::new(FunctionCall::from_syntax( - child, source, _context, - )?)), - "command" => Expression::Command(Command::from_syntax(child, source, _context)?), - _ => { - return Err(SyntaxError::UnexpectedSyntaxNode { - expected: "value, identifier, index, math, logic, function call, as or command" - .to_string(), - actual: child.kind().to_string(), - position: node.range().into(), - }) - } - }; - - Ok(expression) - } - - fn expected_type(&self, _context: &Context) -> Result { - match self { - Expression::Value(value_node) => value_node.expected_type(_context), - Expression::Identifier(identifier) => identifier.expected_type(_context), - Expression::Math(math) => math.expected_type(_context), - Expression::Logic(logic) => logic.expected_type(_context), - Expression::FunctionCall(function_call) => function_call.expected_type(_context), - Expression::Index(index) => index.expected_type(_context), - Expression::Command(command) => command.expected_type(_context), - Expression::As(r#as) => r#as.expected_type(_context), - } - } - - fn validate(&self, _source: &str, _context: &Context) -> Result<(), ValidationError> { - match self { - Expression::Value(value_node) => value_node.validate(_source, _context), - Expression::Identifier(identifier) => identifier.validate(_source, _context), - Expression::Math(math) => math.validate(_source, _context), - Expression::Logic(logic) => logic.validate(_source, _context), - Expression::FunctionCall(function_call) => function_call.validate(_source, _context), - Expression::Index(index) => index.validate(_source, _context), - Expression::Command(command) => command.validate(_source, _context), - Expression::As(r#as) => r#as.validate(_source, _context), - } - } - - fn run(&self, _source: &str, _context: &Context) -> Result { - match self { - Expression::Value(value_node) => value_node.run(_source, _context), - Expression::Identifier(identifier) => identifier.run(_source, _context), - Expression::Math(math) => math.run(_source, _context), - Expression::Logic(logic) => logic.run(_source, _context), - Expression::FunctionCall(function_call) => function_call.run(_source, _context), - Expression::Index(index) => index.run(_source, _context), - Expression::Command(command) => command.run(_source, _context), - Expression::As(r#as) => r#as.run(_source, _context), - } - } -} - -impl Format for Expression { - fn format(&self, _output: &mut String, _indent_level: u8) { - match self { - Expression::Value(value_node) => value_node.format(_output, _indent_level), - Expression::Identifier(identifier) => identifier.format(_output, _indent_level), - Expression::Math(math) => math.format(_output, _indent_level), - Expression::Logic(logic) => logic.format(_output, _indent_level), - Expression::FunctionCall(function_call) => function_call.format(_output, _indent_level), - Expression::Index(index) => index.format(_output, _indent_level), - Expression::Command(command) => command.format(_output, _indent_level), - Expression::As(r#as) => r#as.format(_output, _indent_level), - } - } -} diff --git a/src/abstract_tree/for.rs b/src/abstract_tree/for.rs deleted file mode 100644 index 24a2ed2..0000000 --- a/src/abstract_tree/for.rs +++ /dev/null @@ -1,153 +0,0 @@ -use rayon::prelude::*; -use serde::{Deserialize, Serialize}; - -use crate::{ - error::{RuntimeError, SyntaxError, ValidationError}, - AbstractTree, Block, Context, Expression, Format, Identifier, SourcePosition, SyntaxNode, Type, - Value, -}; - -/// Abstract representation of a for loop statement. -#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq, PartialOrd, Ord)] -pub struct For { - is_async: bool, - item_id: Identifier, - collection: Expression, - block: Block, - source_position: SourcePosition, - - #[serde(skip)] - context: Context, -} - -impl AbstractTree for For { - fn from_syntax(node: SyntaxNode, source: &str, context: &Context) -> Result { - SyntaxError::expect_syntax_node("for", node)?; - - let for_node = node.child(0).unwrap(); - let is_async = match for_node.kind() { - "for" => false, - "async for" => true, - _ => { - return Err(SyntaxError::UnexpectedSyntaxNode { - expected: "for or async for".to_string(), - actual: for_node.kind().to_string(), - position: node.range().into(), - }) - } - }; - - let identifier_node = node.child(1).unwrap(); - let identifier = Identifier::from_syntax(identifier_node, source, context)?; - - let expression_node = node.child(3).unwrap(); - let expression = Expression::from_syntax(expression_node, source, context)?; - - let loop_context = Context::with_variables_from(context)?; - - let item_node = node.child(4).unwrap(); - let item = Block::from_syntax(item_node, source, &loop_context)?; - - Ok(For { - is_async, - item_id: identifier, - collection: expression, - block: item, - source_position: SourcePosition::from(node.range()), - context: loop_context, - }) - } - - fn expected_type(&self, _context: &Context) -> Result { - Ok(Type::None) - } - - fn validate(&self, _source: &str, context: &Context) -> Result<(), ValidationError> { - self.collection.validate(_source, context)?; - - let collection_type = self.collection.expected_type(context)?; - let item_type = match collection_type { - Type::Any => Type::Any, - Type::Collection => Type::Any, - Type::List => Type::Any, - Type::ListOf(_) => todo!(), - Type::ListExact(_) => todo!(), - Type::Map(_) => todo!(), - Type::String => todo!(), - Type::Range => todo!(), - _ => { - return Err(ValidationError::TypeCheck { - expected: Type::Collection, - actual: collection_type, - position: self.source_position, - }); - } - }; - let key = self.item_id.clone(); - - self.context.inherit_all_from(context)?; - self.context.set_type(key, item_type)?; - self.item_id.validate(_source, &self.context)?; - self.block.validate(_source, &self.context) - } - - fn run(&self, source: &str, context: &Context) -> Result { - self.context.inherit_all_from(context)?; - - let expression_run = self.collection.run(source, context)?; - let key = &self.item_id; - - if let Value::Range(range) = expression_run { - if self.is_async { - range.into_par_iter().try_for_each(|integer| { - self.context.add_allowance(key)?; - self.context - .set_value(key.clone(), Value::Integer(integer))?; - self.block.run(source, &self.context).map(|_value| ()) - })?; - } else { - for i in range { - self.context.add_allowance(key)?; - self.context.set_value(key.clone(), Value::Integer(i))?; - self.block.run(source, &self.context)?; - } - } - - return Ok(Value::none()); - } - - if let Value::List(list) = &expression_run { - if self.is_async { - list.items()?.par_iter().try_for_each(|value| { - self.context.add_allowance(key)?; - self.context.set_value(key.clone(), value.clone())?; - self.block.run(source, &self.context).map(|_value| ()) - })?; - } else { - for value in list.items()?.iter() { - self.context.add_allowance(key)?; - self.context.set_value(key.clone(), value.clone())?; - self.block.run(source, &self.context)?; - } - } - } - - Ok(Value::none()) - } -} - -impl Format for For { - fn format(&self, output: &mut String, indent_level: u8) { - if self.is_async { - output.push_str("async for "); - } else { - output.push_str("for "); - } - - self.item_id.format(output, indent_level); - output.push_str(" in "); - self.collection.format(output, indent_level); - output.push(' '); - self.block.format(output, indent_level); - } -} diff --git a/src/abstract_tree/function_call.rs b/src/abstract_tree/function_call.rs deleted file mode 100644 index 1e538fe..0000000 --- a/src/abstract_tree/function_call.rs +++ /dev/null @@ -1,202 +0,0 @@ -use serde::{Deserialize, Serialize}; - -use crate::{ - built_in_functions::Callable, - error::{RuntimeError, SyntaxError, ValidationError}, - AbstractTree, Context, Expression, Format, Function, FunctionExpression, SourcePosition, - SyntaxNode, Type, Value, -}; - -/// A function being invoked and the arguments it is being passed. -#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq, PartialOrd, Ord)] -pub struct FunctionCall { - function_expression: FunctionExpression, - arguments: Vec, - syntax_position: SourcePosition, -} - -impl FunctionCall { - /// Returns a new FunctionCall. - pub fn new( - function_expression: FunctionExpression, - arguments: Vec, - syntax_position: SourcePosition, - ) -> Self { - Self { - function_expression, - arguments, - syntax_position, - } - } -} - -impl AbstractTree for FunctionCall { - fn from_syntax(node: SyntaxNode, source: &str, context: &Context) -> Result { - SyntaxError::expect_syntax_node("function_call", node)?; - - let function_node = node.child(0).unwrap(); - let function_expression = FunctionExpression::from_syntax(function_node, source, context)?; - - let mut arguments = Vec::new(); - - for index in 2..node.child_count() - 1 { - let child = node.child(index).unwrap(); - - if child.is_named() { - let expression = Expression::from_syntax(child, source, context)?; - - arguments.push(expression); - } - } - - Ok(FunctionCall { - function_expression, - arguments, - syntax_position: node.range().into(), - }) - } - - fn expected_type(&self, context: &Context) -> Result { - match &self.function_expression { - FunctionExpression::Identifier(identifier) => { - let identifier_type = identifier.expected_type(context)?; - - if let Type::Function { - parameter_types: _, - return_type, - } = &identifier_type - { - Ok(*return_type.clone()) - } else { - Ok(identifier_type) - } - } - FunctionExpression::FunctionCall(function_call) => function_call.expected_type(context), - FunctionExpression::Value(value_node) => { - let value_type = value_node.expected_type(context)?; - - if let Type::Function { return_type, .. } = value_type { - Ok(*return_type) - } else { - Ok(value_type) - } - } - FunctionExpression::Index(index) => { - let index_type = index.expected_type(context)?; - - if let Type::Function { return_type, .. } = index_type { - Ok(*return_type) - } else { - Ok(index_type) - } - } - } - } - - fn validate(&self, _source: &str, context: &Context) -> Result<(), ValidationError> { - self.function_expression.validate(_source, context)?; - - let function_expression_type = self.function_expression.expected_type(context)?; - - let parameter_types = if let Type::Function { - parameter_types, .. - } = function_expression_type - { - parameter_types - } else { - return Err(ValidationError::TypeCheckExpectedFunction { - actual: function_expression_type, - position: self.syntax_position, - }); - }; - - if self.arguments.len() != parameter_types.len() { - return Err(ValidationError::ExpectedFunctionArgumentAmount { - expected: parameter_types.len(), - actual: self.arguments.len(), - position: self.syntax_position, - }); - } - - for (index, expression) in self.arguments.iter().enumerate() { - expression.validate(_source, context)?; - - if let Some(expected) = parameter_types.get(index) { - let actual = expression.expected_type(context)?; - - if !expected.accepts(&actual) { - return Err(ValidationError::TypeCheck { - expected: expected.clone(), - actual, - position: self.syntax_position, - }); - } - } - } - - Ok(()) - } - - fn run(&self, source: &str, context: &Context) -> Result { - let value = match &self.function_expression { - FunctionExpression::Identifier(identifier) => { - if let Some(value) = context.get_value(identifier)? { - value.clone() - } else { - return Err(RuntimeError::ValidationFailure( - ValidationError::VariableIdentifierNotFound(identifier.clone()), - )); - } - } - FunctionExpression::FunctionCall(function_call) => { - function_call.run(source, context)? - } - FunctionExpression::Value(value_node) => value_node.run(source, context)?, - FunctionExpression::Index(index) => index.run(source, context)?, - }; - let function = value.as_function()?; - - match function { - Function::BuiltIn(built_in_function) => { - let mut arguments = Vec::with_capacity(self.arguments.len()); - - for expression in &self.arguments { - let value = expression.run(source, context)?; - - arguments.push(value); - } - - built_in_function.call(&arguments, source, context) - } - Function::ContextDefined(function_node) => { - let call_context = Context::with_variables_from(function_node.context())?; - - call_context.inherit_from(context)?; - - let parameter_expression_pairs = - function_node.parameters().iter().zip(self.arguments.iter()); - - for (identifier, expression) in parameter_expression_pairs { - let value = expression.run(source, context)?; - - call_context.set_value(identifier.clone(), value)?; - } - - function_node.body().run(source, &call_context) - } - } - } -} - -impl Format for FunctionCall { - fn format(&self, output: &mut String, indent_level: u8) { - self.function_expression.format(output, indent_level); - output.push('('); - - for expression in &self.arguments { - expression.format(output, indent_level); - } - - output.push(')'); - } -} diff --git a/src/abstract_tree/function_expression.rs b/src/abstract_tree/function_expression.rs deleted file mode 100644 index 8cbb3da..0000000 --- a/src/abstract_tree/function_expression.rs +++ /dev/null @@ -1,91 +0,0 @@ -use serde::{Deserialize, Serialize}; - -use crate::{ - error::{RuntimeError, SyntaxError, ValidationError}, - AbstractTree, Context, Format, FunctionCall, Identifier, Index, SyntaxNode, Type, Value, - ValueNode, -}; - -#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq, PartialOrd, Ord)] -pub enum FunctionExpression { - Identifier(Identifier), - FunctionCall(Box), - Value(ValueNode), - Index(Index), -} - -impl AbstractTree for FunctionExpression { - fn from_syntax(node: SyntaxNode, source: &str, context: &Context) -> Result { - SyntaxError::expect_syntax_node("function_expression", node)?; - - let first_child = node.child(0).unwrap(); - let child = if first_child.is_named() { - first_child - } else { - node.child(1).unwrap() - }; - - let function_expression = match child.kind() { - "identifier" => { - FunctionExpression::Identifier(Identifier::from_syntax(child, source, context)?) - } - - "function_call" => FunctionExpression::FunctionCall(Box::new( - FunctionCall::from_syntax(child, source, context)?, - )), - "value" => FunctionExpression::Value(ValueNode::from_syntax(child, source, context)?), - "index" => FunctionExpression::Index(Index::from_syntax(child, source, context)?), - _ => { - return Err(SyntaxError::UnexpectedSyntaxNode { - expected: "identifier, function call, value or index".to_string(), - actual: child.kind().to_string(), - position: node.range().into(), - }) - } - }; - - Ok(function_expression) - } - - fn expected_type(&self, context: &Context) -> Result { - match self { - FunctionExpression::Identifier(identifier) => identifier.expected_type(context), - FunctionExpression::FunctionCall(function_call) => function_call.expected_type(context), - FunctionExpression::Value(value_node) => value_node.expected_type(context), - FunctionExpression::Index(index) => index.expected_type(context), - } - } - - fn validate(&self, _source: &str, _context: &Context) -> Result<(), ValidationError> { - match self { - FunctionExpression::Identifier(identifier) => identifier.validate(_source, _context), - FunctionExpression::FunctionCall(function_call) => { - function_call.validate(_source, _context) - } - FunctionExpression::Value(value_node) => value_node.validate(_source, _context), - FunctionExpression::Index(index) => index.validate(_source, _context), - } - } - - fn run(&self, source: &str, context: &Context) -> Result { - match self { - FunctionExpression::Identifier(identifier) => identifier.run(source, context), - FunctionExpression::FunctionCall(function_call) => function_call.run(source, context), - FunctionExpression::Value(value_node) => value_node.run(source, context), - FunctionExpression::Index(index) => index.run(source, context), - } - } -} - -impl Format for FunctionExpression { - fn format(&self, output: &mut String, indent_level: u8) { - match self { - FunctionExpression::Value(value_node) => value_node.format(output, indent_level), - FunctionExpression::Identifier(identifier) => identifier.format(output, indent_level), - FunctionExpression::FunctionCall(function_call) => { - function_call.format(output, indent_level) - } - FunctionExpression::Index(index) => index.format(output, indent_level), - } - } -} diff --git a/src/abstract_tree/function_node.rs b/src/abstract_tree/function_node.rs deleted file mode 100644 index 0d82809..0000000 --- a/src/abstract_tree/function_node.rs +++ /dev/null @@ -1,179 +0,0 @@ -use std::fmt::{self, Display, Formatter}; - -use serde::{Deserialize, Serialize}; - -use crate::{ - error::{RuntimeError, SyntaxError, ValidationError}, - AbstractTree, Block, Context, Format, Function, Identifier, SourcePosition, SyntaxNode, Type, - TypeSpecification, Value, -}; - -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)] -pub struct FunctionNode { - parameters: Vec, - body: Block, - r#type: Type, - syntax_position: SourcePosition, - - #[serde(skip)] - context: Context, -} - -impl FunctionNode { - pub fn parameters(&self) -> &Vec { - &self.parameters - } - - pub fn body(&self) -> &Block { - &self.body - } - - pub fn r#type(&self) -> &Type { - &self.r#type - } - - pub fn syntax_position(&self) -> &SourcePosition { - &self.syntax_position - } - - pub fn context(&self) -> &Context { - &self.context - } - - pub fn return_type(&self) -> &Type { - match &self.r#type { - Type::Function { - parameter_types: _, - return_type, - } => return_type.as_ref(), - _ => &Type::None, - } - } -} - -impl AbstractTree for FunctionNode { - fn from_syntax(node: SyntaxNode, source: &str, context: &Context) -> Result { - SyntaxError::expect_syntax_node("function", node)?; - - let child_count = node.child_count(); - let mut parameters = Vec::new(); - let mut parameter_types = Vec::new(); - - for index in 1..child_count - 3 { - let child = node.child(index).unwrap(); - - if child.kind() == "identifier" { - let identifier = Identifier::from_syntax(child, source, context)?; - - parameters.push(identifier); - } - - if child.kind() == "type_specification" { - let type_specification = TypeSpecification::from_syntax(child, source, context)?; - - parameter_types.push(type_specification.take_inner()); - } - } - - let return_type_node = node.child(child_count - 2).unwrap(); - let return_type = TypeSpecification::from_syntax(return_type_node, source, context)?; - - let function_context = Context::with_variables_from(context)?; - - let body_node = node.child(child_count - 1).unwrap(); - let body = Block::from_syntax(body_node, source, &function_context)?; - - let r#type = Type::function(parameter_types, return_type.take_inner()); - let syntax_position = node.range().into(); - - Ok(FunctionNode { - parameters, - body, - r#type, - syntax_position, - context: function_context, - }) - } - - fn expected_type(&self, _context: &Context) -> Result { - Ok(self.r#type().clone()) - } - - fn validate(&self, source: &str, context: &Context) -> Result<(), ValidationError> { - if let Type::Function { - parameter_types, - return_type, - } = &self.r#type - { - self.context.inherit_from(context)?; - - for (parameter, r#type) in self.parameters.iter().zip(parameter_types.iter()) { - self.context.set_type(parameter.clone(), r#type.clone())?; - } - - let actual = self.body.expected_type(&self.context)?; - - if !return_type.accepts(&actual) { - return Err(ValidationError::TypeCheck { - expected: return_type.as_ref().clone(), - actual, - position: self.syntax_position, - }); - } - - self.body.validate(source, &self.context)?; - - Ok(()) - } else { - Err(ValidationError::TypeCheckExpectedFunction { - actual: self.r#type.clone(), - position: self.syntax_position, - }) - } - } - - fn run(&self, _source: &str, context: &Context) -> Result { - self.context.inherit_from(context)?; - - let self_as_value = Value::Function(Function::ContextDefined(self.clone())); - - Ok(self_as_value) - } -} - -impl Format for FunctionNode { - fn format(&self, output: &mut String, indent_level: u8) { - let (parameter_types, return_type) = if let Type::Function { - parameter_types, - return_type, - } = &self.r#type - { - (parameter_types, return_type) - } else { - return; - }; - - output.push('('); - - for (identifier, r#type) in self.parameters.iter().zip(parameter_types.iter()) { - identifier.format(output, indent_level); - output.push_str(" <"); - r#type.format(output, indent_level); - output.push('>'); - } - - output.push_str(") <"); - return_type.format(output, indent_level); - output.push_str("> "); - self.body.format(output, indent_level); - } -} - -impl Display for FunctionNode { - fn fmt(&self, f: &mut Formatter) -> fmt::Result { - let mut string = String::new(); - - self.format(&mut string, 0); - f.write_str(&string) - } -} diff --git a/src/abstract_tree/identifier.rs b/src/abstract_tree/identifier.rs deleted file mode 100644 index 1215ca6..0000000 --- a/src/abstract_tree/identifier.rs +++ /dev/null @@ -1,167 +0,0 @@ -use std::{ - fmt::{self, Display, Formatter}, - sync::Arc, -}; - -use serde::{de::Visitor, Deserialize, Serialize}; - -use crate::{ - built_in_identifiers::all_built_in_identifiers, - built_in_values::all_built_in_values, - error::{RuntimeError, SyntaxError, ValidationError}, - AbstractTree, Context, Format, SyntaxNode, Type, Value, -}; - -/// A string by which a variable is known to a context. -/// -/// Every variable is a key-value pair. An identifier holds the key part of that -/// pair. Its inner value can be used to retrieve a Value instance from a Map. -#[derive(Debug, Clone, Eq, PartialEq, PartialOrd, Ord, Hash)] -pub struct Identifier(Arc); - -impl Identifier { - pub fn new(key: &str) -> Self { - for built_in_identifier in all_built_in_identifiers() { - let identifier = built_in_identifier.get(); - - if &key == identifier.inner().as_ref() { - return identifier.clone(); - } - } - - Identifier(Arc::new(key.to_string())) - } - - pub fn from_raw_parts(arc: Arc) -> Self { - Identifier(arc) - } - - pub fn inner(&self) -> &Arc { - &self.0 - } - - pub fn contains(&self, string: &str) -> bool { - self.0.as_ref() == string - } -} - -impl AbstractTree for Identifier { - fn from_syntax( - node: SyntaxNode, - source: &str, - _context: &Context, - ) -> Result { - SyntaxError::expect_syntax_node("identifier", node)?; - - let text = &source[node.byte_range()]; - - debug_assert!(!text.is_empty()); - - Ok(Identifier::new(text)) - } - - fn validate(&self, _source: &str, context: &Context) -> Result<(), ValidationError> { - let variable_exists = context.add_allowance(self)?; - - if variable_exists { - Ok(()) - } else { - for built_in_value in all_built_in_values() { - if built_in_value.name() == self.inner().as_ref() { - return Ok(()); - } - } - - Err(ValidationError::VariableIdentifierNotFound(self.clone())) - } - } - - fn expected_type(&self, context: &Context) -> Result { - if let Some(r#type) = context.get_type(self)? { - Ok(r#type) - } else { - for built_in_value in all_built_in_values() { - if built_in_value.name() == self.inner().as_ref() { - return Ok(built_in_value.get().r#type()?); - } - } - - Err(ValidationError::VariableIdentifierNotFound(self.clone())) - } - } - - fn run(&self, _source: &str, context: &Context) -> Result { - if let Some(value) = context.get_value(self)? { - return Ok(value); - } else { - for built_in_value in all_built_in_values() { - if built_in_value.name() == self.inner().as_ref() { - return Ok(built_in_value.get().clone()); - } - } - } - - Err(RuntimeError::ValidationFailure( - ValidationError::VariableIdentifierNotFound(self.clone()), - )) - } -} - -impl Format for Identifier { - fn format(&self, output: &mut String, _indent_level: u8) { - output.push_str(&self.0); - } -} - -impl From for Identifier { - fn from(value: String) -> Self { - Identifier::from_raw_parts(Arc::new(value)) - } -} - -impl From<&str> for Identifier { - fn from(value: &str) -> Self { - Identifier::new(value) - } -} - -impl Display for Identifier { - fn fmt(&self, f: &mut Formatter) -> fmt::Result { - write!(f, "{}", self.0) - } -} - -impl Serialize for Identifier { - fn serialize(&self, serializer: S) -> Result - where - S: serde::Serializer, - { - serializer.serialize_str(self.0.as_ref()) - } -} - -impl<'de> Deserialize<'de> for Identifier { - fn deserialize(deserializer: D) -> Result - where - D: serde::Deserializer<'de>, - { - deserializer.deserialize_string(IdentifierVisitor) - } -} - -struct IdentifierVisitor; - -impl<'de> Visitor<'de> for IdentifierVisitor { - type Value = Identifier; - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str("valid UFT-8 sequence") - } - - fn visit_string(self, v: String) -> Result - where - E: serde::de::Error, - { - Ok(Identifier(Arc::new(v))) - } -} diff --git a/src/abstract_tree/if_else.rs b/src/abstract_tree/if_else.rs deleted file mode 100644 index 27b2c30..0000000 --- a/src/abstract_tree/if_else.rs +++ /dev/null @@ -1,160 +0,0 @@ -use serde::{Deserialize, Serialize}; - -use crate::{ - error::{RuntimeError, SyntaxError, ValidationError}, - AbstractTree, Block, Context, Expression, Format, SourcePosition, SyntaxNode, Type, Value, -}; - -#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq, PartialOrd, Ord)] -pub struct IfElse { - if_expression: Expression, - if_block: Block, - else_if_expressions: Vec, - else_if_blocks: Vec, - else_block: Option, - source_position: SourcePosition, -} - -impl AbstractTree for IfElse { - fn from_syntax(node: SyntaxNode, source: &str, context: &Context) -> Result { - let if_expression_node = node.child(0).unwrap().child(1).unwrap(); - let if_expression = Expression::from_syntax(if_expression_node, source, context)?; - - let if_block_node = node.child(0).unwrap().child(2).unwrap(); - let if_block = Block::from_syntax(if_block_node, source, context)?; - - let child_count = node.child_count(); - let mut else_if_expressions = Vec::new(); - let mut else_if_blocks = Vec::new(); - let mut else_block = None; - - for index in 1..child_count { - let child = node.child(index).unwrap(); - - if child.kind() == "else_if" { - let expression_node = child.child(1).unwrap(); - let expression = Expression::from_syntax(expression_node, source, context)?; - - else_if_expressions.push(expression); - - let block_node = child.child(2).unwrap(); - let block = Block::from_syntax(block_node, source, context)?; - - else_if_blocks.push(block); - } - - if child.kind() == "else" { - let else_node = child.child(1).unwrap(); - else_block = Some(Block::from_syntax(else_node, source, context)?); - } - } - - Ok(IfElse { - if_expression, - if_block, - else_if_expressions, - else_if_blocks, - else_block, - source_position: SourcePosition::from(node.range()), - }) - } - - fn expected_type(&self, context: &Context) -> Result { - self.if_block.expected_type(context) - } - - fn validate(&self, _source: &str, context: &Context) -> Result<(), ValidationError> { - self.if_expression.validate(_source, context)?; - self.if_block.validate(_source, context)?; - - let expected = self.if_block.expected_type(context)?; - let else_ifs = self - .else_if_expressions - .iter() - .zip(self.else_if_blocks.iter()); - - for (expression, block) in else_ifs { - expression.validate(_source, context)?; - block.validate(_source, context)?; - - let actual = block.expected_type(context)?; - - if !expected.accepts(&actual) { - return Err(ValidationError::TypeCheck { - expected, - actual, - position: self.source_position, - }); - } - } - - if let Some(block) = &self.else_block { - block.validate(_source, context)?; - - let actual = block.expected_type(context)?; - - if !expected.accepts(&actual) { - return Err(ValidationError::TypeCheck { - expected, - actual, - position: self.source_position, - }); - } - } - - Ok(()) - } - - fn run(&self, source: &str, context: &Context) -> Result { - let if_boolean = self.if_expression.run(source, context)?.as_boolean()?; - - if if_boolean { - self.if_block.run(source, context) - } else { - let else_ifs = self - .else_if_expressions - .iter() - .zip(self.else_if_blocks.iter()); - - for (expression, block) in else_ifs { - let if_boolean = expression.run(source, context)?.as_boolean()?; - - if if_boolean { - return block.run(source, context); - } - } - - if let Some(block) = &self.else_block { - block.run(source, context) - } else { - Ok(Value::none()) - } - } - } -} - -impl Format for IfElse { - fn format(&self, output: &mut String, indent_level: u8) { - output.push_str("if "); - self.if_expression.format(output, indent_level); - output.push(' '); - self.if_block.format(output, indent_level); - - let else_ifs = self - .else_if_expressions - .iter() - .zip(self.else_if_blocks.iter()); - - for (expression, block) in else_ifs { - output.push_str("else if "); - expression.format(output, indent_level); - output.push(' '); - block.format(output, indent_level); - } - - if let Some(block) = &self.else_block { - output.push_str("else "); - block.format(output, indent_level); - } - } -} diff --git a/src/abstract_tree/index.rs b/src/abstract_tree/index.rs deleted file mode 100644 index 200b288..0000000 --- a/src/abstract_tree/index.rs +++ /dev/null @@ -1,134 +0,0 @@ -use serde::{Deserialize, Serialize}; - -use crate::{ - error::{RuntimeError, SyntaxError, ValidationError}, - AbstractTree, Context, Format, Identifier, IndexExpression, SourcePosition, SyntaxNode, Type, - Value, -}; - -/// Abstract representation of an index expression. -/// -/// An index is a means of accessing values stored in list, maps and strings. -#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq, PartialOrd, Ord)] -pub struct Index { - pub collection: IndexExpression, - pub index: IndexExpression, - source_position: SourcePosition, -} - -impl AbstractTree for Index { - fn from_syntax(node: SyntaxNode, source: &str, context: &Context) -> Result { - SyntaxError::expect_syntax_node("index", node)?; - - let collection_node = node.child(0).unwrap(); - let collection = IndexExpression::from_syntax(collection_node, source, context)?; - - let index_node = node.child(2).unwrap(); - let index = IndexExpression::from_syntax(index_node, source, context)?; - - Ok(Index { - collection, - index, - source_position: SourcePosition::from(node.range()), - }) - } - - fn expected_type(&self, context: &Context) -> Result { - match self.collection.expected_type(context)? { - Type::ListOf(item_type) => Ok(*item_type.clone()), - Type::Map(map_types_option) => { - if let (Some(map_type), IndexExpression::Identifier(identifier)) = - (map_types_option, &self.index) - { - if let Some(r#type) = map_type.get(&identifier) { - Ok(r#type.clone()) - } else { - Ok(Type::Any) - } - } else { - Ok(Type::Any) - } - } - Type::None => Ok(Type::None), - r#type => Ok(r#type), - } - } - - fn validate(&self, _source: &str, _context: &Context) -> Result<(), ValidationError> { - self.collection.validate(_source, _context)?; - - let collection_type = self.collection.expected_type(_context)?; - - if let (Type::Map(type_map_option), IndexExpression::Identifier(identifier)) = - (collection_type, &self.index) - { - if let Some(type_map) = type_map_option { - if !type_map.contains_key(identifier) { - return Err(ValidationError::VariableIdentifierNotFound( - identifier.clone(), - )); - } - } - } else { - self.index.validate(_source, _context)?; - } - - Ok(()) - } - - fn run(&self, source: &str, context: &Context) -> Result { - let value = self.collection.run(source, context)?; - - match value { - Value::List(list) => { - let index = self.index.run(source, context)?.as_integer()? as usize; - let item = list.items()?.get(index).cloned().unwrap_or_default(); - - Ok(item) - } - Value::Map(map) => { - let map = map.inner(); - - let value = if let IndexExpression::Identifier(identifier) = &self.index { - if let Some(value) = map.get(identifier) { - value - } else { - return Err(RuntimeError::ValidationFailure( - ValidationError::VariableIdentifierNotFound(identifier.clone()), - )); - } - } else { - let index_value = self.index.run(source, context)?; - let identifier = Identifier::new(index_value.as_string()?.as_str()); - - if let Some(value) = map.get(&identifier) { - value - } else { - return Err(RuntimeError::ValidationFailure( - ValidationError::VariableIdentifierNotFound(identifier.clone()), - )); - } - }; - - Ok(value.clone()) - } - Value::String(string) => { - let index = self.index.run(source, context)?.as_integer()? as usize; - let item = string.read()?.chars().nth(index).unwrap_or_default(); - - Ok(Value::string(item.to_string())) - } - _ => Err(RuntimeError::ValidationFailure( - ValidationError::ExpectedCollection { actual: value }, - )), - } - } -} - -impl Format for Index { - fn format(&self, output: &mut String, indent_level: u8) { - self.collection.format(output, indent_level); - output.push(':'); - self.index.format(output, indent_level); - } -} diff --git a/src/abstract_tree/index_assignment.rs b/src/abstract_tree/index_assignment.rs deleted file mode 100644 index d7e7ce5..0000000 --- a/src/abstract_tree/index_assignment.rs +++ /dev/null @@ -1,96 +0,0 @@ -use serde::{Deserialize, Serialize}; - -use crate::{ - error::{RuntimeError, SyntaxError, ValidationError}, - AbstractTree, AssignmentOperator, Context, Format, Identifier, Index, IndexExpression, - SourcePosition, Statement, SyntaxNode, Type, Value, -}; - -#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq, PartialOrd, Ord)] -pub struct IndexAssignment { - index: Index, - operator: AssignmentOperator, - statement: Statement, - position: SourcePosition, -} - -impl AbstractTree for IndexAssignment { - fn from_syntax(node: SyntaxNode, source: &str, context: &Context) -> Result { - SyntaxError::expect_syntax_node("index_assignment", node)?; - - let index_node = node.child(0).unwrap(); - let index = Index::from_syntax(index_node, source, context)?; - - let operator_node = node.child(1).unwrap(); - let operator = AssignmentOperator::from_syntax(operator_node, source, context)?; - - let statement_node = node.child(2).unwrap(); - let statement = Statement::from_syntax(statement_node, source, context)?; - - Ok(IndexAssignment { - index, - operator, - statement, - position: node.range().into(), - }) - } - - fn expected_type(&self, _context: &Context) -> Result { - Ok(Type::None) - } - - fn validate(&self, _source: &str, _context: &Context) -> Result<(), ValidationError> { - self.index.validate(_source, _context)?; - self.statement.validate(_source, _context) - } - - fn run(&self, source: &str, context: &Context) -> Result { - let _index_collection = self.index.collection.run(source, context)?; - let index_identifier = if let IndexExpression::Identifier(identifier) = &self.index.index { - identifier - } else { - let index_run = self.index.index.run(source, context)?; - let expected_identifier = Identifier::new(index_run.as_string()?.as_str()); - - return Err(RuntimeError::ValidationFailure( - ValidationError::VariableIdentifierNotFound(expected_identifier), - )); - }; - - let value = self.statement.run(source, context)?; - - let new_value = match self.operator { - AssignmentOperator::PlusEqual => { - if let Some(previous_value) = context.get_value(index_identifier)? { - previous_value.add(value, self.position)? - } else { - return Err(RuntimeError::ValidationFailure( - ValidationError::VariableIdentifierNotFound(index_identifier.clone()), - )); - } - } - AssignmentOperator::MinusEqual => { - if let Some(previous_value) = context.get_value(index_identifier)? { - previous_value.subtract(value, self.position)? - } else { - Value::none() - } - } - AssignmentOperator::Equal => value, - }; - - context.set_value(index_identifier.clone(), new_value)?; - - Ok(Value::none()) - } -} - -impl Format for IndexAssignment { - fn format(&self, output: &mut String, indent_level: u8) { - self.index.format(output, indent_level); - output.push(' '); - self.operator.format(output, indent_level); - output.push(' '); - self.statement.format(output, indent_level); - } -} diff --git a/src/abstract_tree/index_expression.rs b/src/abstract_tree/index_expression.rs deleted file mode 100644 index c07b069..0000000 --- a/src/abstract_tree/index_expression.rs +++ /dev/null @@ -1,98 +0,0 @@ -use serde::{Deserialize, Serialize}; - -use crate::{ - error::{RuntimeError, SyntaxError, ValidationError}, - value_node::ValueNode, - AbstractTree, Context, Format, FunctionCall, Identifier, Index, SyntaxNode, Type, Value, -}; - -#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq, PartialOrd, Ord)] -pub enum IndexExpression { - Value(ValueNode), - Identifier(Identifier), - Index(Box), - FunctionCall(Box), -} - -impl AbstractTree for IndexExpression { - fn from_syntax(node: SyntaxNode, source: &str, context: &Context) -> Result { - SyntaxError::expect_syntax_node("index_expression", node)?; - - let first_child = node.child(0).unwrap(); - let child = if first_child.is_named() { - first_child - } else { - node.child(1).unwrap() - }; - - let abstract_node = match child.kind() { - "value" => IndexExpression::Value(ValueNode::from_syntax(child, source, context)?), - "identifier" => { - IndexExpression::Identifier(Identifier::from_syntax(child, source, context)?) - } - "index" => { - IndexExpression::Index(Box::new(Index::from_syntax(child, source, context)?)) - } - "function_call" => IndexExpression::FunctionCall(Box::new(FunctionCall::from_syntax( - child, source, context, - )?)), - _ => { - return Err(SyntaxError::UnexpectedSyntaxNode { - expected: "value, identifier, index or function call".to_string(), - actual: child.kind().to_string(), - position: node.range().into(), - }) - } - }; - - Ok(abstract_node) - } - - fn expected_type(&self, context: &Context) -> Result { - match self { - IndexExpression::Value(value_node) => value_node.expected_type(context), - IndexExpression::Identifier(identifier) => identifier.expected_type(context), - IndexExpression::Index(index) => index.expected_type(context), - IndexExpression::FunctionCall(function_call) => function_call.expected_type(context), - } - } - - fn validate(&self, _source: &str, context: &Context) -> Result<(), ValidationError> { - match self { - IndexExpression::Value(value_node) => value_node.validate(_source, context), - IndexExpression::Identifier(identifier) => { - context.add_allowance(identifier)?; - - Ok(()) - } - IndexExpression::Index(index) => index.validate(_source, context), - IndexExpression::FunctionCall(function_call) => { - function_call.validate(_source, context) - } - } - } - - fn run(&self, source: &str, context: &Context) -> Result { - match self { - IndexExpression::Value(value_node) => value_node.run(source, context), - IndexExpression::Identifier(identifier) => identifier.run(source, context), - IndexExpression::Index(index) => index.run(source, context), - IndexExpression::FunctionCall(function_call) => function_call.run(source, context), - } - } -} - -impl Format for IndexExpression { - fn format(&self, output: &mut String, indent_level: u8) { - match self { - IndexExpression::Value(value_node) => { - value_node.format(output, indent_level); - } - IndexExpression::Identifier(identifier) => identifier.format(output, indent_level), - IndexExpression::FunctionCall(function_call) => { - function_call.format(output, indent_level) - } - IndexExpression::Index(index) => index.format(output, indent_level), - } - } -} diff --git a/src/abstract_tree/logic.rs b/src/abstract_tree/logic.rs deleted file mode 100644 index 5cf33ba..0000000 --- a/src/abstract_tree/logic.rs +++ /dev/null @@ -1,95 +0,0 @@ -use serde::{Deserialize, Serialize}; - -use crate::{ - error::{RuntimeError, SyntaxError, ValidationError}, - AbstractTree, Context, Expression, Format, LogicOperator, SyntaxNode, Type, Value, -}; - -/// Abstract representation of a logic expression. -#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq, PartialOrd, Ord)] -pub struct Logic { - left: Expression, - operator: LogicOperator, - right: Expression, -} - -impl AbstractTree for Logic { - fn from_syntax(node: SyntaxNode, source: &str, context: &Context) -> Result { - SyntaxError::expect_syntax_node("logic", node)?; - - let first_node = node.child(0).unwrap(); - let (left_node, operator_node, right_node) = { - if first_node.is_named() { - (first_node, node.child(1).unwrap(), node.child(2).unwrap()) - } else { - ( - node.child(1).unwrap(), - node.child(2).unwrap(), - node.child(3).unwrap(), - ) - } - }; - let left = Expression::from_syntax(left_node, source, context)?; - let operator = LogicOperator::from_syntax(operator_node, source, context)?; - let right = Expression::from_syntax(right_node, source, context)?; - - Ok(Logic { - left, - operator, - right, - }) - } - - fn expected_type(&self, _context: &Context) -> Result { - Ok(Type::Boolean) - } - - fn validate(&self, _source: &str, _context: &Context) -> Result<(), ValidationError> { - log::info!("VALIDATE logic expression"); - - self.left.validate(_source, _context)?; - self.right.validate(_source, _context) - } - - fn run(&self, source: &str, context: &Context) -> Result { - let left = self.left.run(source, context)?; - let right = self.right.run(source, context)?; - - log::info!("RUN logic expression: {left} {} {right}", self.operator); - - let result = match self.operator { - LogicOperator::Equal => { - if let (Ok(left_num), Ok(right_num)) = (left.as_number(), right.as_number()) { - left_num == right_num - } else { - left == right - } - } - LogicOperator::NotEqual => { - if let (Ok(left_num), Ok(right_num)) = (left.as_number(), right.as_number()) { - left_num != right_num - } else { - left != right - } - } - LogicOperator::And => left.as_boolean()? && right.as_boolean()?, - LogicOperator::Or => left.as_boolean()? || right.as_boolean()?, - LogicOperator::Greater => left > right, - LogicOperator::Less => left < right, - LogicOperator::GreaterOrEqual => left >= right, - LogicOperator::LessOrEqual => left <= right, - }; - - Ok(Value::Boolean(result)) - } -} - -impl Format for Logic { - fn format(&self, output: &mut String, indent_level: u8) { - self.left.format(output, indent_level); - output.push(' '); - self.operator.format(output, indent_level); - output.push(' '); - self.right.format(output, indent_level); - } -} diff --git a/src/abstract_tree/logic_operator.rs b/src/abstract_tree/logic_operator.rs deleted file mode 100644 index 3865f05..0000000 --- a/src/abstract_tree/logic_operator.rs +++ /dev/null @@ -1,93 +0,0 @@ -use std::fmt::{self, Display, Formatter}; - -use serde::{Deserialize, Serialize}; - -use crate::{ - error::{RuntimeError, SyntaxError, ValidationError}, - AbstractTree, Context, Format, SyntaxNode, Type, Value, -}; - -#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq, PartialOrd, Ord)] -pub enum LogicOperator { - Equal, - NotEqual, - And, - Or, - Greater, - Less, - GreaterOrEqual, - LessOrEqual, -} - -impl AbstractTree for LogicOperator { - fn from_syntax( - node: SyntaxNode, - _source: &str, - _context: &Context, - ) -> Result { - SyntaxError::expect_syntax_node("logic_operator", node)?; - - let operator_node = node.child(0).unwrap(); - let operator = match operator_node.kind() { - "==" => LogicOperator::Equal, - "!=" => LogicOperator::NotEqual, - "&&" => LogicOperator::And, - "||" => LogicOperator::Or, - ">" => LogicOperator::Greater, - "<" => LogicOperator::Less, - ">=" => LogicOperator::GreaterOrEqual, - "<=" => LogicOperator::LessOrEqual, - _ => { - return Err(SyntaxError::UnexpectedSyntaxNode { - expected: "==, !=, &&, ||, >, <, >= or <=".to_string(), - actual: operator_node.kind().to_string(), - position: node.range().into(), - }) - } - }; - - Ok(operator) - } - - fn expected_type(&self, _context: &Context) -> Result { - Ok(Type::None) - } - - fn validate(&self, _source: &str, _context: &Context) -> Result<(), ValidationError> { - Ok(()) - } - - fn run(&self, _source: &str, _context: &Context) -> Result { - Ok(Value::none()) - } -} - -impl Format for LogicOperator { - fn format(&self, output: &mut String, _indent_level: u8) { - match self { - LogicOperator::Equal => output.push('='), - LogicOperator::NotEqual => output.push_str("!="), - LogicOperator::And => output.push_str("&&"), - LogicOperator::Or => output.push_str("||"), - LogicOperator::Greater => output.push('>'), - LogicOperator::Less => output.push('<'), - LogicOperator::GreaterOrEqual => output.push_str(">="), - LogicOperator::LessOrEqual => output.push_str("<="), - } - } -} - -impl Display for LogicOperator { - fn fmt(&self, f: &mut Formatter) -> fmt::Result { - match self { - LogicOperator::Equal => write!(f, "="), - LogicOperator::NotEqual => write!(f, "!="), - LogicOperator::And => write!(f, "&&"), - LogicOperator::Or => write!(f, "||"), - LogicOperator::Greater => write!(f, ">"), - LogicOperator::Less => write!(f, "<"), - LogicOperator::GreaterOrEqual => write!(f, ">="), - LogicOperator::LessOrEqual => write!(f, "<="), - } - } -} diff --git a/src/abstract_tree/map_node.rs b/src/abstract_tree/map_node.rs deleted file mode 100644 index 48a2daf..0000000 --- a/src/abstract_tree/map_node.rs +++ /dev/null @@ -1,117 +0,0 @@ -use std::collections::BTreeMap; - -use serde::{Deserialize, Serialize}; -use tree_sitter::Node as SyntaxNode; - -use crate::{ - error::{RuntimeError, SyntaxError, ValidationError}, - AbstractTree, Context, Format, Identifier, Map, SourcePosition, Statement, Type, - TypeSpecification, Value, -}; - -#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq, PartialOrd, Ord)] -pub struct MapNode { - properties: BTreeMap)>, - position: SourcePosition, -} - -impl MapNode { - pub fn properties(&self) -> &BTreeMap)> { - &self.properties - } -} - -impl AbstractTree for MapNode { - fn from_syntax(node: SyntaxNode, source: &str, context: &Context) -> Result { - SyntaxError::expect_syntax_node("map", node)?; - - let mut properties = BTreeMap::new(); - let mut current_identifier = None; - let mut current_type = None; - - for index in 0..node.child_count() - 1 { - let child = node.child(index).unwrap(); - - if child.kind() == "identifier" { - current_identifier = Some(Identifier::from_syntax(child, source, context)?); - current_type = None; - } - - if child.kind() == "type_specification" { - current_type = - Some(TypeSpecification::from_syntax(child, source, context)?.take_inner()); - } - - if child.kind() == "statement" { - let statement = Statement::from_syntax(child, source, context)?; - - if let Some(identifier) = ¤t_identifier { - properties.insert(identifier.clone(), (statement, current_type.clone())); - } - } - } - - Ok(MapNode { - properties, - position: SourcePosition::from(node.range()), - }) - } - - fn expected_type(&self, _context: &Context) -> Result { - if self.properties.is_empty() { - return Ok(Type::Map(None)); - } - - let mut type_map = BTreeMap::new(); - - for (identifier, (statement, r#type_option)) in &self.properties { - let r#type = if let Some(r#type) = type_option { - r#type.clone() - } else { - statement.expected_type(_context)? - }; - - type_map.insert(identifier.clone(), r#type); - } - - Ok(Type::Map(Some(type_map))) - } - - fn validate(&self, _source: &str, context: &Context) -> Result<(), ValidationError> { - for (_key, (statement, r#type)) in &self.properties { - statement.validate(_source, context)?; - - if let Some(expected) = r#type { - let actual = statement.expected_type(context)?; - - if !expected.accepts(&actual) { - return Err(ValidationError::TypeCheck { - expected: expected.clone(), - actual, - position: self.position.clone(), - }); - } - } - } - - Ok(()) - } - - fn run(&self, _source: &str, _context: &Context) -> Result { - let mut map = Map::new(); - - for (key, (statement, _)) in &self.properties { - let value = statement.run(_source, _context)?; - - map.set(key.clone(), value); - } - - Ok(Value::Map(map)) - } -} - -impl Format for MapNode { - fn format(&self, _output: &mut String, _indent_level: u8) { - todo!() - } -} diff --git a/src/abstract_tree/match.rs b/src/abstract_tree/match.rs deleted file mode 100644 index 61b415d..0000000 --- a/src/abstract_tree/match.rs +++ /dev/null @@ -1,145 +0,0 @@ -//! Pattern matching. -//! -//! Note that this module is called "match" but is escaped as "r#match" because -//! "match" is a keyword in Rust. -use serde::{Deserialize, Serialize}; -use tree_sitter::Node as SyntaxNode; - -use crate::{ - error::{RuntimeError, SyntaxError, ValidationError}, - AbstractTree, Context, Expression, Format, MatchPattern, Statement, Type, Value, -}; - -/// Abstract representation of a match statement. -#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq, PartialOrd, Ord)] -pub struct Match { - matcher: Expression, - options: Vec<(MatchPattern, Statement)>, - fallback: Option>, - - #[serde(skip)] - context: Context, -} - -impl AbstractTree for Match { - fn from_syntax(node: SyntaxNode, source: &str, context: &Context) -> Result { - SyntaxError::expect_syntax_node("match", node)?; - - let matcher_node = node.child(1).unwrap(); - let matcher = Expression::from_syntax(matcher_node, source, context)?; - - let mut options = Vec::new(); - let mut previous_pattern = None; - let mut next_statement_is_fallback = false; - let mut fallback = None; - - for index in 2..node.child_count() { - let child = node.child(index).unwrap(); - - if child.kind() == "match_pattern" { - previous_pattern = Some(MatchPattern::from_syntax(child, source, context)?); - } - - if child.kind() == "statement" { - let statement = Statement::from_syntax(child, source, context)?; - - if next_statement_is_fallback { - fallback = Some(Box::new(statement)); - next_statement_is_fallback = false; - } else if let Some(expression) = &previous_pattern { - options.push((expression.clone(), statement)); - } - } - } - - Ok(Match { - matcher, - options, - fallback, - context: Context::default(), - }) - } - - fn expected_type(&self, context: &Context) -> Result { - let (_, first_statement) = self.options.first().unwrap(); - - first_statement.expected_type(context) - } - - fn validate(&self, _source: &str, _context: &Context) -> Result<(), ValidationError> { - self.matcher.validate(_source, _context)?; - - for (match_pattern, statement) in &self.options { - if let MatchPattern::EnumPattern(enum_pattern) = match_pattern { - if let Some(identifier) = enum_pattern.inner_identifier() { - self.context.set_type(identifier.clone(), Type::Any)?; - } - } - - match_pattern.validate(_source, _context)?; - statement.validate(_source, &self.context)?; - } - - if let Some(statement) = &self.fallback { - statement.validate(_source, _context)?; - } - - Ok(()) - } - - fn run(&self, source: &str, context: &Context) -> Result { - let matcher_value = self.matcher.run(source, context)?; - - for (pattern, statement) in &self.options { - if let (Value::Enum(enum_instance), MatchPattern::EnumPattern(enum_pattern)) = - (&matcher_value, pattern) - { - if enum_instance.name() == enum_pattern.name() - && enum_instance.variant() == enum_pattern.variant() - { - let statement_context = Context::with_variables_from(context)?; - - if let (Some(identifier), Some(value)) = - (enum_pattern.inner_identifier(), enum_instance.value()) - { - statement_context.set_value(identifier.clone(), value.as_ref().clone())?; - } - - return statement.run(source, &statement_context); - } - } - let pattern_value = pattern.run(source, context)?; - - if matcher_value == pattern_value { - return statement.run(source, context); - } - } - - if let Some(fallback) = &self.fallback { - fallback.run(source, context) - } else { - Ok(Value::none()) - } - } -} - -impl Format for Match { - fn format(&self, output: &mut String, indent_level: u8) { - output.push_str("match "); - self.matcher.format(output, indent_level); - output.push_str(" {"); - - for (expression, statement) in &self.options { - expression.format(output, indent_level); - output.push_str(" => "); - statement.format(output, indent_level); - } - - if let Some(statement) = &self.fallback { - output.push_str("* => "); - statement.format(output, indent_level); - } - - output.push('}'); - } -} diff --git a/src/abstract_tree/match_pattern.rs b/src/abstract_tree/match_pattern.rs deleted file mode 100644 index f63248c..0000000 --- a/src/abstract_tree/match_pattern.rs +++ /dev/null @@ -1,64 +0,0 @@ -use serde::{Deserialize, Serialize}; -use tree_sitter::Node as SyntaxNode; - -use crate::{ - error::{RuntimeError, SyntaxError, ValidationError}, - AbstractTree, Context, EnumPattern, Format, Type, Value, ValueNode, -}; - -#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq, PartialOrd, Ord)] -pub enum MatchPattern { - EnumPattern(EnumPattern), - Value(ValueNode), - Wildcard, -} - -impl AbstractTree for MatchPattern { - fn from_syntax(node: SyntaxNode, source: &str, context: &Context) -> Result { - SyntaxError::expect_syntax_node("match_pattern", node)?; - - let child = node.child(0).unwrap(); - let pattern = match child.kind() { - "enum_pattern" => { - MatchPattern::EnumPattern(EnumPattern::from_syntax(child, source, context)?) - } - "value" => MatchPattern::Value(ValueNode::from_syntax(child, source, context)?), - "*" => MatchPattern::Wildcard, - _ => { - return Err(SyntaxError::UnexpectedSyntaxNode { - expected: "enum pattern or value".to_string(), - actual: child.kind().to_string(), - position: node.range().into(), - }) - } - }; - - Ok(pattern) - } - - fn expected_type(&self, _context: &Context) -> Result { - match self { - MatchPattern::EnumPattern(enum_pattern) => enum_pattern.expected_type(_context), - MatchPattern::Value(value_node) => value_node.expected_type(_context), - MatchPattern::Wildcard => todo!(), - } - } - - fn validate(&self, _source: &str, _context: &Context) -> Result<(), ValidationError> { - Ok(()) - } - - fn run(&self, _source: &str, _context: &Context) -> Result { - match self { - MatchPattern::EnumPattern(enum_pattern) => enum_pattern.run(_source, _context), - MatchPattern::Value(value_node) => value_node.run(_source, _context), - MatchPattern::Wildcard => todo!(), - } - } -} - -impl Format for MatchPattern { - fn format(&self, _output: &mut String, _indent_level: u8) { - todo!() - } -} diff --git a/src/abstract_tree/math.rs b/src/abstract_tree/math.rs deleted file mode 100644 index d7096a3..0000000 --- a/src/abstract_tree/math.rs +++ /dev/null @@ -1,74 +0,0 @@ -use serde::{Deserialize, Serialize}; - -use crate::{ - error::{RuntimeError, SyntaxError, ValidationError}, - AbstractTree, Context, Expression, Format, MathOperator, SourcePosition, SyntaxNode, Type, - Value, -}; - -/// Abstract representation of a math operation. -/// -/// Dust currently supports the four basic operations and the modulo (or -/// remainder) operator. -#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq, PartialOrd, Ord)] -pub struct Math { - left: Expression, - operator: MathOperator, - right: Expression, - position: SourcePosition, -} - -impl AbstractTree for Math { - fn from_syntax(node: SyntaxNode, source: &str, context: &Context) -> Result { - SyntaxError::expect_syntax_node("math", node)?; - - let left_node = node.child(0).unwrap(); - let left = Expression::from_syntax(left_node, source, context)?; - - let operator_node = node.child(1).unwrap(); - let operator = MathOperator::from_syntax(operator_node, source, context)?; - - let right_node = node.child(2).unwrap(); - let right = Expression::from_syntax(right_node, source, context)?; - - Ok(Math { - left, - operator, - right, - position: node.range().into(), - }) - } - - fn expected_type(&self, context: &Context) -> Result { - self.left.expected_type(context) - } - - fn validate(&self, _source: &str, _context: &Context) -> Result<(), ValidationError> { - self.left.validate(_source, _context)?; - self.right.validate(_source, _context) - } - - fn run(&self, source: &str, context: &Context) -> Result { - let left = self.left.run(source, context)?; - let right = self.right.run(source, context)?; - let value = match self.operator { - MathOperator::Add => left.add(right, self.position)?, - MathOperator::Subtract => left.subtract(right, self.position)?, - MathOperator::Multiply => left.multiply(right, self.position)?, - MathOperator::Divide => left.divide(right, self.position)?, - MathOperator::Modulo => left.modulo(right, self.position)?, - }; - - Ok(value) - } -} - -impl Format for Math { - fn format(&self, output: &mut String, indent_level: u8) { - self.left.format(output, indent_level); - output.push(' '); - self.operator.format(output, indent_level); - output.push(' '); - self.right.format(output, indent_level); - } -} diff --git a/src/abstract_tree/math_operator.rs b/src/abstract_tree/math_operator.rs deleted file mode 100644 index 3b7ad3a..0000000 --- a/src/abstract_tree/math_operator.rs +++ /dev/null @@ -1,69 +0,0 @@ -use serde::{Deserialize, Serialize}; - -use crate::{ - error::{RuntimeError, SyntaxError, ValidationError}, - AbstractTree, Context, Format, SyntaxNode, Type, Value, -}; - -#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq, PartialOrd, Ord)] -pub enum MathOperator { - Add, - Subtract, - Multiply, - Divide, - Modulo, -} - -impl AbstractTree for MathOperator { - fn from_syntax( - node: SyntaxNode, - _source: &str, - _context: &Context, - ) -> Result { - SyntaxError::expect_syntax_node("math_operator", node)?; - - let operator_node = node.child(0).unwrap(); - let operator = match operator_node.kind() { - "+" => MathOperator::Add, - "-" => MathOperator::Subtract, - "*" => MathOperator::Multiply, - "/" => MathOperator::Divide, - "%" => MathOperator::Modulo, - _ => { - return Err(SyntaxError::UnexpectedSyntaxNode { - expected: "+, -, *, / or %".to_string(), - actual: operator_node.kind().to_string(), - position: node.range().into(), - }) - } - }; - - Ok(operator) - } - - fn expected_type(&self, _context: &Context) -> Result { - Ok(Type::None) - } - - fn validate(&self, _source: &str, _context: &Context) -> Result<(), ValidationError> { - Ok(()) - } - - fn run(&self, _source: &str, _context: &Context) -> Result { - Ok(Value::none()) - } -} - -impl Format for MathOperator { - fn format(&self, output: &mut String, _indent_level: u8) { - let char = match self { - MathOperator::Add => '+', - MathOperator::Subtract => '-', - MathOperator::Multiply => '*', - MathOperator::Divide => '/', - MathOperator::Modulo => '%', - }; - - output.push(char); - } -} diff --git a/src/abstract_tree/mod.rs b/src/abstract_tree/mod.rs deleted file mode 100644 index 4a2ea37..0000000 --- a/src/abstract_tree/mod.rs +++ /dev/null @@ -1,178 +0,0 @@ -//! Abstract, executable representations of corresponding items found in Dust -//! source code. The types that implement [AbstractTree] are inteded to be -//! created by an [Interpreter]. -pub mod r#as; -pub mod assignment; -pub mod assignment_operator; -pub mod block; -pub mod command; -pub mod enum_defintion; -pub mod enum_pattern; -pub mod expression; -pub mod r#for; -pub mod function_call; -pub mod function_expression; -pub mod function_node; -pub mod identifier; -pub mod if_else; -pub mod index; -pub mod index_assignment; -pub mod index_expression; -pub mod logic; -pub mod logic_operator; -pub mod map_node; -pub mod r#match; -pub mod match_pattern; -pub mod math; -pub mod math_operator; -pub mod statement; -pub mod struct_definition; -pub mod r#type; -pub mod type_definition; -pub mod type_specification; -pub mod value_node; -pub mod r#while; - -pub use { - assignment::*, assignment_operator::*, block::*, command::*, enum_defintion::*, - enum_pattern::*, expression::*, function_call::*, function_expression::*, function_node::*, - identifier::*, if_else::*, index::*, index_assignment::IndexAssignment, index_expression::*, - logic::*, logic_operator::*, map_node::*, match_pattern::*, math::*, math_operator::*, r#as::*, - r#for::*, r#match::*, r#type::*, r#while::*, statement::*, struct_definition::*, - type_definition::*, type_specification::*, value_node::*, -}; - -use serde::{Deserialize, Serialize}; - -use crate::{ - context::Context, - error::{RuntimeError, SyntaxError, ValidationError}, - SyntaxNode, Value, -}; - -/// A detailed report of a position in the source code string. -#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)] -pub struct SourcePosition { - pub start_byte: usize, - pub end_byte: usize, - pub start_row: usize, - pub start_column: usize, - pub end_row: usize, - pub end_column: usize, -} - -impl From for SourcePosition { - fn from(range: tree_sitter::Range) -> Self { - SourcePosition { - start_byte: range.start_byte, - end_byte: range.end_byte, - start_row: range.start_point.row + 1, - start_column: range.start_point.column, - end_row: range.end_point.row + 1, - end_column: range.end_point.column, - } - } -} - -/// Abstraction that represents a whole, executable unit of dust code. -#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)] -pub struct Root { - statements: Vec, -} - -// TODO Change Root to use tree sitter's cursor to traverse the statements -// instead of indexes. This will be more performant when there are a lot of -// top-level statements in the tree. -impl AbstractTree for Root { - fn from_syntax(node: SyntaxNode, source: &str, context: &Context) -> Result { - SyntaxError::expect_syntax_node("root", node)?; - - let statement_count = node.child_count(); - let mut statements = Vec::with_capacity(statement_count); - - for index in 0..statement_count { - let statement_node = node.child(index).unwrap(); - let statement = Statement::from_syntax(statement_node, source, context)?; - - statements.push(statement); - } - - Ok(Root { statements }) - } - - fn validate(&self, _source: &str, _context: &Context) -> Result<(), ValidationError> { - for statement in &self.statements { - statement.validate(_source, _context)?; - } - - Ok(()) - } - - fn run(&self, source: &str, context: &Context) -> Result { - let mut value = Value::none(); - - for statement in &self.statements { - value = statement.run(source, context)?; - - if statement.is_return() { - return Ok(value); - } - } - - Ok(value) - } - - fn expected_type(&self, context: &Context) -> Result { - self.statements.last().unwrap().expected_type(context) - } -} - -impl Format for Root { - fn format(&self, output: &mut String, indent_level: u8) { - for (index, statement) in self.statements.iter().enumerate() { - if index > 0 { - output.push('\n'); - } - statement.format(output, indent_level); - output.push('\n'); - } - } -} - -/// This trait is implemented by the Evaluator's internal types to form an -/// executable tree that resolves to a single value. -pub trait AbstractTree: Sized + Format { - /// Interpret the syntax tree at the given node and return the abstraction. - /// Returns a syntax error if the source is invalid. - /// - /// This function is used to convert nodes in the Tree Sitter concrete - /// syntax tree into executable nodes in an abstract tree. This function is - /// where the tree should be traversed by accessing sibling and child nodes. - /// Each node in the CST should be traversed only once. - /// - /// If necessary, the source code can be accessed directly by getting the - /// node's byte range. - fn from_syntax(node: SyntaxNode, source: &str, context: &Context) -> Result; - - /// Return the type of the value that this abstract node will create when - /// run. Returns a validation error if the tree is invalid. - fn expected_type(&self, context: &Context) -> Result; - - /// Verify the type integrity of the node. Returns a validation error if the - /// tree is invalid. - fn validate(&self, source: &str, context: &Context) -> Result<(), ValidationError>; - - /// Execute this node's logic and return a value. Returns a runtime error if - /// the node cannot resolve to a value. - fn run(&self, source: &str, context: &Context) -> Result; -} - -pub trait Format { - fn format(&self, output: &mut String, indent_level: u8); - - fn indent(output: &mut String, indent_level: u8) { - for _ in 0..indent_level { - output.push_str(" "); - } - } -} diff --git a/src/abstract_tree/new.rs b/src/abstract_tree/new.rs deleted file mode 100644 index 49575ae..0000000 --- a/src/abstract_tree/new.rs +++ /dev/null @@ -1,45 +0,0 @@ -use serde::{Deserialize, Serialize}; -use tree_sitter::Node; - -use crate::{ - error::{RuntimeError, SyntaxError, ValidationError}, - AbstractTree, Context, Format, Identifier, Type, TypeSpecification, Value, ValueNode, -}; - -#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)] -pub struct New { - identifier: Identifier, - properties: Vec<(Identifier, ValueNode, Option)>, -} - -impl AbstractTree for New { - fn from_syntax(node: Node, source: &str, context: &Context) -> Result { - let identifier_node = node.child(1).unwrap(); - let identifier = Identifier::from_syntax(identifier_node, source, context)?; - - let properties = Vec::new(); - - Ok(New { - identifier, - properties, - }) - } - - fn expected_type(&self, _context: &Context) -> Result { - todo!() - } - - fn validate(&self, _source: &str, _context: &Context) -> Result<(), ValidationError> { - todo!() - } - - fn run(&self, _source: &str, _context: &Context) -> Result { - todo!() - } -} - -impl Format for New { - fn format(&self, _output: &mut String, _indent_level: u8) { - todo!() - } -} diff --git a/src/abstract_tree/statement.rs b/src/abstract_tree/statement.rs deleted file mode 100644 index f445401..0000000 --- a/src/abstract_tree/statement.rs +++ /dev/null @@ -1,202 +0,0 @@ -use serde::{Deserialize, Serialize}; - -use crate::{ - error::{RuntimeError, SyntaxError, ValidationError}, - AbstractTree, Assignment, Block, Context, Expression, For, Format, IfElse, IndexAssignment, - Match, SyntaxNode, Type, TypeDefinition, Value, While, -}; - -/// Abstract representation of a statement. -#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq, PartialOrd, Ord)] -pub struct Statement { - is_return: bool, - statement_kind: StatementKind, -} - -impl Statement { - pub fn is_return(&self) -> bool { - self.is_return - } -} - -impl AbstractTree for Statement { - fn from_syntax( - node: SyntaxNode, - source: &str, - _context: &Context, - ) -> Result { - SyntaxError::expect_syntax_node("statement", node)?; - - let first_child = node.child(0).unwrap(); - let mut is_return = first_child.kind() == "return" || first_child.kind() == "break"; - let child = if is_return { - node.child(1).unwrap() - } else { - first_child - }; - - let statement_kind = StatementKind::from_syntax(child, source, _context)?; - - if let StatementKind::Block(block) = &statement_kind { - if block.contains_return() { - is_return = true; - } - }; - - Ok(Statement { - is_return, - statement_kind, - }) - } - - fn expected_type(&self, _context: &Context) -> Result { - self.statement_kind.expected_type(_context) - } - - fn validate(&self, _source: &str, _context: &Context) -> Result<(), ValidationError> { - self.statement_kind.validate(_source, _context) - } - - fn run(&self, _source: &str, _context: &Context) -> Result { - self.statement_kind.run(_source, _context) - } -} - -impl Format for Statement { - fn format(&self, _output: &mut String, _indent_level: u8) { - self.statement_kind.format(_output, _indent_level) - } -} - -#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq, PartialOrd, Ord)] -enum StatementKind { - Assignment(Box), - Expression(Expression), - IfElse(Box), - Match(Match), - While(Box), - Block(Box), - For(Box), - IndexAssignment(Box), - TypeDefinition(TypeDefinition), -} - -impl AbstractTree for StatementKind { - fn from_syntax(node: SyntaxNode, source: &str, context: &Context) -> Result { - SyntaxError::expect_syntax_node("statement_kind", node)?; - - let child = node.child(0).unwrap(); - - match child.kind() { - "assignment" => Ok(StatementKind::Assignment(Box::new( - Assignment::from_syntax(child, source, context)?, - ))), - "expression" => Ok(StatementKind::Expression(Expression::from_syntax( - child, source, context, - )?)), - "if_else" => Ok(StatementKind::IfElse(Box::new(IfElse::from_syntax( - child, source, context, - )?))), - "while" => Ok(StatementKind::While(Box::new(While::from_syntax( - child, source, context, - )?))), - "block" => Ok(StatementKind::Block(Box::new(Block::from_syntax( - child, source, context, - )?))), - "for" => Ok(StatementKind::For(Box::new(For::from_syntax( - child, source, context, - )?))), - "index_assignment" => Ok(StatementKind::IndexAssignment(Box::new( - IndexAssignment::from_syntax(child, source, context)?, - ))), - "match" => Ok(StatementKind::Match(Match::from_syntax( - child, source, context, - )?)), - "type_definition" => Ok(StatementKind::TypeDefinition(TypeDefinition::from_syntax( - child, source, context - )?)), - _ => Err(SyntaxError::UnexpectedSyntaxNode { - expected: - "assignment, index assignment, expression, type_definition, block, return, if...else, while, for or match".to_string(), - actual: child.kind().to_string(), - position: node.range().into(), - }), - } - } - - fn expected_type(&self, _context: &Context) -> Result { - match self { - StatementKind::Assignment(assignment) => assignment.expected_type(_context), - StatementKind::Expression(expression) => expression.expected_type(_context), - StatementKind::IfElse(if_else) => if_else.expected_type(_context), - StatementKind::Match(r#match) => r#match.expected_type(_context), - StatementKind::While(r#while) => r#while.expected_type(_context), - StatementKind::Block(block) => block.expected_type(_context), - StatementKind::For(r#for) => r#for.expected_type(_context), - StatementKind::IndexAssignment(index_assignment) => { - index_assignment.expected_type(_context) - } - StatementKind::TypeDefinition(type_definition) => { - type_definition.expected_type(_context) - } - } - } - - fn validate(&self, _source: &str, _context: &Context) -> Result<(), ValidationError> { - match self { - StatementKind::Assignment(assignment) => assignment.validate(_source, _context), - StatementKind::Expression(expression) => expression.validate(_source, _context), - StatementKind::IfElse(if_else) => if_else.validate(_source, _context), - StatementKind::Match(r#match) => r#match.validate(_source, _context), - StatementKind::While(r#while) => r#while.validate(_source, _context), - StatementKind::Block(block) => block.validate(_source, _context), - StatementKind::For(r#for) => r#for.validate(_source, _context), - StatementKind::IndexAssignment(index_assignment) => { - index_assignment.validate(_source, _context) - } - StatementKind::TypeDefinition(type_definition) => { - type_definition.validate(_source, _context) - } - } - } - - fn run(&self, _source: &str, _context: &Context) -> Result { - match self { - StatementKind::Assignment(assignment) => assignment.run(_source, _context), - StatementKind::Expression(expression) => expression.run(_source, _context), - StatementKind::IfElse(if_else) => if_else.run(_source, _context), - StatementKind::Match(r#match) => r#match.run(_source, _context), - StatementKind::While(r#while) => r#while.run(_source, _context), - StatementKind::Block(block) => block.run(_source, _context), - StatementKind::For(r#for) => r#for.run(_source, _context), - StatementKind::IndexAssignment(index_assignment) => { - index_assignment.run(_source, _context) - } - StatementKind::TypeDefinition(type_definition) => { - type_definition.run(_source, _context) - } - } - } -} - -impl Format for StatementKind { - fn format(&self, output: &mut String, indent_level: u8) { - StatementKind::indent(output, indent_level); - - match self { - StatementKind::Assignment(assignment) => assignment.format(output, indent_level), - StatementKind::Expression(expression) => expression.format(output, indent_level), - StatementKind::IfElse(if_else) => if_else.format(output, indent_level), - StatementKind::Match(r#match) => r#match.format(output, indent_level), - StatementKind::While(r#while) => r#while.format(output, indent_level), - StatementKind::Block(block) => block.format(output, indent_level), - StatementKind::For(r#for) => r#for.format(output, indent_level), - StatementKind::IndexAssignment(index_assignment) => { - index_assignment.format(output, indent_level) - } - StatementKind::TypeDefinition(type_definition) => { - type_definition.format(output, indent_level) - } - } - } -} diff --git a/src/abstract_tree/struct_definition.rs b/src/abstract_tree/struct_definition.rs deleted file mode 100644 index 9b43772..0000000 --- a/src/abstract_tree/struct_definition.rs +++ /dev/null @@ -1,120 +0,0 @@ -use std::collections::BTreeMap; - -use serde::{Deserialize, Serialize}; -use tree_sitter::Node as SyntaxNode; - -use crate::{ - error::{RuntimeError, SyntaxError, ValidationError}, - AbstractTree, Context, Format, Identifier, Map, MapNode, Statement, StructInstance, Type, - TypeDefinition, TypeSpecification, Value, -}; - -#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq, PartialOrd, Ord)] -pub struct StructDefinition { - name: Identifier, - properties: BTreeMap, Type)>, -} - -impl StructDefinition { - pub fn instantiate( - &self, - new_properties: &MapNode, - source: &str, - context: &Context, - ) -> Result { - let mut all_properties = Map::new(); - - for (key, (statement_option, _)) in &self.properties { - if let Some(statement) = statement_option { - let value = statement.run(source, context)?; - - all_properties.set(key.clone(), value); - } - } - - for (key, (statement, _)) in new_properties.properties() { - let value = statement.run(source, context)?; - - all_properties.set(key.clone(), value); - } - - Ok(StructInstance::new(self.name.clone(), all_properties)) - } -} - -impl AbstractTree for StructDefinition { - fn from_syntax(node: SyntaxNode, source: &str, context: &Context) -> Result { - SyntaxError::expect_syntax_node("struct_definition", node)?; - - let name_node = node.child(1).unwrap(); - let name = Identifier::from_syntax(name_node, source, context)?; - - let mut properties = BTreeMap::new(); - let mut current_identifier: Option = None; - let mut current_type: Option = None; - let mut current_statement = None; - - for index in 2..node.child_count() - 1 { - let child_syntax_node = node.child(index).unwrap(); - - if child_syntax_node.kind() == "identifier" { - if current_statement.is_none() { - if let (Some(identifier), Some(r#type)) = (¤t_identifier, ¤t_type) { - properties.insert(identifier.clone(), (None, r#type.clone())); - } - } - - current_type = None; - current_identifier = - Some(Identifier::from_syntax(child_syntax_node, source, context)?); - } - - if child_syntax_node.kind() == "type_specification" { - current_type = Some( - TypeSpecification::from_syntax(child_syntax_node, source, context)? - .take_inner(), - ); - } - - if child_syntax_node.kind() == "statement" { - current_statement = - Some(Statement::from_syntax(child_syntax_node, source, context)?); - - if let Some(identifier) = ¤t_identifier { - let r#type = if let Some(r#type) = ¤t_type { - r#type.clone() - } else { - Type::None - }; - - properties.insert( - identifier.clone(), - (current_statement.clone(), r#type.clone()), - ); - } - } - } - - Ok(StructDefinition { name, properties }) - } - - fn expected_type(&self, _context: &Context) -> Result { - Ok(Type::None) - } - - fn validate(&self, _source: &str, _context: &Context) -> Result<(), ValidationError> { - Ok(()) - } - - fn run(&self, _source: &str, context: &Context) -> Result { - context.set_definition(self.name.clone(), TypeDefinition::Struct(self.clone()))?; - - Ok(Value::none()) - } -} - -impl Format for StructDefinition { - fn format(&self, _output: &mut String, _indent_level: u8) { - todo!() - } -} diff --git a/src/abstract_tree/type.rs b/src/abstract_tree/type.rs deleted file mode 100644 index 5e1abdc..0000000 --- a/src/abstract_tree/type.rs +++ /dev/null @@ -1,394 +0,0 @@ -use std::{ - collections::BTreeMap, - fmt::{self, Display, Formatter}, -}; - -use serde::{Deserialize, Serialize}; -use tree_sitter::Node as SyntaxNode; - -use crate::{ - built_in_types::BuiltInType, - error::{RuntimeError, SyntaxError, ValidationError}, - AbstractTree, Context, Format, Identifier, TypeSpecification, Value, -}; - -#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq, PartialOrd, Ord)] -pub enum Type { - Any, - Boolean, - Collection, - Custom { - name: Identifier, - arguments: Vec, - }, - Float, - Function { - parameter_types: Vec, - return_type: Box, - }, - Integer, - List, - ListOf(Box), - ListExact(Vec), - Map(Option>), - None, - Number, - String, - Range, -} - -impl Type { - pub fn custom(name: Identifier, arguments: Vec) -> Self { - Type::Custom { name, arguments } - } - - pub fn option(inner_type: Option) -> Self { - BuiltInType::Option(inner_type).get().clone() - } - - pub fn list(item_type: Type) -> Self { - Type::ListOf(Box::new(item_type)) - } - - pub fn function(parameter_types: Vec, return_type: Type) -> Self { - Type::Function { - parameter_types, - return_type: Box::new(return_type), - } - } - - /// Returns a boolean indicating whether is type is accepting of the other. - /// - /// The types do not need to match exactly. For example, the Any variant matches all of the - /// others and the Number variant accepts Number, Integer and Float. - pub fn accepts(&self, other: &Type) -> bool { - log::info!("Checking type {self} against {other}."); - - match (self, other) { - (Type::Any, _) - | (_, Type::Any) - | (Type::Boolean, Type::Boolean) - | (Type::Collection, Type::Collection) - | (Type::Collection, Type::String) - | (Type::Collection, Type::List) - | (Type::List, Type::Collection) - | (Type::Collection, Type::ListExact(_)) - | (Type::ListExact(_), Type::Collection) - | (Type::Collection, Type::ListOf(_)) - | (Type::ListOf(_), Type::Collection) - | (Type::Collection, Type::Map(_)) - | (Type::Map(_), Type::Collection) - | (Type::String, Type::Collection) - | (Type::Float, Type::Float) - | (Type::Integer, Type::Integer) - | (Type::List, Type::List) - | (Type::Map(None), Type::Map(None)) - | (Type::Number, Type::Number) - | (Type::Number, Type::Integer) - | (Type::Number, Type::Float) - | (Type::Integer, Type::Number) - | (Type::Float, Type::Number) - | (Type::String, Type::String) - | (Type::None, Type::None) => true, - (Type::Map(left_types), Type::Map(right_types)) => left_types == right_types, - ( - Type::Custom { - name: left_name, - arguments: left_arguments, - }, - Type::Custom { - name: right_name, - arguments: right_arguments, - }, - ) => left_name == right_name && left_arguments == right_arguments, - (Type::ListOf(self_item_type), Type::ListOf(other_item_type)) => { - self_item_type.accepts(&other_item_type) - } - (Type::ListExact(self_types), Type::ListExact(other_types)) => { - for (left, right) in self_types.iter().zip(other_types.iter()) { - if !left.accepts(right) { - return false; - } - } - - true - } - (Type::ListExact(exact_types), Type::ListOf(of_type)) - | (Type::ListOf(of_type), Type::ListExact(exact_types)) => { - exact_types.iter().all(|r#type| r#type == of_type.as_ref()) - } - ( - Type::Function { - parameter_types: self_parameter_types, - return_type: self_return_type, - }, - Type::Function { - parameter_types: other_parameter_types, - return_type: other_return_type, - }, - ) => { - let parameter_type_pairs = self_parameter_types - .iter() - .zip(other_parameter_types.iter()); - - for (self_parameter_type, other_parameter_type) in parameter_type_pairs { - if self_parameter_type == other_parameter_type { - return false; - } - } - - self_return_type == other_return_type - } - _ => false, - } - } - - pub fn is_function(&self) -> bool { - matches!(self, Type::Function { .. }) - } - - pub fn is_list(&self) -> bool { - matches!(self, Type::ListOf(_)) - } - - pub fn is_map(&self) -> bool { - matches!(self, Type::Map(_)) - } -} - -impl AbstractTree for Type { - fn from_syntax( - node: SyntaxNode, - _source: &str, - context: &Context, - ) -> Result { - SyntaxError::expect_syntax_node("type", node)?; - - let type_node = node.child(0).unwrap(); - - let r#type = match type_node.kind() { - "identifier" => { - let name = Identifier::from_syntax(type_node, _source, context)?; - let mut arguments = Vec::new(); - - for index in 2..node.child_count() - 1 { - let child = node.child(index).unwrap(); - - if child.is_named() { - let r#type = Type::from_syntax(child, _source, context)?; - - arguments.push(r#type); - } - } - - Type::custom(name, arguments) - } - "{" => { - let mut type_map = BTreeMap::new(); - let mut previous_identifier = None; - - for index in 1..node.child_count() - 1 { - let child = node.child(index).unwrap(); - - if let Some(identifier) = previous_identifier { - let type_specification = - TypeSpecification::from_syntax(child, _source, context)?; - - type_map.insert(identifier, type_specification.take_inner()); - previous_identifier = None; - } else { - previous_identifier = - Some(Identifier::from_syntax(child, _source, context)?) - } - } - - Type::Map(Some(type_map)) - } - "[" => { - let item_type_node = node.child(1).unwrap(); - let item_type = Type::from_syntax(item_type_node, _source, context)?; - - Type::ListOf(Box::new(item_type)) - } - "list" => { - let item_type_node = node.child(1); - - if let Some(child) = item_type_node { - Type::ListOf(Box::new(Type::from_syntax(child, _source, context)?)) - } else { - Type::List - } - } - "any" => Type::Any, - "bool" => Type::Boolean, - "collection" => Type::Collection, - "float" => Type::Float, - "(" => { - let child_count = node.child_count(); - let mut parameter_types = Vec::new(); - - for index in 1..child_count - 2 { - let child = node.child(index).unwrap(); - - if child.is_named() { - let parameter_type = Type::from_syntax(child, _source, context)?; - - parameter_types.push(parameter_type); - } - } - - let final_node = node.child(child_count - 1).unwrap(); - let return_type = if final_node.is_named() { - Type::from_syntax(final_node, _source, context)? - } else { - Type::option(None) - }; - - Type::Function { - parameter_types, - return_type: Box::new(return_type), - } - } - "int" => Type::Integer, - "map" => Type::Map(None), - "num" => Type::Number, - "none" => Type::None, - "str" => Type::String, - _ => { - return Err(SyntaxError::UnexpectedSyntaxNode { - expected: "any, bool, float, int, num, str, list, map, custom type, (, [ or {" - .to_string(), - actual: type_node.kind().to_string(), - position: node.range().into(), - }) - } - }; - - Ok(r#type) - } - - fn expected_type(&self, _context: &Context) -> Result { - Ok(Type::None) - } - - fn validate(&self, _source: &str, _context: &Context) -> Result<(), ValidationError> { - Ok(()) - } - - fn run(&self, _source: &str, _context: &Context) -> Result { - Ok(Value::none()) - } -} - -impl Format for Type { - fn format(&self, output: &mut String, indent_level: u8) { - match self { - Type::Any => output.push_str("any"), - Type::Boolean => output.push_str("bool"), - Type::Collection => output.push_str("collection"), - Type::Custom { - name: _, - arguments: _, - } => todo!(), - Type::Float => output.push_str("float"), - Type::Function { - parameter_types, - return_type, - } => { - output.push('('); - - for (index, parameter_type) in parameter_types.iter().enumerate() { - parameter_type.format(output, indent_level); - - if index != parameter_types.len() - 1 { - output.push(' '); - } - } - - output.push_str(") -> "); - return_type.format(output, indent_level); - } - Type::Integer => output.push_str("int"), - Type::List => todo!(), - Type::ListOf(item_type) => { - output.push('['); - item_type.format(output, indent_level); - output.push(']'); - } - Type::ListExact(_) => todo!(), - Type::Map(_) => { - output.push_str("map"); - } - Type::None => output.push_str("Option::None"), - Type::Number => output.push_str("num"), - Type::String => output.push_str("str"), - Type::Range => todo!(), - } - } -} - -impl Display for Type { - fn fmt(&self, f: &mut Formatter) -> fmt::Result { - match self { - Type::Any => write!(f, "any"), - Type::Boolean => write!(f, "bool"), - Type::Collection => write!(f, "collection"), - Type::Custom { name, arguments } => { - if !arguments.is_empty() { - write!(f, "<")?; - - for (index, r#type) in arguments.into_iter().enumerate() { - if index == arguments.len() - 1 { - write!(f, "{}", r#type)?; - } else { - write!(f, "{}, ", r#type)?; - } - } - - write!(f, ">") - } else { - write!(f, "{name}") - } - } - Type::Float => write!(f, "float"), - Type::Function { - parameter_types, - return_type, - } => { - write!(f, "(")?; - - for (index, parameter_type) in parameter_types.iter().enumerate() { - write!(f, "{parameter_type}")?; - - if index != parameter_types.len() - 1 { - write!(f, " ")?; - } - } - - write!(f, ")")?; - write!(f, " -> {return_type}") - } - Type::Integer => write!(f, "int"), - Type::List => write!(f, "list"), - Type::ListOf(item_type) => write!(f, "[{item_type}]"), - Type::ListExact(types) => { - write!(f, "[")?; - - for (index, r#type) in types.into_iter().enumerate() { - if index == types.len() - 1 { - write!(f, "{}", r#type)?; - } else { - write!(f, "{}, ", r#type)?; - } - } - - write!(f, "]") - } - Type::Map(_) => write!(f, "map"), - Type::Number => write!(f, "num"), - Type::None => write!(f, "none"), - Type::String => write!(f, "str"), - Type::Range => todo!(), - } - } -} diff --git a/src/abstract_tree/type_definition.rs b/src/abstract_tree/type_definition.rs deleted file mode 100644 index 8036508..0000000 --- a/src/abstract_tree/type_definition.rs +++ /dev/null @@ -1,73 +0,0 @@ -use serde::{Deserialize, Serialize}; -use tree_sitter::Node as SyntaxNode; - -use crate::{ - error::{RuntimeError, SyntaxError, ValidationError}, - AbstractTree, Context, EnumDefinition, Format, Identifier, StructDefinition, Type, Value, -}; - -#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq, PartialOrd, Ord)] -pub enum TypeDefinition { - Enum(EnumDefinition), - Struct(StructDefinition), -} - -impl TypeDefinition { - pub fn identifier(&self) -> &Identifier { - match self { - TypeDefinition::Enum(enum_definition) => enum_definition.identifier(), - TypeDefinition::Struct(_) => todo!(), - } - } -} - -impl AbstractTree for TypeDefinition { - fn from_syntax(node: SyntaxNode, source: &str, context: &Context) -> Result { - SyntaxError::expect_syntax_node("type_definition", node)?; - - let child = node.child(0).unwrap(); - - match child.kind() { - "enum_definition" => Ok(TypeDefinition::Enum(EnumDefinition::from_syntax( - child, source, context, - )?)), - "struct_definition" => Ok(TypeDefinition::Struct(StructDefinition::from_syntax( - child, source, context, - )?)), - _ => Err(SyntaxError::UnexpectedSyntaxNode { - expected: "enum or struct definition".to_string(), - actual: child.kind().to_string(), - position: node.range().into(), - }), - } - } - - fn expected_type(&self, _context: &Context) -> Result { - match self { - TypeDefinition::Enum(enum_definition) => enum_definition.expected_type(_context), - TypeDefinition::Struct(struct_definition) => struct_definition.expected_type(_context), - } - } - - fn validate(&self, _source: &str, _context: &Context) -> Result<(), ValidationError> { - match self { - TypeDefinition::Enum(enum_definition) => enum_definition.validate(_source, _context), - TypeDefinition::Struct(struct_definition) => { - struct_definition.validate(_source, _context) - } - } - } - - fn run(&self, _source: &str, _context: &Context) -> Result { - match self { - TypeDefinition::Enum(enum_definition) => enum_definition.run(_source, _context), - TypeDefinition::Struct(struct_definition) => struct_definition.run(_source, _context), - } - } -} - -impl Format for TypeDefinition { - fn format(&self, _output: &mut String, _indent_level: u8) { - todo!() - } -} diff --git a/src/abstract_tree/type_specification.rs b/src/abstract_tree/type_specification.rs deleted file mode 100644 index 108c230..0000000 --- a/src/abstract_tree/type_specification.rs +++ /dev/null @@ -1,56 +0,0 @@ -use serde::{Deserialize, Serialize}; - -use crate::{ - error::{RuntimeError, SyntaxError, ValidationError}, - AbstractTree, Context, Format, SyntaxNode, Type, Value, -}; - -#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq, PartialOrd, Ord)] -pub struct TypeSpecification { - r#type: Type, -} - -impl TypeSpecification { - pub fn new(r#type: Type) -> Self { - Self { r#type } - } - - pub fn inner(&self) -> &Type { - &self.r#type - } - - pub fn take_inner(self) -> Type { - self.r#type - } -} - -impl AbstractTree for TypeSpecification { - fn from_syntax(node: SyntaxNode, source: &str, context: &Context) -> Result { - SyntaxError::expect_syntax_node("type_specification", node)?; - - let type_node = node.child(1).unwrap(); - let r#type = Type::from_syntax(type_node, source, context)?; - - Ok(TypeSpecification { r#type }) - } - - fn expected_type(&self, context: &Context) -> Result { - self.r#type.expected_type(context) - } - - fn validate(&self, _source: &str, _context: &Context) -> Result<(), ValidationError> { - Ok(()) - } - - fn run(&self, source: &str, context: &Context) -> Result { - self.r#type.run(source, context) - } -} - -impl Format for TypeSpecification { - fn format(&self, output: &mut String, indent_level: u8) { - output.push('<'); - self.r#type.format(output, indent_level); - output.push('>'); - } -} diff --git a/src/abstract_tree/value_node.rs b/src/abstract_tree/value_node.rs deleted file mode 100644 index 6693b63..0000000 --- a/src/abstract_tree/value_node.rs +++ /dev/null @@ -1,357 +0,0 @@ -use std::{cmp::Ordering, ops::RangeInclusive}; - -use serde::{Deserialize, Serialize}; -use tree_sitter::Node as SyntaxNode; - -use crate::{ - error::{RuntimeError, SyntaxError, ValidationError}, - AbstractTree, Context, Expression, Format, Function, FunctionNode, - Identifier, List, Type, Value, TypeDefinition, MapNode, -}; - -#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq)] -pub enum ValueNode { - Boolean(String), - Float(String), - Function(Function), - Integer(String), - String(String), - List(Vec), - Map(MapNode), - Range(RangeInclusive), - Struct { - name: Identifier, - properties: MapNode, - }, - Enum { - name: Identifier, - variant: Identifier, - expression: Option>, - }, -} - -impl AbstractTree for ValueNode { - fn from_syntax(node: SyntaxNode, source: &str, context: &Context) -> Result { - SyntaxError::expect_syntax_node("value", node)?; - - let child = node.child(0).unwrap(); - let value_node = match child.kind() { - "boolean" => ValueNode::Boolean(source[child.byte_range()].to_string()), - "float" => ValueNode::Float(source[child.byte_range()].to_string()), - "function" => { - let function_node = FunctionNode::from_syntax(child, source, context)?; - - ValueNode::Function(Function::ContextDefined(function_node)) - } - "integer" => ValueNode::Integer(source[child.byte_range()].to_string()), - "string" => { - let without_quotes = child.start_byte() + 1..child.end_byte() - 1; - - ValueNode::String(source[without_quotes].to_string()) - } - "list" => { - let mut expressions = Vec::new(); - - for index in 1..child.child_count() - 1 { - let current_node = child.child(index).unwrap(); - - if current_node.is_named() { - let expression = Expression::from_syntax(current_node, source, context)?; - - expressions.push(expression); - } - } - - ValueNode::List(expressions) - } - "map" => { - ValueNode::Map(MapNode::from_syntax(child, source, context)?) - } - "range" => { - let mut split = source[child.byte_range()].split(".."); - let start = split.next().unwrap().parse().unwrap(); - let end = split.next().unwrap().parse().unwrap(); - - ValueNode::Range(start..=end) - } - "enum_instance" => { - let name_node = child.child(0).unwrap(); - let name = Identifier::from_syntax(name_node, source, context)?; - - let variant_node = child.child(2).unwrap(); - let variant = Identifier::from_syntax(variant_node, source, context)?; - - let expression = if let Some(expression_node) = child.child(4) { - Some(Box::new(Expression::from_syntax(expression_node, source, context)?)) - } else { - None - }; - - ValueNode::Enum { name, variant , expression } - } - "struct_instance" => { - let name_node = child.child(0).unwrap(); - let name = Identifier::from_syntax(name_node, source, context)?; - - let properties_node = child.child(2).unwrap(); - let properties = MapNode::from_syntax(properties_node, source, context)?; - - ValueNode::Struct - { - name, - properties - } - } - _ => { - return Err(SyntaxError::UnexpectedSyntaxNode { - expected: - "string, integer, float, boolean, range, list, map, option, function, struct or enum" - .to_string(), - actual: child.kind().to_string(), - position: node.range().into(), - }) - } - }; - - Ok(value_node) - } - - fn expected_type(&self, context: &Context) -> Result { - let r#type = match self { - ValueNode::Boolean(_) => Type::Boolean, - ValueNode::Float(_) => Type::Float, - ValueNode::Function(function) => function.r#type(), - ValueNode::Integer(_) => Type::Integer, - ValueNode::String(_) => Type::String, - ValueNode::List(expressions) => { - let mut item_types = Vec::new(); - - for expression in expressions { - let expression_type = expression.expected_type(context)?; - - item_types.push(expression_type); - } - - Type::ListExact(item_types) - } - ValueNode::Map(map_node) => map_node.expected_type(context)?, - ValueNode::Struct { name, .. } => { - Type::custom(name.clone(), Vec::with_capacity(0)) - } - ValueNode::Range(_) => Type::Range, - ValueNode::Enum { name, variant, expression: _ } => { - let types: Vec = if let Some(type_definition) = context.get_definition(name)? { - if let TypeDefinition::Enum(enum_definition) = type_definition { - let types = enum_definition.variants().into_iter().find_map(|(identifier, types)| { - if identifier == variant { - Some(types.clone()) - } else { - None - } - }); - - if let Some(types) = types { - types - } else { - return Err(ValidationError::VariableIdentifierNotFound(variant.clone())); - } - - } else { - return Err(ValidationError::ExpectedEnumDefintion { actual: type_definition.clone() }); - } - } else { - return Err(ValidationError::VariableIdentifierNotFound(name.clone())); - }; - - Type::custom(name.clone(), types.clone()) - - }, - }; - - Ok(r#type) - } - - fn validate(&self, _source: &str, context: &Context) -> Result<(), ValidationError> { - match self { - ValueNode::Function(function) => { - if let Function::ContextDefined(function_node) = function { - function_node.validate(_source, context)?; - } - } - ValueNode::Map(map_node) => map_node.validate(_source, context)?, - ValueNode::Enum { name, expression, .. } => { - name.validate(_source, context)?; - - if let Some(expression) = expression { - expression.validate(_source, context)?; - } - } - _ => {}, - } - - Ok(()) - } - - fn run(&self, source: &str, context: &Context) -> Result { - let value = match self { - ValueNode::Boolean(value_source) => Value::Boolean(value_source.parse().unwrap()), - ValueNode::Float(value_source) => { - let float = value_source.parse()?; - - Value::Float(float) - } - ValueNode::Function(function) => Value::Function(function.clone()), - ValueNode::Integer(value_source) => Value::Integer(value_source.parse().unwrap()), - ValueNode::String(value_source) => Value::string(value_source.clone()), - ValueNode::List(expressions) => { - let mut values = Vec::with_capacity(expressions.len()); - - for node in expressions { - let value = node.run(source, context)?; - - values.push(value); - } - - Value::List(List::with_items(values)) - } - ValueNode::Map(map_node) => map_node.run(source, context)?, - ValueNode::Range(range) => Value::Range(range.clone()), - ValueNode::Struct { name, properties } => { - let instance = if let Some(definition) = context.get_definition(name)? { - if let TypeDefinition::Struct(struct_definition) = definition { - struct_definition.instantiate(properties, source, context)? - } else { - return Err(RuntimeError::ValidationFailure(ValidationError::ExpectedStructDefintion { actual: definition.clone() })) - } - } else { - return Err(RuntimeError::ValidationFailure( - ValidationError::TypeDefinitionNotFound(name.clone()) - )); - }; - - Value::Struct(instance) - - } - ValueNode::Enum { name, variant, expression } => { - let value = if let Some(expression) = expression { - expression.run(source, context)? - } else { - Value::none() - }; - let instance = if let Some(definition) = context.get_definition(name)? { - if let TypeDefinition::Enum(enum_defintion) = definition { - enum_defintion.instantiate(variant.clone(), Some(value)) - } else { - return Err(RuntimeError::ValidationFailure( - ValidationError::ExpectedEnumDefintion { - actual: definition.clone() - } - )); - } - } else { - return Err(RuntimeError::ValidationFailure( - ValidationError::TypeDefinitionNotFound(name.clone()) - )); - }; - - Value::Enum(instance) - }, - }; - - Ok(value) - } -} - -impl Format for ValueNode { - fn format(&self, output: &mut String, indent_level: u8) { - match self { - ValueNode::Boolean(source) | ValueNode::Float(source) | ValueNode::Integer(source) => { - output.push_str(source) - } - ValueNode::String(source) => { - output.push('\''); - output.push_str(source); - output.push('\''); - } - ValueNode::Function(function) => function.format(output, indent_level), - ValueNode::List(expressions) => { - output.push('['); - - for expression in expressions { - expression.format(output, indent_level); - } - - output.push(']'); - } - ValueNode::Map(map_node) => map_node.format(output, indent_level), - ValueNode::Struct { name, properties } => { - name.format(output, indent_level); - properties.format(output, indent_level); - } - ValueNode::Range(_) => todo!(), - ValueNode::Enum { .. } => todo!(), - } - } -} - -impl Ord for ValueNode { - fn cmp(&self, other: &Self) -> std::cmp::Ordering { - match (self, other) { - (ValueNode::Boolean(left), ValueNode::Boolean(right)) => left.cmp(right), - (ValueNode::Boolean(_), _) => Ordering::Greater, - (ValueNode::Float(left), ValueNode::Float(right)) => left.cmp(right), - (ValueNode::Float(_), _) => Ordering::Greater, - (ValueNode::Function(left), ValueNode::Function(right)) => left.cmp(right), - (ValueNode::Function(_), _) => Ordering::Greater, - (ValueNode::Integer(left), ValueNode::Integer(right)) => left.cmp(right), - (ValueNode::Integer(_), _) => Ordering::Greater, - (ValueNode::String(left), ValueNode::String(right)) => left.cmp(right), - (ValueNode::String(_), _) => Ordering::Greater, - (ValueNode::List(left), ValueNode::List(right)) => left.cmp(right), - (ValueNode::List(_), _) => Ordering::Greater, - (ValueNode::Map(left), ValueNode::Map(right)) => left.cmp(right), - (ValueNode::Map(_), _) => Ordering::Greater, - (ValueNode::Struct{ name: left_name, properties: left_properties }, ValueNode::Struct {name: right_name, properties: right_properties} ) => { - let name_cmp = left_name.cmp(right_name); - - if name_cmp.is_eq() { - left_properties.cmp(right_properties) - } else { - name_cmp - } - }, - (ValueNode::Struct {..}, _) => Ordering::Greater, - ( - ValueNode::Enum { - name: left_name, variant: left_variant, expression: left_expression - }, - ValueNode::Enum { - name: right_name, variant: right_variant, expression: right_expression - } - ) => { - let name_cmp = left_name.cmp(right_name); - - if name_cmp.is_eq() { - let variant_cmp = left_variant.cmp(right_variant); - - if variant_cmp.is_eq() { - left_expression.cmp(right_expression) - } else { - variant_cmp - } - } else { - name_cmp - } - }, - (ValueNode::Enum { .. }, _) => Ordering::Greater, - (ValueNode::Range(left), ValueNode::Range(right)) => left.clone().cmp(right.clone()), - (ValueNode::Range(_), _) => Ordering::Less, - } - } -} - -impl PartialOrd for ValueNode { - fn partial_cmp(&self, other: &Self) -> Option { - Some(self.cmp(other)) - } -} diff --git a/src/abstract_tree/while.rs b/src/abstract_tree/while.rs deleted file mode 100644 index a604a02..0000000 --- a/src/abstract_tree/while.rs +++ /dev/null @@ -1,64 +0,0 @@ -use serde::{Deserialize, Serialize}; - -use crate::{ - error::{RuntimeError, SyntaxError, ValidationError}, - AbstractTree, Block, Context, Expression, Format, SyntaxNode, Type, Value, -}; - -/// Abstract representation of a while loop. -/// -/// While executes its block repeatedly until its expression evaluates to true. -#[derive(Debug, Clone, Serialize, Deserialize, Eq, PartialEq, PartialOrd, Ord)] -pub struct While { - expression: Expression, - block: Block, -} - -impl AbstractTree for While { - fn from_syntax(node: SyntaxNode, source: &str, context: &Context) -> Result { - SyntaxError::expect_syntax_node("while", node)?; - - let expression_node = node.child(1).unwrap(); - let expression = Expression::from_syntax(expression_node, source, context)?; - - let block_node = node.child(2).unwrap(); - let block = Block::from_syntax(block_node, source, context)?; - - Ok(While { expression, block }) - } - - fn expected_type(&self, context: &Context) -> Result { - self.block.expected_type(context) - } - - fn validate(&self, _source: &str, context: &Context) -> Result<(), ValidationError> { - log::info!("VALIDATE while loop"); - - self.expression.validate(_source, context)?; - self.block.validate(_source, context) - } - - fn run(&self, source: &str, context: &Context) -> Result { - log::info!("RUN while loop start"); - - while self.expression.run(source, context)?.as_boolean()? { - self.block.run(source, context)?; - } - - log::info!("RUN while loop end"); - - Ok(Value::none()) - } -} - -impl Format for While { - fn format(&self, output: &mut String, indent_level: u8) { - output.push('\n'); - While::indent(output, indent_level); - output.push_str("while "); - self.expression.format(output, indent_level); - output.push(' '); - self.block.format(output, indent_level); - output.push('\n'); - } -} diff --git a/src/built_in_functions/fs.rs b/src/built_in_functions/fs.rs deleted file mode 100644 index 7d630e7..0000000 --- a/src/built_in_functions/fs.rs +++ /dev/null @@ -1,59 +0,0 @@ -use std::{fs::File, io::Read}; - -use enum_iterator::{all, Sequence}; -use serde::{Deserialize, Serialize}; - -use crate::{error::RuntimeError, Context, Type, Value}; - -use super::Callable; - -pub fn all_fs_functions() -> impl Iterator { - all() -} - -#[derive(Sequence, Debug, Copy, Clone, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)] -pub enum Fs { - ReadFile, -} - -impl Callable for Fs { - fn name(&self) -> &'static str { - match self { - Fs::ReadFile => "read_file", - } - } - - fn description(&self) -> &'static str { - match self { - Fs::ReadFile => "Read the contents of a file to a string.", - } - } - - fn r#type(&self) -> Type { - match self { - Fs::ReadFile => Type::function(vec![Type::String], Type::String), - } - } - - fn call( - &self, - arguments: &[Value], - _source: &str, - _outer_context: &Context, - ) -> Result { - match self { - Fs::ReadFile => { - RuntimeError::expect_argument_amount(self.name(), 1, arguments.len())?; - - let path = arguments.first().unwrap().as_string()?; - let mut file = File::open(path.as_str())?; - let file_size = file.metadata()?.len() as usize; - let mut file_content = String::with_capacity(file_size); - - file.read_to_string(&mut file_content)?; - - Ok(Value::string(file_content)) - } - } - } -} diff --git a/src/built_in_functions/io.rs b/src/built_in_functions/io.rs deleted file mode 100644 index b6e869e..0000000 --- a/src/built_in_functions/io.rs +++ /dev/null @@ -1,56 +0,0 @@ -use enum_iterator::{all, Sequence}; -use serde::{Deserialize, Serialize}; - -use crate::{error::RuntimeError, Context, Type, Value}; - -use super::Callable; - -pub fn all_io_functions() -> impl Iterator { - all() -} - -#[derive(Sequence, Debug, Copy, Clone, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)] -pub enum Io { - Stdin, -} - -impl Callable for Io { - fn name(&self) -> &'static str { - match self { - Io::Stdin => "stdin", - } - } - - fn description(&self) -> &'static str { - match self { - Io::Stdin => "Read input from stdin.", - } - } - - fn r#type(&self) -> crate::Type { - match self { - Io::Stdin => Type::Function { - parameter_types: vec![], - return_type: Box::new(Type::String), - }, - } - } - - fn call( - &self, - _arguments: &[Value], - _source: &str, - _context: &Context, - ) -> Result { - match self { - Io::Stdin => { - let mut input = String::new(); - let stdin = std::io::stdin(); - - stdin.read_line(&mut input)?; - - Ok(Value::string(input)) - } - } - } -} diff --git a/src/built_in_functions/json.rs b/src/built_in_functions/json.rs deleted file mode 100644 index f791bc9..0000000 --- a/src/built_in_functions/json.rs +++ /dev/null @@ -1,77 +0,0 @@ -use enum_iterator::Sequence; -use serde::{Deserialize, Serialize}; - -use crate::{error::RuntimeError, Context, Type, Value}; - -use super::Callable; - -pub fn json_functions() -> impl Iterator { - enum_iterator::all() -} - -#[derive(Sequence, Debug, Copy, Clone, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)] -pub enum Json { - Create, - CreatePretty, - Parse, -} - -impl Callable for Json { - fn name(&self) -> &'static str { - match self { - Json::Create => "create", - Json::CreatePretty => "create_pretty", - Json::Parse => "parse", - } - } - - fn description(&self) -> &'static str { - match self { - Json::Create => "Convert a value to a JSON string.", - Json::CreatePretty => "Convert a value to a formatted JSON string.", - Json::Parse => "Convert JSON to a value", - } - } - - fn r#type(&self) -> Type { - match self { - Json::Create => Type::function(vec![Type::Any], Type::String), - Json::CreatePretty => Type::function(vec![Type::Any], Type::String), - Json::Parse => Type::function(vec![Type::String], Type::Any), - } - } - - fn call( - &self, - arguments: &[Value], - _source: &str, - _outer_context: &Context, - ) -> Result { - match self { - Json::Create => { - RuntimeError::expect_argument_amount(self.name(), 1, arguments.len())?; - - let value = arguments.first().unwrap(); - let json_string = serde_json::to_string(value)?; - - Ok(Value::string(json_string)) - } - Json::CreatePretty => { - RuntimeError::expect_argument_amount(self.name(), 1, arguments.len())?; - - let value = arguments.first().unwrap(); - let json_string = serde_json::to_string_pretty(value)?; - - Ok(Value::string(json_string)) - } - Json::Parse => { - RuntimeError::expect_argument_amount(self.name(), 1, arguments.len())?; - - let json_string = arguments.first().unwrap().as_string()?; - let value = serde_json::from_str(json_string.as_str())?; - - Ok(value) - } - } - } -} diff --git a/src/built_in_functions/mod.rs b/src/built_in_functions/mod.rs deleted file mode 100644 index 203fa56..0000000 --- a/src/built_in_functions/mod.rs +++ /dev/null @@ -1,204 +0,0 @@ -pub mod fs; -pub mod io; -pub mod json; -pub mod str; - -use std::fmt::{self, Display, Formatter}; - -use rand::{random, thread_rng, Rng}; -use serde::{Deserialize, Serialize}; - -use crate::{ - error::{RuntimeError, ValidationError}, - Context, EnumInstance, Format, Identifier, Type, Value, -}; - -use self::{fs::Fs, io::Io, json::Json, str::StrFunction}; - -pub trait Callable { - fn name(&self) -> &'static str; - fn description(&self) -> &'static str; - fn r#type(&self) -> Type; - fn call( - &self, - arguments: &[Value], - source: &str, - context: &Context, - ) -> Result; -} - -#[derive(Debug, Copy, Clone, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)] -pub enum BuiltInFunction { - AssertEqual, - Fs(Fs), - Io(Io), - Json(Json), - Length, - Output, - RandomBoolean, - RandomFloat, - RandomFrom, - RandomInteger, - String(StrFunction), -} - -impl Callable for BuiltInFunction { - fn name(&self) -> &'static str { - match self { - BuiltInFunction::AssertEqual => "assert_equal", - BuiltInFunction::Fs(fs_function) => fs_function.name(), - BuiltInFunction::Io(io_function) => io_function.name(), - BuiltInFunction::Json(json_function) => json_function.name(), - BuiltInFunction::Length => "length", - BuiltInFunction::Output => "output", - BuiltInFunction::RandomBoolean => "boolean", - BuiltInFunction::RandomFloat => "float", - BuiltInFunction::RandomFrom => "from", - BuiltInFunction::RandomInteger => "integer", - BuiltInFunction::String(string_function) => string_function.name(), - } - } - - fn description(&self) -> &'static str { - match self { - BuiltInFunction::AssertEqual => "assert_equal", - BuiltInFunction::Fs(fs_function) => fs_function.description(), - BuiltInFunction::Io(io_function) => io_function.description(), - BuiltInFunction::Json(json_function) => json_function.description(), - BuiltInFunction::Length => "length", - BuiltInFunction::Output => "output", - BuiltInFunction::RandomBoolean => "boolean", - BuiltInFunction::RandomFloat => "float", - BuiltInFunction::RandomFrom => "from", - BuiltInFunction::RandomInteger => "integer", - BuiltInFunction::String(string_function) => string_function.description(), - } - } - - fn r#type(&self) -> Type { - match self { - BuiltInFunction::AssertEqual => Type::function(vec![Type::Any, Type::Any], Type::None), - BuiltInFunction::Fs(fs_function) => fs_function.r#type(), - BuiltInFunction::Io(io_function) => io_function.r#type(), - BuiltInFunction::Json(json_function) => json_function.r#type(), - BuiltInFunction::Length => Type::function(vec![Type::Collection], Type::Integer), - BuiltInFunction::Output => Type::function(vec![Type::Any], Type::None), - BuiltInFunction::RandomBoolean => Type::function(vec![], Type::Boolean), - BuiltInFunction::RandomFloat => Type::function(vec![], Type::Float), - BuiltInFunction::RandomFrom => Type::function(vec![Type::Collection], Type::Any), - BuiltInFunction::RandomInteger => Type::function(vec![], Type::Integer), - BuiltInFunction::String(string_function) => string_function.r#type(), - } - } - - fn call( - &self, - arguments: &[Value], - _source: &str, - context: &Context, - ) -> Result { - match self { - BuiltInFunction::AssertEqual => { - RuntimeError::expect_argument_amount(self.name(), 2, arguments.len())?; - - let left = arguments.get(0).unwrap(); - let right = arguments.get(1).unwrap(); - - if left == right { - Ok(Value::Enum(EnumInstance::new( - Identifier::new("Result"), - Identifier::new("Ok"), - Some(Value::none()), - ))) - } else { - Err(RuntimeError::AssertEqualFailed { - left: left.clone(), - right: right.clone(), - }) - } - } - BuiltInFunction::Fs(fs_function) => fs_function.call(arguments, _source, context), - BuiltInFunction::Io(io_function) => io_function.call(arguments, _source, context), - BuiltInFunction::Json(json_function) => json_function.call(arguments, _source, context), - BuiltInFunction::Length => { - RuntimeError::expect_argument_amount(self.name(), 1, arguments.len())?; - - let value = arguments.first().unwrap(); - let length = if let Ok(list) = value.as_list() { - list.items()?.len() - } else if let Ok(map) = value.as_map() { - map.inner().len() - } else if let Ok(str) = value.as_string() { - str.chars().count() - } else { - return Err(RuntimeError::ValidationFailure( - ValidationError::ExpectedCollection { - actual: value.clone(), - }, - )); - }; - - Ok(Value::Integer(length as i64)) - } - BuiltInFunction::Output => { - RuntimeError::expect_argument_amount(self.name(), 1, arguments.len())?; - - let value = arguments.first().unwrap(); - - println!("{value}"); - - Ok(Value::none()) - } - BuiltInFunction::RandomBoolean => { - RuntimeError::expect_argument_amount(self.name(), 0, arguments.len())?; - - Ok(Value::Boolean(random())) - } - BuiltInFunction::RandomFloat => { - RuntimeError::expect_argument_amount(self.name(), 0, arguments.len())?; - - Ok(Value::Float(random())) - } - BuiltInFunction::RandomFrom => { - RuntimeError::expect_argument_amount(self.name(), 1, arguments.len())?; - - let value = arguments.first().unwrap(); - - if let Ok(list) = value.as_list() { - let items = list.items()?; - - if items.len() == 0 { - Ok(Value::none()) - } else { - let random_index = thread_rng().gen_range(0..items.len()); - let random_value = items.get(random_index).cloned().unwrap_or_default(); - - Ok(random_value) - } - } else { - todo!() - } - } - BuiltInFunction::RandomInteger => { - RuntimeError::expect_argument_amount(self.name(), 0, arguments.len())?; - - Ok(Value::Integer(random())) - } - BuiltInFunction::String(string_function) => { - string_function.call(arguments, _source, context) - } - } - } -} - -impl Format for BuiltInFunction { - fn format(&self, output: &mut String, _indent_level: u8) { - output.push_str(self.name()); - } -} - -impl Display for BuiltInFunction { - fn fmt(&self, f: &mut Formatter) -> fmt::Result { - write!(f, "{}", self.name()) - } -} diff --git a/src/built_in_functions/str.rs b/src/built_in_functions/str.rs deleted file mode 100644 index d88cdcf..0000000 --- a/src/built_in_functions/str.rs +++ /dev/null @@ -1,585 +0,0 @@ -use enum_iterator::Sequence; -use serde::{Deserialize, Serialize}; - -use crate::{error::RuntimeError, Context, EnumInstance, Identifier, List, Type, Value}; - -use super::Callable; - -pub fn string_functions() -> impl Iterator { - enum_iterator::all() -} - -#[derive(Sequence, Debug, Copy, Clone, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)] -pub enum StrFunction { - AsBytes, - EndsWith, - Find, - Insert, - IsAscii, - IsEmpty, - Lines, - Matches, - Parse, - Remove, - ReplaceRange, - Retain, - Split, - SplitAt, - SplitInclusive, - SplitN, - SplitOnce, - SplitTerminator, - SplitWhitespace, - StartsWith, - StripPrefix, - ToLowercase, - ToUppercase, - Trim, - TrimEnd, - TrimEndMatches, - TrimMatches, - TrimStart, - TrimStartMatches, - Truncate, -} - -impl Callable for StrFunction { - fn name(&self) -> &'static str { - match self { - StrFunction::AsBytes => "as_bytes", - StrFunction::EndsWith => "ends_with", - StrFunction::Find => "find", - StrFunction::Insert => "insert", - StrFunction::IsAscii => "is_ascii", - StrFunction::IsEmpty => "is_empty", - StrFunction::Lines => "lines", - StrFunction::Matches => "matches", - StrFunction::Parse => "parse", - StrFunction::Remove => "remove", - StrFunction::ReplaceRange => "replace_range", - StrFunction::Retain => "retain", - StrFunction::Split => "split", - StrFunction::SplitAt => "split_at", - StrFunction::SplitInclusive => "split_inclusive", - StrFunction::SplitN => "split_n", - StrFunction::SplitOnce => "split_once", - StrFunction::SplitTerminator => "split_terminator", - StrFunction::SplitWhitespace => "split_whitespace", - StrFunction::StartsWith => "starts_with", - StrFunction::StripPrefix => "strip_prefix", - StrFunction::ToLowercase => "to_lowercase", - StrFunction::ToUppercase => "to_uppercase", - StrFunction::Trim => "trim", - StrFunction::TrimEnd => "trim_end", - StrFunction::TrimEndMatches => "trim_end_matches", - StrFunction::TrimMatches => "trim_matches", - StrFunction::TrimStart => "trim_start", - StrFunction::TrimStartMatches => "trim_start_matches", - StrFunction::Truncate => "truncate", - } - } - - fn description(&self) -> &'static str { - match self { - StrFunction::AsBytes => "TODO", - StrFunction::EndsWith => "TODO", - StrFunction::Find => "TODO", - StrFunction::Insert => "TODO", - StrFunction::IsAscii => "TODO", - StrFunction::IsEmpty => "TODO", - StrFunction::Lines => "TODO", - StrFunction::Matches => "TODO", - StrFunction::Parse => "TODO", - StrFunction::Remove => "TODO", - StrFunction::ReplaceRange => "TODO", - StrFunction::Retain => "TODO", - StrFunction::Split => "TODO", - StrFunction::SplitAt => "TODO", - StrFunction::SplitInclusive => "TODO", - StrFunction::SplitN => "TODO", - StrFunction::SplitOnce => "TODO", - StrFunction::SplitTerminator => "TODO", - StrFunction::SplitWhitespace => "TODO", - StrFunction::StartsWith => "TODO", - StrFunction::StripPrefix => "TODO", - StrFunction::ToLowercase => "TODO", - StrFunction::ToUppercase => "TODO", - StrFunction::Trim => "TODO", - StrFunction::TrimEnd => "TODO", - StrFunction::TrimEndMatches => "TODO", - StrFunction::TrimMatches => "TODO", - StrFunction::TrimStart => "TODO", - StrFunction::TrimStartMatches => "TODO", - StrFunction::Truncate => "TODO", - } - } - - fn r#type(&self) -> Type { - match self { - StrFunction::AsBytes => Type::function(vec![Type::String], Type::list(Type::Integer)), - StrFunction::EndsWith => { - Type::function(vec![Type::String, Type::String], Type::Boolean) - } - StrFunction::Find => Type::function( - vec![Type::String, Type::String], - Type::option(Some(Type::Integer)), - ), - StrFunction::Insert => Type::function( - vec![Type::String, Type::Integer, Type::String], - Type::String, - ), - StrFunction::IsAscii => Type::function(vec![Type::String], Type::Boolean), - StrFunction::IsEmpty => Type::function(vec![Type::String], Type::Boolean), - StrFunction::Lines => Type::function(vec![Type::String], Type::list(Type::String)), - StrFunction::Matches => { - Type::function(vec![Type::String, Type::String], Type::list(Type::String)) - } - StrFunction::Parse => Type::function(vec![Type::String], Type::Any), - StrFunction::Remove => Type::function( - vec![Type::String, Type::Integer], - Type::option(Some(Type::String)), - ), - StrFunction::ReplaceRange => Type::function( - vec![Type::String, Type::list(Type::Integer), Type::String], - Type::String, - ), - StrFunction::Retain => Type::function( - vec![ - Type::String, - Type::function(vec![Type::String], Type::Boolean), - ], - Type::String, - ), - StrFunction::Split => { - Type::function(vec![Type::String, Type::String], Type::list(Type::String)) - } - StrFunction::SplitAt => { - Type::function(vec![Type::String, Type::Integer], Type::list(Type::String)) - } - StrFunction::SplitInclusive => { - Type::function(vec![Type::String, Type::String], Type::list(Type::String)) - } - StrFunction::SplitN => Type::function( - vec![Type::String, Type::Integer, Type::String], - Type::list(Type::String), - ), - StrFunction::SplitOnce => { - Type::function(vec![Type::String, Type::String], Type::list(Type::String)) - } - StrFunction::SplitTerminator => { - Type::function(vec![Type::String, Type::String], Type::list(Type::String)) - } - StrFunction::SplitWhitespace => { - Type::function(vec![Type::String], Type::list(Type::String)) - } - StrFunction::StartsWith => { - Type::function(vec![Type::String, Type::String], Type::Boolean) - } - StrFunction::StripPrefix => Type::function( - vec![Type::String, Type::String], - Type::option(Some(Type::String)), - ), - StrFunction::ToLowercase => Type::function(vec![Type::String], Type::String), - StrFunction::ToUppercase => Type::function(vec![Type::String], Type::String), - StrFunction::Truncate => { - Type::function(vec![Type::String, Type::Integer], Type::String) - } - StrFunction::Trim => Type::function(vec![Type::String], Type::String), - StrFunction::TrimEnd => Type::function(vec![Type::String], Type::String), - StrFunction::TrimEndMatches => { - Type::function(vec![Type::String, Type::String], Type::String) - } - StrFunction::TrimMatches => { - Type::function(vec![Type::String, Type::String], Type::String) - } - StrFunction::TrimStart => Type::function(vec![Type::String], Type::String), - StrFunction::TrimStartMatches => { - Type::function(vec![Type::String, Type::String], Type::String) - } - } - } - - fn call( - &self, - arguments: &[Value], - _source: &str, - _context: &Context, - ) -> Result { - let value = match self { - StrFunction::AsBytes => { - RuntimeError::expect_argument_amount(self.name(), 1, arguments.len())?; - - let string = arguments.first().unwrap().as_string()?; - let bytes = string - .bytes() - .map(|byte| Value::Integer(byte as i64)) - .collect(); - - Value::List(List::with_items(bytes)) - } - StrFunction::EndsWith => { - RuntimeError::expect_argument_amount(self.name(), 2, arguments.len())?; - - let string = arguments.first().unwrap().as_string()?; - let pattern = arguments.get(1).unwrap().as_string()?; - - Value::Boolean(string.ends_with(pattern.as_str())) - } - StrFunction::Find => { - RuntimeError::expect_argument_amount(self.name(), 2, arguments.len())?; - - let string = arguments.first().unwrap().as_string()?; - let pattern = arguments.get(1).unwrap().as_string()?; - let find = string - .find(pattern.as_str()) - .map(|index| Value::Integer(index as i64)); - - if let Some(index) = find { - Value::Enum(EnumInstance::new( - Identifier::new("Option"), - Identifier::new("Some"), - Some(index), - )) - } else { - Value::Enum(EnumInstance::new( - Identifier::new("Option"), - Identifier::new("None"), - Some(Value::none()), - )) - } - } - StrFunction::IsAscii => { - RuntimeError::expect_argument_amount(self.name(), 1, arguments.len())?; - - let string = arguments.first().unwrap().as_string()?; - - Value::Boolean(string.is_ascii()) - } - StrFunction::IsEmpty => { - RuntimeError::expect_argument_amount(self.name(), 1, arguments.len())?; - - let string = arguments.first().unwrap().as_string()?; - - Value::Boolean(string.is_empty()) - } - StrFunction::Insert => { - RuntimeError::expect_argument_amount(self.name(), 3, arguments.len())?; - - let mut string = arguments.first().unwrap().as_string()?.clone(); - let index = arguments.get(1).unwrap().as_integer()? as usize; - let insertion = arguments.get(2).unwrap().as_string()?; - - string.insert_str(index, insertion.as_str()); - - Value::none() - } - StrFunction::Lines => { - RuntimeError::expect_argument_amount(self.name(), 1, arguments.len())?; - - let string = arguments.first().unwrap().as_string()?; - let lines = string - .lines() - .map(|line| Value::string(line.to_string())) - .collect(); - - Value::List(List::with_items(lines)) - } - StrFunction::Matches => { - RuntimeError::expect_argument_amount(self.name(), 2, arguments.len())?; - - let string = arguments.first().unwrap().as_string()?; - let pattern_string = arguments.get(1).unwrap().as_string()?; - let pattern = pattern_string.as_str(); - let matches = string - .matches(pattern) - .map(|pattern| Value::string(pattern.to_string())) - .collect(); - - Value::List(List::with_items(matches)) - } - StrFunction::Parse => { - RuntimeError::expect_argument_amount(self.name(), 1, arguments.len())?; - - let string = arguments.first().unwrap().as_string()?; - - if let Ok(integer) = string.parse::() { - Value::Integer(integer) - } else if let Ok(float) = string.parse::() { - Value::Float(float) - } else { - Value::none() - } - } - StrFunction::Remove => { - RuntimeError::expect_argument_amount(self.name(), 2, arguments.len())?; - - let string = arguments.first().unwrap().as_string()?; - let index = arguments.get(1).unwrap().as_integer()? as usize; - let chars = string.chars().collect::>(); - - if index < chars.len() { - let new_string = chars - .iter() - .map(|char| char.to_string()) - .collect::(); - - Value::some(Value::string(new_string)) - } else { - Value::none() - } - } - StrFunction::ReplaceRange => { - RuntimeError::expect_argument_amount(self.name(), 3, arguments.len())?; - - let mut string = arguments.first().unwrap().as_string()?.clone(); - let range = arguments.get(1).unwrap().as_list()?.items()?; - let start = range[0].as_integer()? as usize; - let end = range[1].as_integer()? as usize; - let pattern = arguments.get(2).unwrap().as_string()?; - - string.replace_range(start..end, pattern.as_str()); - - Value::string(string) - } - StrFunction::Retain => { - RuntimeError::expect_argument_amount(self.name(), 2, arguments.len())?; - - todo!(); - - // let mut string = arguments.first().unwrap().as_string()?.clone(); - // let predicate = arguments.get(1).unwrap().as_function()?; - - // string.retain(|char| { - // predicate - // .call(&[Value::string(char)], _source, _outer_context) - // .unwrap() - // .as_boolean() - // .unwrap() - // }); - - // Value::String(string) - } - StrFunction::Split => { - RuntimeError::expect_argument_amount(self.name(), 2, arguments.len())?; - - let string = arguments.first().unwrap().as_string()?; - let pattern_string = arguments.get(1).unwrap().as_string()?; - let pattern = pattern_string.as_str(); - let sections = string - .split(pattern) - .map(|section| Value::string(section.to_string())) - .collect(); - - Value::List(List::with_items(sections)) - } - StrFunction::SplitAt => { - RuntimeError::expect_argument_amount(self.name(), 2, arguments.len())?; - - let string = arguments.first().unwrap().as_string()?; - let index = arguments.get(1).unwrap().as_integer()?; - let (left, right) = string.split_at(index as usize); - - Value::List(List::with_items(vec![ - Value::string(left.to_string()), - Value::string(right.to_string()), - ])) - } - StrFunction::SplitInclusive => { - RuntimeError::expect_argument_amount(self.name(), 2, arguments.len())?; - - let string = arguments.first().unwrap().as_string()?; - let pattern_string = arguments.get(1).unwrap().as_string()?; - let pattern = pattern_string.as_str(); - let sections = string - .split(pattern) - .map(|pattern| Value::string(pattern.to_string())) - .collect(); - - Value::List(List::with_items(sections)) - } - StrFunction::SplitN => { - RuntimeError::expect_argument_amount(self.name(), 3, arguments.len())?; - - let string = arguments.first().unwrap().as_string()?; - let count = arguments.get(1).unwrap().as_integer()?; - let pattern_string = arguments.get(2).unwrap().as_string()?; - let pattern = pattern_string.as_str(); - let sections = string - .splitn(count as usize, pattern) - .map(|pattern| Value::string(pattern.to_string())) - .collect(); - - Value::List(List::with_items(sections)) - } - StrFunction::SplitOnce => { - RuntimeError::expect_argument_amount(self.name(), 2, arguments.len())?; - - let string = arguments.first().unwrap().as_string()?; - let pattern_string = arguments.get(1).unwrap().as_string()?; - let pattern = pattern_string.as_str(); - let sections = string.split_once(pattern).map(|(left, right)| { - Value::List(List::with_items(vec![ - Value::string(left.to_string()), - Value::string(right.to_string()), - ])) - }); - - if let Some(sections) = sections { - Value::some(sections) - } else { - Value::none() - } - } - StrFunction::SplitTerminator => { - RuntimeError::expect_argument_amount(self.name(), 2, arguments.len())?; - - let string = arguments.first().unwrap().as_string()?; - let pattern_string = arguments.get(1).unwrap().as_string()?; - let pattern = pattern_string.as_str(); - let sections = string - .split_terminator(pattern) - .map(|section| Value::string(section.to_string())) - .collect(); - - Value::List(List::with_items(sections)) - } - StrFunction::SplitWhitespace => { - RuntimeError::expect_argument_amount(self.name(), 1, arguments.len())?; - - let string = arguments.first().unwrap().as_string()?; - let sections = string - .split_whitespace() - .map(|section| Value::string(section.to_string())) - .collect(); - - Value::List(List::with_items(sections)) - } - StrFunction::StartsWith => { - RuntimeError::expect_argument_amount(self.name(), 2, arguments.len())?; - - let string = arguments.first().unwrap().as_string()?; - let pattern_string = arguments.get(1).unwrap().as_string()?; - let pattern = pattern_string.as_str(); - - Value::Boolean(string.starts_with(pattern)) - } - StrFunction::StripPrefix => { - RuntimeError::expect_argument_amount(self.name(), 2, arguments.len())?; - - let string = arguments.first().unwrap().as_string()?; - let prefix_string = arguments.get(1).unwrap().as_string()?; - let prefix = prefix_string.as_str(); - let stripped = string - .strip_prefix(prefix) - .map(|remainder| Value::string(remainder.to_string())); - - if let Some(value) = stripped { - Value::Enum(EnumInstance::new( - Identifier::new("Option"), - Identifier::new("Some"), - Some(value), - )) - } else { - Value::none() - } - } - StrFunction::ToLowercase => { - RuntimeError::expect_argument_amount(self.name(), 1, arguments.len())?; - - let string = arguments.first().unwrap().as_string()?; - let lowercase = string.to_lowercase(); - - Value::string(lowercase) - } - StrFunction::ToUppercase => { - RuntimeError::expect_argument_amount(self.name(), 1, arguments.len())?; - - let string = arguments.first().unwrap().as_string()?; - let uppercase = string.to_uppercase(); - - Value::string(uppercase) - } - StrFunction::Trim => { - RuntimeError::expect_argument_amount(self.name(), 1, arguments.len())?; - - let trimmed = arguments.first().unwrap().as_string()?.trim().to_string(); - - Value::string(trimmed) - } - StrFunction::TrimEnd => { - RuntimeError::expect_argument_amount(self.name(), 1, arguments.len())?; - - let trimmed = arguments - .first() - .unwrap() - .as_string()? - .trim_end() - .to_string(); - - Value::string(trimmed) - } - StrFunction::TrimEndMatches => { - RuntimeError::expect_argument_amount(self.name(), 2, arguments.len())?; - - let string = arguments.first().unwrap().as_string()?; - let pattern_string = arguments.get(1).unwrap().as_string()?; - let pattern = pattern_string.as_str(); - let trimmed = string.trim_end_matches(pattern).to_string(); - - Value::string(trimmed) - } - StrFunction::TrimMatches => { - RuntimeError::expect_argument_amount(self.name(), 2, arguments.len())?; - - let string = arguments.first().unwrap().as_string()?; - let pattern = arguments - .get(1) - .unwrap() - .as_string()? - .chars() - .collect::>(); - let trimmed = string.trim_matches(pattern.as_slice()).to_string(); - - Value::string(trimmed) - } - StrFunction::TrimStart => { - RuntimeError::expect_argument_amount(self.name(), 1, arguments.len())?; - - let trimmed = arguments - .first() - .unwrap() - .as_string()? - .trim_start() - .to_string(); - - Value::string(trimmed) - } - StrFunction::TrimStartMatches => { - RuntimeError::expect_argument_amount(self.name(), 2, arguments.len())?; - - let string = arguments.first().unwrap().as_string()?; - let pattern = arguments - .get(1) - .unwrap() - .as_string()? - .chars() - .collect::>(); - let trimmed = string.trim_start_matches(pattern.as_slice()).to_string(); - - Value::string(trimmed) - } - StrFunction::Truncate => { - RuntimeError::expect_argument_amount(self.name(), 2, arguments.len())?; - - let input_string = arguments.first().unwrap().as_string()?; - let new_length = arguments.get(1).unwrap().as_integer()? as usize; - - let new_string = input_string.chars().take(new_length).collect::(); - - Value::string(new_string) - } - }; - - Ok(value) - } -} diff --git a/src/built_in_identifiers.rs b/src/built_in_identifiers.rs deleted file mode 100644 index 8659ad5..0000000 --- a/src/built_in_identifiers.rs +++ /dev/null @@ -1,51 +0,0 @@ -use std::sync::{Arc, OnceLock}; - -use enum_iterator::{all, Sequence}; - -use crate::Identifier; - -pub fn all_built_in_identifiers() -> impl Iterator { - all() -} - -static OPTION: OnceLock = OnceLock::new(); -static NONE: OnceLock = OnceLock::new(); -static SOME: OnceLock = OnceLock::new(); -static RESULT: OnceLock = OnceLock::new(); -static OK: OnceLock = OnceLock::new(); -static ERROR: OnceLock = OnceLock::new(); - -#[derive(Sequence, Debug)] -pub enum BuiltInIdentifier { - Option, - None, - Some, - Result, - Ok, - Error, -} - -impl BuiltInIdentifier { - pub fn get(&self) -> &Identifier { - match self { - BuiltInIdentifier::Option => { - OPTION.get_or_init(|| Identifier::from_raw_parts(Arc::new("Option".to_string()))) - } - BuiltInIdentifier::None => { - NONE.get_or_init(|| Identifier::from_raw_parts(Arc::new("None".to_string()))) - } - BuiltInIdentifier::Some => { - SOME.get_or_init(|| Identifier::from_raw_parts(Arc::new("Some".to_string()))) - } - BuiltInIdentifier::Result => { - RESULT.get_or_init(|| Identifier::from_raw_parts(Arc::new("Result".to_string()))) - } - BuiltInIdentifier::Ok => { - OK.get_or_init(|| Identifier::from_raw_parts(Arc::new("Ok".to_string()))) - } - BuiltInIdentifier::Error => { - ERROR.get_or_init(|| Identifier::from_raw_parts(Arc::new("Error".to_string()))) - } - } - } -} diff --git a/src/built_in_type_definitions.rs b/src/built_in_type_definitions.rs deleted file mode 100644 index 1eaf791..0000000 --- a/src/built_in_type_definitions.rs +++ /dev/null @@ -1,56 +0,0 @@ -use std::sync::OnceLock; - -use enum_iterator::{all, Sequence}; - -use crate::{ - error::rw_lock_error::RwLockError, Context, EnumDefinition, Identifier, Type, TypeDefinition, -}; - -static OPTION: OnceLock> = OnceLock::new(); -static RESULT: OnceLock> = OnceLock::new(); - -pub fn all_built_in_type_definitions() -> impl Iterator { - all() -} - -#[derive(Sequence)] -pub enum BuiltInTypeDefinition { - Option, - Result, -} - -impl BuiltInTypeDefinition { - pub fn name(&self) -> &'static str { - match self { - BuiltInTypeDefinition::Option => "Option", - BuiltInTypeDefinition::Result => "Result", - } - } - - pub fn get(&self, _context: &Context) -> &Result { - match self { - BuiltInTypeDefinition::Option => OPTION.get_or_init(|| { - let definition = TypeDefinition::Enum(EnumDefinition::new( - Identifier::new(self.name()), - vec![ - (Identifier::new("Some"), vec![Type::Any]), - (Identifier::new("None"), Vec::with_capacity(0)), - ], - )); - - Ok(definition) - }), - BuiltInTypeDefinition::Result => RESULT.get_or_init(|| { - let definition = TypeDefinition::Enum(EnumDefinition::new( - Identifier::new(self.name()), - vec![ - (Identifier::new("Ok"), vec![Type::Any]), - (Identifier::new("Error"), vec![Type::Any]), - ], - )); - - Ok(definition) - }), - } - } -} diff --git a/src/built_in_types.rs b/src/built_in_types.rs deleted file mode 100644 index 61e1251..0000000 --- a/src/built_in_types.rs +++ /dev/null @@ -1,29 +0,0 @@ -use std::sync::OnceLock; - -use crate::{Identifier, Type}; - -static OPTION: OnceLock = OnceLock::new(); - -pub enum BuiltInType { - Option(Option), -} - -impl BuiltInType { - pub fn name(&self) -> &'static str { - match self { - BuiltInType::Option(_) => "Option", - } - } - - pub fn get(&self) -> &Type { - match self { - BuiltInType::Option(content_type) => OPTION.get_or_init(|| { - if let Some(content_type) = content_type { - Type::custom(Identifier::new("Option"), vec![content_type.clone()]) - } else { - Type::custom(Identifier::new("Option"), Vec::with_capacity(0)) - } - }), - } - } -} diff --git a/src/built_in_values.rs b/src/built_in_values.rs deleted file mode 100644 index 8d1a835..0000000 --- a/src/built_in_values.rs +++ /dev/null @@ -1,204 +0,0 @@ -use std::{env::args, sync::OnceLock}; - -use enum_iterator::{all, Sequence}; -use serde::{Deserialize, Serialize}; - -use crate::{ - built_in_functions::{ - fs::all_fs_functions, io::all_io_functions, json::json_functions, str::string_functions, - Callable, - }, - BuiltInFunction, EnumInstance, Function, Identifier, List, Map, Value, -}; - -static ARGS: OnceLock = OnceLock::new(); -static FS: OnceLock = OnceLock::new(); -static IO: OnceLock = OnceLock::new(); -static JSON: OnceLock = OnceLock::new(); -static NONE: OnceLock = OnceLock::new(); -static RANDOM: OnceLock = OnceLock::new(); -static STR: OnceLock = OnceLock::new(); - -/// Returns the entire built-in value API. -pub fn all_built_in_values() -> impl Iterator { - all() -} - -/// A variable with a hard-coded key that is globally available. -#[derive(Sequence, Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)] -pub enum BuiltInValue { - /// The arguments used to launch the current program. - Args, - - /// Create an error if two values are not equal. - AssertEqual, - - /// File system tools. - Fs, - - /// Input and output tools. - Io, - - /// JSON format tools. - Json, - - /// Get the length of a collection. - Length, - - /// The absence of a value. - None, - - /// Print a value to stdout. - Output, - - /// Random value generators. - Random, - - /// String utilities. - Str, -} - -impl BuiltInValue { - /// Returns the hard-coded key used to identify the value. - pub fn name(&self) -> &'static str { - match self { - BuiltInValue::Args => "args", - BuiltInValue::AssertEqual => "assert_equal", - BuiltInValue::Fs => "fs", - BuiltInValue::Io => "io", - BuiltInValue::Json => "json", - BuiltInValue::Length => BuiltInFunction::Length.name(), - BuiltInValue::None => "None", - BuiltInValue::Output => "output", - BuiltInValue::Random => "random", - BuiltInValue::Str => "str", - } - } - - /// Returns a brief description of the value's features. - /// - /// This is used by the shell when suggesting completions. - pub fn description(&self) -> &'static str { - match self { - BuiltInValue::Args => "The command line arguments sent to this program.", - BuiltInValue::AssertEqual => "Error if the two values are not equal.", - BuiltInValue::Fs => "File and directory tools.", - BuiltInValue::Io => "Input/output tools.", - BuiltInValue::Json => "JSON formatting tools.", - BuiltInValue::Length => BuiltInFunction::Length.description(), - BuiltInValue::None => "The absence of a value.", - BuiltInValue::Output => "output", - BuiltInValue::Random => "random", - BuiltInValue::Str => "string", - } - } - - /// Returns the value by creating it or, if it has already been accessed, retrieving it from its - /// [OnceLock][]. - pub fn get(&self) -> Value { - match self { - BuiltInValue::Args => ARGS - .get_or_init(|| { - let args = args().map(|arg| Value::string(arg.to_string())).collect(); - - Value::List(List::with_items(args)) - }) - .clone(), - BuiltInValue::AssertEqual => { - Value::Function(Function::BuiltIn(BuiltInFunction::AssertEqual)) - } - BuiltInValue::Io => IO - .get_or_init(|| { - let mut io_map = Map::new(); - - for io_function in all_io_functions() { - let key = io_function.name(); - let value = - Value::Function(Function::BuiltIn(BuiltInFunction::Io(io_function))); - - io_map.set(Identifier::new(key), value); - } - - Value::Map(io_map) - }) - .clone(), - BuiltInValue::Fs => FS - .get_or_init(|| { - let mut fs_map = Map::new(); - - for fs_function in all_fs_functions() { - let key = fs_function.name(); - let value = - Value::Function(Function::BuiltIn(BuiltInFunction::Fs(fs_function))); - - fs_map.set(Identifier::new(key), value); - } - - Value::Map(fs_map) - }) - .clone(), - BuiltInValue::Json => JSON - .get_or_init(|| { - let mut json_map = Map::new(); - - for json_function in json_functions() { - let key = json_function.name(); - let value = Value::Function(Function::BuiltIn(BuiltInFunction::Json( - json_function, - ))); - - json_map.set(Identifier::new(key), value); - } - - Value::Map(json_map) - }) - .clone(), - BuiltInValue::Length => Value::Function(Function::BuiltIn(BuiltInFunction::Length)), - BuiltInValue::None => NONE - .get_or_init(|| { - Value::Enum(EnumInstance::new( - Identifier::new("Option"), - Identifier::new("None"), - None, - )) - }) - .clone(), - BuiltInValue::Output => Value::Function(Function::BuiltIn(BuiltInFunction::Output)), - BuiltInValue::Random => RANDOM - .get_or_init(|| { - let mut random_map = Map::new(); - - for built_in_function in [ - BuiltInFunction::RandomBoolean, - BuiltInFunction::RandomFloat, - BuiltInFunction::RandomFrom, - BuiltInFunction::RandomInteger, - ] { - let identifier = Identifier::new(built_in_function.name()); - let value = Value::Function(Function::BuiltIn(built_in_function)); - - random_map.set(identifier, value); - } - - Value::Map(random_map) - }) - .clone(), - BuiltInValue::Str => STR - .get_or_init(|| { - let mut str_map = Map::new(); - - for string_function in string_functions() { - let identifier = Identifier::new(string_function.name()); - let value = Value::Function(Function::BuiltIn(BuiltInFunction::String( - string_function, - ))); - - str_map.set(identifier, value); - } - - Value::Map(str_map) - }) - .clone(), - } - } -} diff --git a/src/context/mod.rs b/src/context/mod.rs deleted file mode 100644 index ef94cd7..0000000 --- a/src/context/mod.rs +++ /dev/null @@ -1,395 +0,0 @@ -//! A garbage-collecting execution context that stores variables and type data -//! during the [Interpreter][crate::Interpreter]'s abstraction and execution -//! process. -//! -//! ## Setting values -//! -//! When data is stored in a context, it can be accessed by dust source code. -//! This allows you to insert values and type definitions before any code is -//! interpreted. -//! -//! ``` -//! # use dust_lang::*; -//! let context = Context::default(); -//! -//! context.set_value( -//! "foobar".into(), -//! Value::String("FOOBAR".to_string()) -//! ).unwrap(); -//! -//! interpret_with_context("output foobar", context); -//! -//! // Stdout: "FOOBAR" -//! ``` -//! -//! ## Built-in values and type definitions -//! -//! When looking up values and definitions, the Context will try to use one that -//! has been explicitly set. If nothing is found, it will then check the built- -//! in values and type definitions for a match. This means that the user can -//! override the built-ins. -//! -//! ## Garbage Collection -//! -//! To disable garbage collection, run a Context in AllowGarbage mode. -//! -//! ``` -//! # use dust_lang::*; -//! let context = Context::new(ContextMode::AllowGarbage); -//! ``` -//! -//! -//! Every item stored in a Context has a counter attached to it. You must use -//! [Context::add_allowance][] to let the Context know not to drop the value. -//! Every time you use [Context::get_value][] it checks the number of times it -//! has been used and compares it to the number of allowances. If the limit -//! has been reached, the value will be removed from the context and can no -//! longer be found. -mod usage_counter; -mod value_data; - -pub use usage_counter::UsageCounter; -pub use value_data::ValueData; - -use std::{ - cmp::Ordering, - collections::BTreeMap, - fmt::Display, - sync::{Arc, RwLock, RwLockReadGuard}, -}; - -use crate::{ - built_in_type_definitions::all_built_in_type_definitions, built_in_values::all_built_in_values, - error::rw_lock_error::RwLockError, Identifier, Type, TypeDefinition, Value, -}; - -#[derive(Clone, Debug, PartialEq)] -pub enum ContextMode { - AllowGarbage, - RemoveGarbage, -} - -/// An execution context stores that variable and type data during the -/// [Interpreter]'s abstraction and execution process. -/// -/// See the [module-level docs][self] for more info. -#[derive(Clone, Debug)] -pub struct Context { - mode: ContextMode, - inner: Arc>>, -} - -impl Context { - /// Return a new, empty Context. - pub fn new(mode: ContextMode) -> Self { - Self { - mode, - inner: Arc::new(RwLock::new(BTreeMap::new())), - } - } - - /// Return a lock guard to the inner BTreeMap. - pub fn inner( - &self, - ) -> Result>, RwLockError> { - Ok(self.inner.read()?) - } - - /// Create a new context with all of the data from an existing context. - pub fn with_variables_from(other: &Context) -> Result { - let mut new_variables = BTreeMap::new(); - - for (identifier, (value_data, counter)) in other.inner.read()?.iter() { - let (allowances, _runtime_uses) = counter.get_counts()?; - let new_counter = UsageCounter::with_counts(allowances, 0); - - new_variables.insert(identifier.clone(), (value_data.clone(), new_counter)); - } - - Ok(Context { - mode: other.mode.clone(), - inner: Arc::new(RwLock::new(new_variables)), - }) - } - - /// Modify a context to take the functions and type definitions of another. - /// - /// In the case of the conflict, the inherited value will override the previous - /// value. - pub fn inherit_from(&self, other: &Context) -> Result<(), RwLockError> { - let mut self_variables = self.inner.write()?; - - for (identifier, (value_data, counter)) in other.inner.read()?.iter() { - let (allowances, _runtime_uses) = counter.get_counts()?; - let new_counter = UsageCounter::with_counts(allowances, 0); - - if let ValueData::Value(value) = value_data { - if value.is_function() { - self_variables.insert(identifier.clone(), (value_data.clone(), new_counter)); - } - } else if let ValueData::TypeHint(r#type) = value_data { - if r#type.is_function() { - self_variables.insert(identifier.clone(), (value_data.clone(), new_counter)); - } - } else if let ValueData::TypeDefinition(_) = value_data { - self_variables.insert(identifier.clone(), (value_data.clone(), new_counter)); - } - } - - Ok(()) - } - - /// Modify a context to take all the information of another. - /// - /// In the case of the conflict, the inherited value will override the previous - /// value. - /// - /// ``` - /// # use dust_lang::*; - /// let first_context = Context::default(); - /// let second_context = Context::default(); - /// - /// second_context.set_value( - /// "Foo".into(), - /// Value::String("Bar".to_string()) - /// ); - /// - /// first_context.inherit_all_from(&second_context).unwrap(); - /// - /// assert_eq!(first_context, second_context); - /// ``` - pub fn inherit_all_from(&self, other: &Context) -> Result<(), RwLockError> { - let mut self_variables = self.inner.write()?; - - for (identifier, (value_data, _counter)) in other.inner.read()?.iter() { - self_variables.insert( - identifier.clone(), - (value_data.clone(), UsageCounter::new()), - ); - } - - Ok(()) - } - - /// Increment the number of allowances a variable has. Return a boolean - /// representing whether or not the variable was found. - pub fn add_allowance(&self, identifier: &Identifier) -> Result { - if let Some((_value_data, counter)) = self.inner.read()?.get(identifier) { - log::debug!("Adding allowance for {identifier}."); - - counter.add_allowance()?; - - Ok(true) - } else { - Ok(false) - } - } - - /// Get a [Value] from the context. - pub fn get_value(&self, identifier: &Identifier) -> Result, RwLockError> { - let (value, counter) = - if let Some((value_data, counter)) = self.inner.read()?.get(identifier) { - if let ValueData::Value(value) = value_data { - (value.clone(), counter.clone()) - } else { - return Ok(None); - } - } else { - for built_in_value in all_built_in_values() { - if built_in_value.name() == identifier.inner().as_ref() { - return Ok(Some(built_in_value.get().clone())); - } - } - - return Ok(None); - }; - - counter.add_runtime_use()?; - - log::debug!("Adding runtime use for {identifier}."); - - let (allowances, runtime_uses) = counter.get_counts()?; - - if self.mode == ContextMode::RemoveGarbage && allowances == runtime_uses { - self.unset(identifier)?; - } - - Ok(Some(value)) - } - - /// Get a [Type] from the context. - /// - /// If the key matches a stored [Value], its type will be returned. It if - /// matches a type hint, the type hint will be returned. - pub fn get_type(&self, identifier: &Identifier) -> Result, RwLockError> { - if let Some((value_data, _counter)) = self.inner.read()?.get(identifier) { - match value_data { - ValueData::Value(value) => return Ok(Some(value.r#type()?)), - ValueData::TypeHint(r#type) => return Ok(Some(r#type.clone())), - ValueData::TypeDefinition(_) => todo!(), - } - } - - for built_in_value in all_built_in_values() { - if built_in_value.name() == identifier.inner().as_ref() { - return Ok(Some(built_in_value.get().r#type()?)); - } - } - - Ok(None) - } - - /// Get a [TypeDefinition] from the context. - /// - /// This will also return a built-in type definition if one matches the key. - /// See the [module-level docs][self] for more info. - pub fn get_definition( - &self, - identifier: &Identifier, - ) -> Result, RwLockError> { - if let Some((value_data, _counter)) = self.inner.read()?.get(identifier) { - if let ValueData::TypeDefinition(definition) = value_data { - return Ok(Some(definition.clone())); - } - } - - for built_in_definition in all_built_in_type_definitions() { - if built_in_definition.name() == identifier.inner().as_ref() { - return Ok(Some(built_in_definition.get(self).clone()?)); - } - } - - Ok(None) - } - - /// Set a value to a key. - pub fn set_value(&self, key: Identifier, value: Value) -> Result<(), RwLockError> { - let mut map = self.inner.write()?; - let old_data = map.remove(&key); - - if let Some((_, old_counter)) = old_data { - map.insert(key, (ValueData::Value(value), old_counter)); - } else { - map.insert(key, (ValueData::Value(value), UsageCounter::new())); - } - - Ok(()) - } - - /// Set a type hint. - /// - /// This allows the interpreter to check a value's type before the value - /// actually exists by predicting what the abstract tree will produce. - pub fn set_type(&self, key: Identifier, r#type: Type) -> Result<(), RwLockError> { - self.inner - .write()? - .insert(key, (ValueData::TypeHint(r#type), UsageCounter::new())); - - Ok(()) - } - - /// Set a type definition. - /// - /// This allows defined types (i.e. structs and enums) to be instantiated - /// later while running the interpreter using this context. - pub fn set_definition( - &self, - key: Identifier, - definition: TypeDefinition, - ) -> Result<(), RwLockError> { - self.inner.write()?.insert( - key, - (ValueData::TypeDefinition(definition), UsageCounter::new()), - ); - - Ok(()) - } - - /// Remove a key-value pair. - pub fn unset(&self, key: &Identifier) -> Result<(), RwLockError> { - log::debug!("Dropping variable {key}."); - - self.inner.write()?.remove(key); - - Ok(()) - } -} - -impl Default for Context { - fn default() -> Self { - Context::new(ContextMode::RemoveGarbage) - } -} - -impl Eq for Context {} - -impl PartialEq for Context { - fn eq(&self, other: &Self) -> bool { - let self_variables = self.inner().unwrap(); - let other_variables = other.inner().unwrap(); - - if self_variables.len() != other_variables.len() { - return false; - } - - for ((left_key, left_value_data), (right_key, right_value_data)) in - self_variables.iter().zip(other_variables.iter()) - { - if left_key != right_key || left_value_data != right_value_data { - return false; - } - } - - true - } -} - -impl PartialOrd for Context { - fn partial_cmp(&self, other: &Self) -> Option { - Some(self.cmp(other)) - } -} - -impl Ord for Context { - fn cmp(&self, other: &Self) -> Ordering { - let left = self.inner().unwrap(); - let right = other.inner().unwrap(); - - left.cmp(&right) - } -} - -impl Display for Context { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - writeln!(f, "{{")?; - - for (identifier, value_data) in self.inner.read().unwrap().iter() { - writeln!(f, "{identifier} {value_data:?}")?; - } - - writeln!(f, "}}") - } -} - -#[cfg(test)] -mod tests { - use crate::*; - - #[test] - fn drops_variables() { - let context = Context::default(); - - interpret_with_context( - " - x = 1 - y = 2 - - z = x + y - ", - context.clone(), - ) - .unwrap(); - - assert_eq!(context.inner.read().unwrap().len(), 1); - } -} diff --git a/src/context/usage_counter.rs b/src/context/usage_counter.rs deleted file mode 100644 index 02a01f5..0000000 --- a/src/context/usage_counter.rs +++ /dev/null @@ -1,74 +0,0 @@ -use std::{ - cmp::Ordering, - sync::{Arc, RwLock}, -}; - -use crate::error::rw_lock_error::RwLockError; - -#[derive(Clone, Debug)] -pub struct UsageCounter(Arc>); - -impl UsageCounter { - pub fn new() -> UsageCounter { - UsageCounter(Arc::new(RwLock::new(UsageCounterInner { - allowances: 0, - runtime_uses: 0, - }))) - } - - pub fn with_counts(allowances: usize, runtime_uses: usize) -> UsageCounter { - UsageCounter(Arc::new(RwLock::new(UsageCounterInner { - allowances, - runtime_uses, - }))) - } - - pub fn get_counts(&self) -> Result<(usize, usize), RwLockError> { - let inner = self.0.read()?; - Ok((inner.allowances, inner.runtime_uses)) - } - - pub fn add_allowance(&self) -> Result<(), RwLockError> { - self.0.write()?.allowances += 1; - - Ok(()) - } - - pub fn add_runtime_use(&self) -> Result<(), RwLockError> { - self.0.write()?.runtime_uses += 1; - - Ok(()) - } -} - -impl Eq for UsageCounter {} - -impl PartialEq for UsageCounter { - fn eq(&self, other: &Self) -> bool { - let left = self.0.read().unwrap(); - let right = other.0.read().unwrap(); - - *left == *right - } -} - -impl PartialOrd for UsageCounter { - fn partial_cmp(&self, other: &Self) -> Option { - Some(self.cmp(other)) - } -} - -impl Ord for UsageCounter { - fn cmp(&self, other: &Self) -> Ordering { - let left = self.0.read().unwrap(); - let right = other.0.read().unwrap(); - - left.cmp(&right) - } -} - -#[derive(Clone, Debug, Eq, PartialEq, PartialOrd, Ord)] -struct UsageCounterInner { - pub allowances: usize, - pub runtime_uses: usize, -} diff --git a/src/context/value_data.rs b/src/context/value_data.rs deleted file mode 100644 index 90e3cbf..0000000 --- a/src/context/value_data.rs +++ /dev/null @@ -1,8 +0,0 @@ -use crate::{Type, TypeDefinition, Value}; - -#[derive(Clone, Debug, Eq, PartialEq, PartialOrd, Ord)] -pub enum ValueData { - Value(Value), - TypeHint(Type), - TypeDefinition(TypeDefinition), -} diff --git a/src/error/mod.rs b/src/error/mod.rs deleted file mode 100644 index 969be96..0000000 --- a/src/error/mod.rs +++ /dev/null @@ -1,110 +0,0 @@ -//! Error and Result types. -//! -//! To deal with errors from dependencies, either create a new error variant -//! or use the ToolFailure variant if the error can only occur inside a tool. -mod runtime_error; -pub(crate) mod rw_lock_error; -mod syntax_error; -mod validation_error; - -use colored::Colorize; -pub use runtime_error::RuntimeError; -pub use syntax_error::SyntaxError; -pub use validation_error::ValidationError; - -use tree_sitter::LanguageError; - -use std::fmt::{self, Formatter}; - -#[derive(Debug, PartialEq)] -pub enum Error { - Syntax(SyntaxError), - - Validation(ValidationError), - - Runtime(RuntimeError), - - ParserCancelled, - - Language(LanguageError), -} - -impl Error { - /// Create a pretty error report with `lyneate`. - /// - /// The `source` argument should be the full source code document that was - /// used to create this error. - pub fn create_report(&self, source: &str) -> String { - match self { - Error::Syntax(syntax_error) => { - let report = syntax_error.create_report(source); - - format!( - "{}\n{}\n{report}", - "Syntax Error".bold().yellow().underline(), - "Dust does not recognize this syntax.".dimmed() - ) - } - Error::Validation(validation_error) => { - let report = validation_error.create_report(source); - - format!( - "{}\n{}\n{report}", - "Validation Error".bold().yellow().underline(), - "Dust prevented the program from running.".dimmed() - ) - } - Error::Runtime(runtime_error) => { - let report = runtime_error.create_report(source); - - format!( - "{}\n{}\n{report}", - "Runtime Error".bold().red().underline(), - "This error occured while the program was running.".dimmed() - ) - } - Error::ParserCancelled => todo!(), - Error::Language(_) => todo!(), - } - } -} - -impl From for Error { - fn from(error: SyntaxError) -> Self { - Error::Syntax(error) - } -} - -impl From for Error { - fn from(error: ValidationError) -> Self { - Error::Validation(error) - } -} - -impl From for Error { - fn from(error: RuntimeError) -> Self { - Error::Runtime(error) - } -} - -impl From for Error { - fn from(error: LanguageError) -> Self { - Error::Language(error) - } -} - -impl std::error::Error for Error {} - -impl fmt::Display for Error { - fn fmt(&self, f: &mut Formatter) -> fmt::Result { - use Error::*; - - match self { - Syntax(error) => write!(f, "{error}"), - Validation(error) => write!(f, "{error}"), - Runtime(error) => write!(f, "{error}"), - ParserCancelled => write!(f, "Parsing was cancelled because the parser took too long."), - Language(_error) => write!(f, "Parser failed to load language grammar."), - } - } -} diff --git a/src/error/runtime_error.rs b/src/error/runtime_error.rs deleted file mode 100644 index 920df7d..0000000 --- a/src/error/runtime_error.rs +++ /dev/null @@ -1,193 +0,0 @@ -use std::{ - fmt::{self, Debug, Display, Formatter}, - io, - num::ParseFloatError, - string::FromUtf8Error, - sync::PoisonError, - time, -}; - -use lyneate::Report; - -use crate::{SourcePosition, Type, Value}; - -use super::{rw_lock_error::RwLockError, ValidationError}; - -#[derive(Debug, PartialEq)] -pub enum RuntimeError { - /// The 'assert' macro did not resolve successfully. - AssertEqualFailed { - left: Value, - right: Value, - }, - - /// The 'assert' macro did not resolve successfully. - AssertFailed { - assertion: Value, - }, - - /// The attempted conversion is impossible. - ConversionImpossible { - from: Type, - to: Type, - position: SourcePosition, - }, - - Csv(String), - - Io(String), - - Reqwest(String), - - Json(String), - - SystemTime(String), - - Toml(toml::de::Error), - - /// Failed to read or write a map. - /// - /// See the [MapError] docs for more info. - RwLock(RwLockError), - - ParseFloat(ParseFloatError), - - Utf8(FromUtf8Error), - - /// A built-in function was called with the wrong amount of arguments. - ExpectedBuiltInFunctionArgumentAmount { - function_name: String, - expected: usize, - actual: usize, - }, - - ValidationFailure(ValidationError), -} - -impl RuntimeError { - pub fn create_report(&self, source: &str) -> String { - let messages = match self { - RuntimeError::AssertEqualFailed { - left: expected, - right: actual, - } => { - vec![( - 0..source.len(), - format!("\"assert_equal\" failed. {} != {}", expected, actual), - (200, 0, 0), - )] - } - RuntimeError::AssertFailed { assertion: _ } => todo!(), - RuntimeError::ConversionImpossible { from, to, position } => vec![( - position.start_byte..position.end_byte, - format!("Cannot convert from {from} to {to}."), - (255, 64, 112), - )], - RuntimeError::Csv(_) => todo!(), - RuntimeError::Io(_) => todo!(), - RuntimeError::Reqwest(_) => todo!(), - RuntimeError::Json(_) => todo!(), - RuntimeError::SystemTime(_) => todo!(), - RuntimeError::Toml(_) => todo!(), - RuntimeError::RwLock(_) => todo!(), - RuntimeError::ParseFloat(_) => todo!(), - RuntimeError::Utf8(_) => todo!(), - RuntimeError::ExpectedBuiltInFunctionArgumentAmount { - function_name: _, - expected: _, - actual: _, - } => todo!(), - RuntimeError::ValidationFailure(_) => todo!(), - }; - - Report::new_byte_spanned(source, messages).display_str() - } - - pub fn expect_argument_amount( - function_name: &str, - expected: usize, - actual: usize, - ) -> Result<(), Self> { - if expected == actual { - Ok(()) - } else { - Err(RuntimeError::ExpectedBuiltInFunctionArgumentAmount { - function_name: function_name.to_string(), - expected, - actual, - }) - } - } -} - -impl From for RuntimeError { - fn from(error: ValidationError) -> Self { - RuntimeError::ValidationFailure(error) - } -} - -impl From for RuntimeError { - fn from(error: csv::Error) -> Self { - RuntimeError::Csv(error.to_string()) - } -} - -impl From for RuntimeError { - fn from(error: std::io::Error) -> Self { - RuntimeError::Io(error.to_string()) - } -} - -impl From for RuntimeError { - fn from(error: reqwest::Error) -> Self { - RuntimeError::Reqwest(error.to_string()) - } -} - -impl From for RuntimeError { - fn from(error: serde_json::Error) -> Self { - RuntimeError::Json(error.to_string()) - } -} - -impl From for RuntimeError { - fn from(error: time::SystemTimeError) -> Self { - RuntimeError::SystemTime(error.to_string()) - } -} - -impl From for RuntimeError { - fn from(error: toml::de::Error) -> Self { - RuntimeError::Toml(error) - } -} - -impl From for RuntimeError { - fn from(error: ParseFloatError) -> Self { - RuntimeError::ParseFloat(error) - } -} - -impl From for RuntimeError { - fn from(error: FromUtf8Error) -> Self { - RuntimeError::Utf8(error) - } -} - -impl From for RuntimeError { - fn from(error: RwLockError) -> Self { - RuntimeError::RwLock(error) - } -} - -impl From> for RuntimeError { - fn from(_: PoisonError) -> Self { - RuntimeError::RwLock(RwLockError) - } -} - -impl Display for RuntimeError { - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { - write!(f, "{self:?}") - } -} diff --git a/src/error/rw_lock_error.rs b/src/error/rw_lock_error.rs deleted file mode 100644 index 9ad0a7c..0000000 --- a/src/error/rw_lock_error.rs +++ /dev/null @@ -1,30 +0,0 @@ -use std::{ - fmt::{self, Debug, Display, Formatter}, - sync::PoisonError, -}; - -use serde::{Deserialize, Serialize}; - -#[derive(Clone, PartialEq, Serialize, Deserialize)] -pub struct RwLockError; - -impl Display for RwLockError { - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { - write!( - f, - "Map error: failed to acquire a read/write lock because another thread has panicked." - ) - } -} - -impl Debug for RwLockError { - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { - write!(f, "{self}") - } -} - -impl From> for RwLockError { - fn from(_: PoisonError) -> Self { - RwLockError - } -} diff --git a/src/error/syntax_error.rs b/src/error/syntax_error.rs deleted file mode 100644 index c2bed44..0000000 --- a/src/error/syntax_error.rs +++ /dev/null @@ -1,126 +0,0 @@ -use std::fmt::{self, Display, Formatter}; - -use colored::Colorize; -use lyneate::Report; -use serde::{Deserialize, Serialize}; -use tree_sitter::Node as SyntaxNode; - -use crate::SourcePosition; - -use super::rw_lock_error::RwLockError; - -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] -pub enum SyntaxError { - /// Invalid user input. - InvalidSource { - expected: String, - actual: String, - position: SourcePosition, - }, - - RwLock(RwLockError), - - UnexpectedSyntaxNode { - expected: String, - actual: String, - position: SourcePosition, - }, -} - -impl SyntaxError { - pub fn create_report(&self, source: &str) -> String { - let messages = match self { - SyntaxError::InvalidSource { position, .. } => self - .to_string() - .split_inclusive(".") - .map(|message_part| { - ( - position.start_byte..position.end_byte, - message_part.to_string(), - (255, 200, 100), - ) - }) - .collect(), - SyntaxError::RwLock(_) => todo!(), - SyntaxError::UnexpectedSyntaxNode { position, .. } => { - vec![( - position.start_byte..position.end_byte, - self.to_string(), - (255, 200, 100), - )] - } - }; - - Report::new_byte_spanned(source, messages).display_str() - } - - pub fn expect_syntax_node(expected: &str, actual: SyntaxNode) -> Result<(), SyntaxError> { - log::trace!("Converting {} to abstract node", actual.kind()); - - if expected == actual.kind() { - Ok(()) - } else if actual.is_error() { - Err(SyntaxError::InvalidSource { - expected: expected.to_owned(), - actual: actual.kind().to_string(), - position: SourcePosition::from(actual.range()), - }) - } else { - Err(SyntaxError::UnexpectedSyntaxNode { - expected: expected.to_string(), - actual: actual.kind().to_string(), - position: SourcePosition::from(actual.range()), - }) - } - } -} - -impl From for SyntaxError { - fn from(error: RwLockError) -> Self { - SyntaxError::RwLock(error) - } -} - -impl Display for SyntaxError { - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { - match self { - SyntaxError::InvalidSource { - expected, - actual, - position, - } => { - let actual = if actual == "ERROR" { - "unrecognized characters" - } else { - actual - }; - - write!( - f, - "Invalid syntax from ({}, {}) to ({}, {}). Exected {} but found {}.", - position.start_row, - position.start_column, - position.end_row, - position.end_column, - expected.bold().green(), - actual.bold().red(), - ) - } - SyntaxError::RwLock(_) => todo!(), - SyntaxError::UnexpectedSyntaxNode { - expected, - actual, - position, - } => { - write!( - f, - "Interpreter Error. Tried to parse {actual} as {expected} from ({}, {}) to ({}, {}).", - position.start_row, - position.start_column, - position.end_row, - position.end_column, - ) - } - } - } -} diff --git a/src/error/validation_error.rs b/src/error/validation_error.rs deleted file mode 100644 index 797d33c..0000000 --- a/src/error/validation_error.rs +++ /dev/null @@ -1,283 +0,0 @@ -use std::{ - fmt::{self, Display, Formatter}, - sync::PoisonError, -}; - -use colored::Colorize; -use lyneate::Report; -use serde::{Deserialize, Serialize}; - -use crate::{Identifier, SourcePosition, Type, TypeDefinition, Value}; - -use super::rw_lock_error::RwLockError; - -#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] -pub enum ValidationError { - /// Two value are incompatible for addition. - CannotAdd { - left: Value, - right: Value, - position: SourcePosition, - }, - - /// Two value are incompatible for subtraction. - CannotSubtract { - left: Value, - right: Value, - position: SourcePosition, - }, - - /// Two value are incompatible for multiplication. - CannotMultiply { - left: Value, - right: Value, - position: SourcePosition, - }, - - /// Two value are incompatible for dividing. - CannotDivide { - left: Value, - right: Value, - position: SourcePosition, - }, - - /// The attempted conversion is impossible. - ConversionImpossible { - initial_type: Type, - target_type: Type, - }, - - ExpectedString { - actual: Value, - }, - - ExpectedInteger { - actual: Value, - }, - - ExpectedFloat { - actual: Value, - }, - - /// An integer, floating point or value was expected. - ExpectedNumber { - actual: Value, - }, - - /// An integer, floating point or string value was expected. - ExpectedNumberOrString { - actual: Value, - }, - - ExpectedBoolean { - actual: Value, - }, - - ExpectedList { - actual: Value, - }, - - ExpectedMinLengthList { - minimum_len: usize, - actual_len: usize, - }, - - ExpectedFixedLenList { - expected_len: usize, - actual: Value, - }, - - ExpectedMap { - actual: Value, - }, - - ExpectedFunction { - actual: Value, - }, - - /// A string, list, map or table value was expected. - ExpectedCollection { - actual: Value, - }, - - /// A built-in function was called with the wrong amount of arguments. - ExpectedBuiltInFunctionArgumentAmount { - function_name: String, - expected: usize, - actual: usize, - }, - - /// A function was called with the wrong amount of arguments. - ExpectedFunctionArgumentAmount { - expected: usize, - actual: usize, - position: SourcePosition, - }, - - /// A function was called with the wrong amount of arguments. - ExpectedFunctionArgumentMinimum { - minumum_expected: usize, - actual: usize, - position: SourcePosition, - }, - - /// Failed to read or write a map. - /// - /// See the [MapError] docs for more info. - RwLock(RwLockError), - - TypeCheck { - expected: Type, - actual: Type, - position: SourcePosition, - }, - - TypeCheckExpectedFunction { - actual: Type, - position: SourcePosition, - }, - - /// Failed to find a value with this key. - VariableIdentifierNotFound(Identifier), - - /// Failed to find a type definition with this key. - TypeDefinitionNotFound(Identifier), - - /// Failed to find an enum definition with this key. - ExpectedEnumDefintion { - actual: TypeDefinition, - }, - - /// Failed to find a struct definition with this key. - ExpectedStructDefintion { - actual: TypeDefinition, - }, -} - -impl ValidationError { - pub fn create_report(&self, source: &str) -> String { - let messages = match self { - ValidationError::CannotAdd { - left: _, - right: _, - position, - } => vec![ - (( - position.start_byte..position.end_byte, - format!(""), - (255, 159, 64), - )), - ], - ValidationError::CannotSubtract { - left: _, - right: _, - position: _, - } => todo!(), - ValidationError::CannotMultiply { - left: _, - right: _, - position: _, - } => todo!(), - ValidationError::CannotDivide { - left: _, - right: _, - position: _, - } => todo!(), - ValidationError::ConversionImpossible { - initial_type: _, - target_type: _, - } => todo!(), - ValidationError::ExpectedString { actual: _ } => todo!(), - ValidationError::ExpectedInteger { actual: _ } => todo!(), - ValidationError::ExpectedFloat { actual: _ } => todo!(), - ValidationError::ExpectedNumber { actual: _ } => todo!(), - ValidationError::ExpectedNumberOrString { actual: _ } => todo!(), - ValidationError::ExpectedBoolean { actual: _ } => todo!(), - ValidationError::ExpectedList { actual: _ } => todo!(), - ValidationError::ExpectedMinLengthList { - minimum_len: _, - actual_len: _, - } => todo!(), - ValidationError::ExpectedFixedLenList { - expected_len: _, - actual: _, - } => todo!(), - ValidationError::ExpectedMap { actual: _ } => todo!(), - ValidationError::ExpectedFunction { actual: _ } => todo!(), - ValidationError::ExpectedCollection { actual: _ } => todo!(), - ValidationError::ExpectedBuiltInFunctionArgumentAmount { - function_name: _, - expected: _, - actual: _, - } => todo!(), - ValidationError::ExpectedFunctionArgumentAmount { - expected: _, - actual: _, - position: _, - } => todo!(), - ValidationError::ExpectedFunctionArgumentMinimum { - minumum_expected: _, - actual: _, - position: _, - } => todo!(), - ValidationError::RwLock(_) => todo!(), - ValidationError::TypeCheck { - expected, - actual, - position, - } => vec![( - position.start_byte..position.end_byte, - format!( - "Type {} is incompatible with {}.", - actual.to_string().bold().red(), - expected.to_string().bold().green() - ), - (200, 200, 200), - )], - ValidationError::TypeCheckExpectedFunction { - actual: _, - position: _, - } => todo!(), - ValidationError::VariableIdentifierNotFound(_) => todo!(), - ValidationError::TypeDefinitionNotFound(_) => todo!(), - ValidationError::ExpectedEnumDefintion { actual: _ } => todo!(), - ValidationError::ExpectedStructDefintion { actual: _ } => todo!(), - }; - - Report::new_byte_spanned(source, messages).display_str() - } - - pub fn expect_argument_amount( - function_name: &str, - expected: usize, - actual: usize, - ) -> Result<(), Self> { - if expected == actual { - Ok(()) - } else { - Err(ValidationError::ExpectedBuiltInFunctionArgumentAmount { - function_name: function_name.to_string(), - expected, - actual, - }) - } - } -} - -impl From> for ValidationError { - fn from(_: PoisonError) -> Self { - ValidationError::RwLock(RwLockError) - } -} - -impl From for ValidationError { - fn from(_error: RwLockError) -> Self { - ValidationError::RwLock(RwLockError) - } -} - -impl Display for ValidationError { - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { - write!(f, "{self:?}") - } -} diff --git a/src/interpret.rs b/src/interpret.rs deleted file mode 100644 index 4ccb338..0000000 --- a/src/interpret.rs +++ /dev/null @@ -1,157 +0,0 @@ -//! Tools to interpret dust source code. -//! -//! This module has three tools to run Dust code. -//! -//! - [interpret] is the simplest way to run Dust code inside of an application or library -//! - [interpret_with_context] allows you to set variables on the execution context -//! - [Interpreter] is an advanced tool that can parse, validate, run and format Dust code -//! -//! # Examples -//! -//! Run some Dust and get the result. -//! -//! ```rust -//! # use dust_lang::*; -//! assert_eq!( -//! interpret("1 + 2 + 3"), -//! Ok(Value::Integer(6)) -//! ); -//! ``` -//! -//! Create a custom context with variables you can use in your code. -//! -//! ```rust -//! # use dust_lang::*; -//! let context = Context::default(); -//! -//! context.set_value("one".into(), 1.into()).unwrap(); -//! context.set_value("two".into(), 2.into()).unwrap(); -//! context.set_value("three".into(), 3.into()).unwrap(); -//! -//! let dust_code = "four = 4; one + two + three + four"; -//! -//! assert_eq!( -//! interpret_with_context(dust_code, context), -//! Ok(Value::Integer(10)) -//! ); -//! ``` -use tree_sitter::{Parser, Tree as SyntaxTree}; - -use crate::{language, AbstractTree, Context, ContextMode, Error, Format, Root, Value}; - -/// Interpret the given source code. Returns the value of last statement or the -/// first error encountered. -/// -/// See the [module-level docs][self] for more info. -pub fn interpret(source: &str) -> Result { - interpret_with_context(source, Context::new(ContextMode::RemoveGarbage)) -} - -/// Interpret the given source code with the given context. -/// -/// See the [module-level docs][self] for more info. -pub fn interpret_with_context(source: &str, context: Context) -> Result { - let mut interpreter = Interpreter::new(context); - let value = interpreter.run(source)?; - - Ok(value) -} - -/// A source code interpreter for the Dust language. -/// -/// The interpreter's most important functions are used to parse dust source -/// code, verify it is safe and run it. They are written in a way that forces -/// them to be used safely: each step in this process contains the prior -/// steps, meaning that the same code is always used to create the syntax tree, -/// abstract tree and final evaluation. This avoids a critical logic error. -/// -/// ``` -/// # use dust_lang::*; -/// let context = Context::default(); -/// let mut interpreter = Interpreter::new(context); -/// let result = interpreter.run("2 + 2"); -/// -/// assert_eq!(result, Ok(Value::Integer(4))); -/// ``` -pub struct Interpreter { - parser: Parser, - context: Context, -} - -impl Interpreter { - /// Create a new interpreter with the given context. - pub fn new(context: Context) -> Self { - let mut parser = Parser::new(); - - parser - .set_language(language()) - .expect("Language version is incompatible with tree sitter version."); - - parser.set_logger(Some(Box::new(|_log_type, message| { - log::trace!("{}", message) - }))); - - Interpreter { parser, context } - } - - /// Generate a syntax tree from the source. Returns an error if the the - /// parser is cancelled for taking too long. The syntax tree may contain - /// error nodes, which represent syntax errors. - /// - /// Tree sitter is designed to be run on every keystroke, so this is - /// generally a lightweight function to call. - pub fn parse(&mut self, source: &str) -> Result { - if let Some(tree) = self.parser.parse(source, None) { - Ok(tree) - } else { - Err(Error::ParserCancelled) - } - } - - /// Check the source for errors and generate an abstract tree. - /// - /// The order in which this function works is: - /// - /// - parse the source into a syntax tree - /// - generate an abstract tree from the source and syntax tree - /// - check the abstract tree for errors - pub fn validate(&mut self, source: &str) -> Result { - let syntax_tree = self.parse(source)?; - let abstract_tree = Root::from_syntax(syntax_tree.root_node(), source, &self.context)?; - - abstract_tree.validate(source, &self.context)?; - - Ok(abstract_tree) - } - - /// Run the source, returning the final statement's value or first error. - /// - /// This function [parses][Self::parse], [validates][Self::validate] and - /// [runs][Root::run] using the same source code. - pub fn run(&mut self, source: &str) -> Result { - let final_value = self.validate(source)?.run(source, &self.context)?; - - Ok(final_value) - } - - /// Return an s-expression displaying a syntax tree of the source or an - /// error. - pub fn syntax_tree(&mut self, source: &str) -> Result { - Ok(self.parse(source)?.root_node().to_sexp()) - } - - /// Return a formatted version of the source. - pub fn format(&mut self, source: &str) -> Result { - let mut formatted_output = String::new(); - - self.validate(source)?.format(&mut formatted_output, 0); - - Ok(formatted_output) - } -} - -impl Default for Interpreter { - fn default() -> Self { - Interpreter::new(Context::default()) - } -} diff --git a/src/lib.rs b/src/lib.rs index 9a7d410..68e2724 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,47 +1,149 @@ -//! The Dust library is used to parse, format and run dust source code. -//! -//! See the [interpret] module for more information. -//! -//! You can use this library externally by calling either of the "interpret" -//! functions or by constructing your own Interpreter. -pub use crate::{ - abstract_tree::*, built_in_functions::BuiltInFunction, context::*, error::Error, interpret::*, - value::*, -}; +use std::fmt::{self, Display, Formatter}; -pub use tree_sitter::Node as SyntaxNode; +use chumsky::{prelude::*, Parser}; -pub mod abstract_tree; -pub mod built_in_functions; -pub mod built_in_identifiers; -pub mod built_in_type_definitions; -pub mod built_in_types; -pub mod built_in_values; -pub mod context; -pub mod error; -pub mod interpret; -pub mod value; - -use tree_sitter::Language; - -extern "C" { - fn tree_sitter_dust() -> Language; +#[derive(Clone, Debug, PartialEq)] +pub enum Value { + Boolean(bool), + Integer(i64), + String(String), } -/// Get the tree-sitter [Language][] for this grammar. -/// -/// [Language]: https://docs.rs/tree-sitter/*/tree_sitter/struct.Language.html -pub fn language() -> Language { - unsafe { tree_sitter_dust() } +impl Display for Value { + fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { + match self { + Value::Boolean(boolean) => write!(f, "{boolean}"), + Value::Integer(integer) => write!(f, "{integer}"), + Value::String(string) => write!(f, "{string}"), + } + } +} + +pub fn parser() -> impl Parser> { + let boolean = just("true") + .or(just("false")) + .map(|s: &str| Value::Boolean(s.parse().unwrap())); + + let integer = just('-') + .or_not() + .then(text::int(10).padded()) + .map(|(c, s)| { + if let Some(c) = c { + c.to_string() + &s + } else { + s + } + }) + .map(|s: String| Value::Integer(s.parse().unwrap())); + + let delimited_string = |delimiter: char| { + just(delimiter) + .ignore_then(none_of(delimiter).repeated()) + .then_ignore(just(delimiter)) + .map(|chars| Value::String(chars.into_iter().collect())) + }; + + let string = choice(( + delimited_string('\''), + delimited_string('"'), + delimited_string('`'), + )); + + boolean.or(integer).or(string).then_ignore(end()) } #[cfg(test)] mod tests { + use super::*; + #[test] - fn test_can_load_grammar() { - let mut parser = tree_sitter::Parser::new(); - parser - .set_language(super::language()) - .expect("Error loading dust language"); + fn parse_true() { + assert_eq!(parser().parse("true"), Ok(Value::Boolean(true))) + } + + #[test] + fn parse_false() { + assert_eq!(parser().parse("false"), Ok(Value::Boolean(false))) + } + + #[test] + fn parse_positive_integer() { + let parser = parser(); + + assert_eq!(parser.parse("0"), Ok(Value::Integer(0))); + assert_eq!(parser.parse("1"), Ok(Value::Integer(1))); + assert_eq!(parser.parse("2"), Ok(Value::Integer(2))); + assert_eq!(parser.parse("3"), Ok(Value::Integer(3))); + assert_eq!(parser.parse("4"), Ok(Value::Integer(4))); + assert_eq!(parser.parse("5"), Ok(Value::Integer(5))); + assert_eq!(parser.parse("6"), Ok(Value::Integer(6))); + assert_eq!(parser.parse("7"), Ok(Value::Integer(7))); + assert_eq!(parser.parse("8"), Ok(Value::Integer(8))); + assert_eq!(parser.parse("9"), Ok(Value::Integer(9))); + assert_eq!(parser.parse("42"), Ok(Value::Integer(42))); + assert_eq!( + parser.parse(i64::MAX.to_string()), + Ok(Value::Integer(i64::MAX)) + ); + } + + #[test] + fn parse_negative_integer() { + let parser = parser(); + + assert_eq!(parser.parse("-0"), Ok(Value::Integer(-0))); + assert_eq!(parser.parse("-1"), Ok(Value::Integer(-1))); + assert_eq!(parser.parse("-2"), Ok(Value::Integer(-2))); + assert_eq!(parser.parse("-3"), Ok(Value::Integer(-3))); + assert_eq!(parser.parse("-4"), Ok(Value::Integer(-4))); + assert_eq!(parser.parse("-5"), Ok(Value::Integer(-5))); + assert_eq!(parser.parse("-6"), Ok(Value::Integer(-6))); + assert_eq!(parser.parse("-7"), Ok(Value::Integer(-7))); + assert_eq!(parser.parse("-8"), Ok(Value::Integer(-8))); + assert_eq!(parser.parse("-9"), Ok(Value::Integer(-9))); + assert_eq!(parser.parse("-42"), Ok(Value::Integer(-42))); + assert_eq!( + parser.parse(i64::MIN.to_string()), + Ok(Value::Integer(i64::MIN)) + ); + } + + #[test] + fn double_quoted_string() { + let parser = parser(); + + assert_eq!(parser.parse("\"\""), Ok(Value::String("".to_string()))); + assert_eq!(parser.parse("\"1\""), Ok(Value::String("1".to_string()))); + assert_eq!(parser.parse("\"42\""), Ok(Value::String("42".to_string()))); + assert_eq!( + parser.parse("\"foobar\""), + Ok(Value::String("foobar".to_string())) + ); + } + + #[test] + fn single_quoted_string() { + let parser = parser(); + + assert_eq!(parser.parse("''"), Ok(Value::String("".to_string()))); + assert_eq!(parser.parse("'1'"), Ok(Value::String("1".to_string()))); + assert_eq!(parser.parse("'42'"), Ok(Value::String("42".to_string()))); + assert_eq!( + parser.parse("'foobar'"), + Ok(Value::String("foobar".to_string())) + ); + } + + #[test] + fn grave_quoted_string() { + let parser = parser(); + + assert_eq!(parser.parse("``"), Ok(Value::String("".to_string()))); + assert_eq!(parser.parse("`1`"), Ok(Value::String("1".to_string()))); + assert_eq!(parser.parse("`42`"), Ok(Value::String("42".to_string()))); + assert_eq!( + parser.parse("`foobar`"), + Ok(Value::String("foobar".to_string())) + ); } } diff --git a/src/main.rs b/src/main.rs deleted file mode 100644 index 73b34d7..0000000 --- a/src/main.rs +++ /dev/null @@ -1,407 +0,0 @@ -//! Command line interface for the dust programming language. - -use clap::{Parser, Subcommand}; -use colored::Colorize; -use crossterm::event::{KeyCode, KeyModifiers}; -use nu_ansi_term::{Color, Style}; -use reedline::{ - default_emacs_keybindings, ColumnarMenu, Completer, DefaultHinter, EditCommand, Emacs, Prompt, - Reedline, ReedlineEvent, ReedlineMenu, Signal, Span, SqliteBackedHistory, Suggestion, -}; - -use std::{borrow::Cow, fs::read_to_string, io::Write, path::PathBuf, process::Command}; - -use dust_lang::{ - built_in_values::all_built_in_values, Context, ContextMode, Error, Interpreter, Value, - ValueData, -}; - -/// Command-line arguments to be parsed. -#[derive(Parser, Debug)] -#[command(author, version, about, long_about = None)] -struct Args { - /// Dust source code to evaluate. - #[arg(short, long)] - command: Option, - - /// Command for alternate functionality besides running the source. - #[command(subcommand)] - cli_command: Option, - - /// Location of the file to run. - path: Option, -} - -#[derive(Subcommand, Debug)] -pub enum CliCommand { - /// Output a formatted version of the input. - Format, - - /// Output a concrete syntax tree of the input. - Syntax { path: String }, -} - -fn main() { - env_logger::Builder::from_env("DUST_LOG") - .format(|buffer, record| { - let args = record.args(); - let log_level = record.level().to_string().bold(); - let timestamp = buffer.timestamp_seconds().to_string().dimmed(); - - writeln!(buffer, "[{log_level} {timestamp}] {args}") - }) - .init(); - - let args = Args::parse(); - let context = Context::new(ContextMode::AllowGarbage); - - if args.path.is_none() && args.command.is_none() { - let run_shell_result = run_shell(context); - - match run_shell_result { - Ok(_) => {} - Err(error) => eprintln!("{error}"), - } - - return; - } - - let source = if let Some(path) = &args.path { - read_to_string(path).unwrap() - } else if let Some(command) = args.command { - command - } else { - String::with_capacity(0) - }; - - let mut interpreter = Interpreter::new(context); - - if let Some(CliCommand::Syntax { path }) = args.cli_command { - let source = read_to_string(path).unwrap(); - let syntax_tree_sexp = interpreter.syntax_tree(&source).unwrap(); - - println!("{syntax_tree_sexp}"); - - return; - } - - if let Some(CliCommand::Format) = args.cli_command { - let formatted = interpreter.format(&source).unwrap(); - - println!("{formatted}"); - - return; - } - - let eval_result = interpreter.run(&source); - - match eval_result { - Ok(value) => { - if !value.is_none() { - println!("{value}") - } - } - Err(error) => eprintln!("{}", error.create_report(&source)), - } -} - -// struct DustHighlighter { -// context: Context, -// } - -// impl DustHighlighter { -// fn new(context: Context) -> Self { -// Self { context } -// } -// } - -// const HIGHLIGHT_TERMINATORS: [char; 8] = [' ', ':', '(', ')', '{', '}', '[', ']']; - -// impl Highlighter for DustHighlighter { -// fn highlight(&self, line: &str, _cursor: usize) -> reedline::StyledText { -// let mut styled = StyledText::new(); - -// for word in line.split_inclusive(&HIGHLIGHT_TERMINATORS) { -// let mut word_is_highlighted = false; - -// for key in self.context.inner().unwrap().keys() { -// if key == &word { -// styled.push((Style::new().bold(), word.to_string())); -// } - -// word_is_highlighted = true; -// } - -// for built_in_value in built_in_values() { -// if built_in_value.name() == word { -// styled.push((Style::new().bold(), word.to_string())); -// } - -// word_is_highlighted = true; -// } - -// if word_is_highlighted { -// let final_char = word.chars().last().unwrap(); - -// if HIGHLIGHT_TERMINATORS.contains(&final_char) { -// let mut terminator_style = Style::new(); - -// terminator_style.foreground = Some(Color::Cyan); - -// styled.push((terminator_style, final_char.to_string())); -// } -// } else { -// styled.push((Style::new(), word.to_string())); -// } -// } - -// styled -// } -// } - -struct StarshipPrompt { - left: String, - right: String, -} - -impl StarshipPrompt { - fn new() -> Self { - Self { - left: String::new(), - right: String::new(), - } - } - - fn reload(&mut self) { - let run_starship_left = Command::new("starship").arg("prompt").output(); - let run_starship_right = Command::new("starship") - .args(["prompt", "--right"]) - .output(); - let left_prompt = if let Ok(output) = &run_starship_left { - String::from_utf8_lossy(&output.stdout).trim().to_string() - } else { - ">".to_string() - }; - let right_prompt = if let Ok(output) = &run_starship_right { - String::from_utf8_lossy(&output.stdout).trim().to_string() - } else { - "".to_string() - }; - - self.left = left_prompt; - self.right = right_prompt; - } -} - -impl Prompt for StarshipPrompt { - fn render_prompt_left(&self) -> Cow { - Cow::Borrowed(&self.left) - } - - fn render_prompt_right(&self) -> Cow { - Cow::Borrowed(&self.right) - } - - fn render_prompt_indicator(&self, _prompt_mode: reedline::PromptEditMode) -> Cow { - Cow::Borrowed(" ") - } - - fn render_prompt_multiline_indicator(&self) -> Cow { - Cow::Borrowed("") - } - - fn render_prompt_history_search_indicator( - &self, - _history_search: reedline::PromptHistorySearch, - ) -> Cow { - Cow::Borrowed("") - } -} - -pub struct DustCompleter { - context: Context, -} - -impl DustCompleter { - fn new(context: Context) -> Self { - DustCompleter { context } - } -} - -impl Completer for DustCompleter { - fn complete(&mut self, line: &str, pos: usize) -> Vec { - let mut suggestions = Vec::new(); - let last_word = if let Some(word) = line.rsplit([' ', ':']).next() { - word - } else { - line - }; - - if let Ok(path) = PathBuf::try_from(last_word) { - if let Ok(read_dir) = path.read_dir() { - for entry in read_dir { - if let Ok(entry) = entry { - let description = if let Ok(file_type) = entry.file_type() { - if file_type.is_dir() { - "directory" - } else if file_type.is_file() { - "file" - } else if file_type.is_symlink() { - "symlink" - } else { - "unknown" - } - } else { - "unknown" - }; - - suggestions.push(Suggestion { - value: entry.path().to_string_lossy().to_string(), - description: Some(description.to_string()), - extra: None, - span: Span::new(pos - last_word.len(), pos), - append_whitespace: false, - }); - } - } - } - } - - for built_in_value in all_built_in_values() { - let name = built_in_value.name(); - let description = built_in_value.description(); - - if built_in_value.name().contains(last_word) { - suggestions.push(Suggestion { - value: name.to_string(), - description: Some(description.to_string()), - extra: None, - span: Span::new(pos - last_word.len(), pos), - append_whitespace: false, - }); - } - - if let Value::Map(map) = built_in_value.get() { - for (key, value) in map.inner() { - if key.contains(last_word) { - suggestions.push(Suggestion { - value: format!("{name}:{key}"), - description: Some(value.to_string()), - extra: None, - span: Span::new(pos - last_word.len(), pos), - append_whitespace: false, - }); - } - } - } - } - - for (key, (value_data, _counter)) in self.context.inner().unwrap().iter() { - let value = match value_data { - ValueData::Value(value) => value, - ValueData::TypeHint(_) => continue, - ValueData::TypeDefinition(_) => continue, - }; - - if key.contains(last_word) { - suggestions.push(Suggestion { - value: key.to_string(), - description: Some(value.to_string()), - extra: None, - span: Span::new(pos - last_word.len(), pos), - append_whitespace: false, - }); - } - } - - suggestions - } -} - -fn run_shell(context: Context) -> Result<(), Error> { - let mut interpreter = Interpreter::new(context.clone()); - let mut keybindings = default_emacs_keybindings(); - - keybindings.add_binding( - KeyModifiers::CONTROL, - KeyCode::Char(' '), - ReedlineEvent::Edit(vec![EditCommand::InsertNewline]), - ); - keybindings.add_binding( - KeyModifiers::NONE, - KeyCode::Enter, - ReedlineEvent::SubmitOrNewline, - ); - keybindings.add_binding( - KeyModifiers::NONE, - KeyCode::Tab, - ReedlineEvent::Edit(vec![EditCommand::InsertString(" ".to_string())]), - ); - keybindings.add_binding( - KeyModifiers::NONE, - KeyCode::Tab, - ReedlineEvent::Multiple(vec![ - ReedlineEvent::Menu("context menu".to_string()), - ReedlineEvent::MenuNext, - ]), - ); - - let edit_mode = Box::new(Emacs::new(keybindings)); - let history = Box::new( - SqliteBackedHistory::with_file(PathBuf::from("target/history"), None, None) - .expect("Error loading history."), - ); - let hinter = Box::new(DefaultHinter::default().with_style(Style::new().dimmed())); - let completer = DustCompleter::new(context.clone()); - - let mut line_editor = Reedline::create() - .with_edit_mode(edit_mode) - .with_history(history) - .with_hinter(hinter) - .use_kitty_keyboard_enhancement(true) - .with_completer(Box::new(completer)) - .with_menu(ReedlineMenu::EngineCompleter(Box::new( - ColumnarMenu::default() - .with_name("context menu") - .with_text_style(Style::new().fg(Color::White)) - .with_columns(1) - .with_column_padding(10), - ))); - let mut prompt = StarshipPrompt::new(); - - prompt.reload(); - - loop { - let sig = line_editor.read_line(&prompt); - - match sig { - Ok(Signal::Success(buffer)) => { - if buffer.trim().is_empty() { - continue; - } - - let run_result = interpreter.run(&buffer); - - match run_result { - Ok(value) => { - if !value.is_none() { - println!("{value}") - } - } - Err(error) => println!("{error}"), - } - - prompt.reload(); - } - Ok(Signal::CtrlD) | Ok(Signal::CtrlC) => { - println!("\nLeaving the Dust shell."); - break; - } - x => { - println!("Unknown event: {:?}", x); - } - } - } - - Ok(()) -} diff --git a/src/value/enum_instance.rs b/src/value/enum_instance.rs deleted file mode 100644 index 35ec5db..0000000 --- a/src/value/enum_instance.rs +++ /dev/null @@ -1,40 +0,0 @@ -use std::fmt::{self, Display, Formatter}; - -use serde::{Deserialize, Serialize}; - -use crate::{Identifier, Value}; - -#[derive(Debug, Clone, Eq, PartialEq, PartialOrd, Ord, Serialize, Deserialize)] -pub struct EnumInstance { - name: Identifier, - variant: Identifier, - value: Option>, -} - -impl EnumInstance { - pub fn new(name: Identifier, variant_name: Identifier, value: Option) -> Self { - Self { - name, - variant: variant_name, - value: value.map(|value| Box::new(value)), - } - } - - pub fn name(&self) -> &Identifier { - &self.name - } - - pub fn variant(&self) -> &Identifier { - &self.variant - } - - pub fn value(&self) -> &Option> { - &self.value - } -} - -impl Display for EnumInstance { - fn fmt(&self, f: &mut Formatter) -> fmt::Result { - write!(f, "{}::{}({:?})", self.name, self.variant, self.value) - } -} diff --git a/src/value/function.rs b/src/value/function.rs deleted file mode 100644 index 37d5bc2..0000000 --- a/src/value/function.rs +++ /dev/null @@ -1,50 +0,0 @@ -use std::fmt::{self, Display, Formatter}; - -use serde::{Deserialize, Serialize}; - -use crate::{ - built_in_functions::Callable, BuiltInFunction, Format, FunctionNode, Identifier, Type, -}; - -#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)] -pub enum Function { - BuiltIn(BuiltInFunction), - ContextDefined(FunctionNode), -} - -impl Function { - pub fn r#type(&self) -> Type { - match self { - Function::BuiltIn(built_in_function) => built_in_function.r#type(), - Function::ContextDefined(context_defined_function) => { - context_defined_function.r#type().clone() - } - } - } - - pub fn parameters(&self) -> Option<&Vec> { - if let Function::ContextDefined(function) = self { - Some(function.parameters()) - } else { - None - } - } -} - -impl Format for Function { - fn format(&self, output: &mut String, indent_level: u8) { - match self { - Function::BuiltIn(built_in_function) => built_in_function.format(output, indent_level), - Function::ContextDefined(function_node) => function_node.format(output, indent_level), - } - } -} - -impl Display for Function { - fn fmt(&self, f: &mut Formatter) -> fmt::Result { - match self { - Function::BuiltIn(built_in_function) => write!(f, "{built_in_function}"), - Function::ContextDefined(function_node) => write!(f, "{function_node}"), - } - } -} diff --git a/src/value/list.rs b/src/value/list.rs deleted file mode 100644 index f1b9ff6..0000000 --- a/src/value/list.rs +++ /dev/null @@ -1,119 +0,0 @@ -use std::{ - cmp::Ordering, - fmt::{self, Display, Formatter}, - sync::{Arc, RwLock, RwLockReadGuard, RwLockWriteGuard}, -}; - -use stanza::{ - renderer::{console::Console, Renderer}, - style::Styles, - table::{Cell, Content, Row, Table}, -}; - -use crate::{error::rw_lock_error::RwLockError, Value}; - -#[derive(Debug, Clone)] -pub struct List(Arc>>); - -impl Default for List { - fn default() -> Self { - Self::new() - } -} - -impl List { - pub fn new() -> Self { - List(Arc::new(RwLock::new(Vec::new()))) - } - - pub fn with_capacity(capacity: usize) -> Self { - List(Arc::new(RwLock::new(Vec::with_capacity(capacity)))) - } - - pub fn with_items(items: Vec) -> Self { - List(Arc::new(RwLock::new(items))) - } - - pub fn items(&self) -> Result>, RwLockError> { - Ok(self.0.read()?) - } - - pub fn items_mut(&self) -> Result>, RwLockError> { - Ok(self.0.write()?) - } - - pub fn as_text_table(&self) -> Table { - let cells: Vec = self - .items() - .unwrap() - .iter() - .map(|value| { - if let Value::List(list) = value { - Cell::new(Styles::default(), Content::Nested(list.as_text_table())) - } else if let Value::Map(map) = value { - Cell::new(Styles::default(), Content::Nested(map.as_text_table())) - } else { - Cell::new(Styles::default(), Content::Label(value.to_string())) - } - }) - .collect(); - - let row = if cells.is_empty() { - Row::new( - Styles::default(), - vec![Cell::new( - Styles::default(), - Content::Label("empty list".to_string()), - )], - ) - } else { - Row::new(Styles::default(), cells) - }; - - Table::default().with_row(row) - } -} - -impl Display for List { - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { - let renderer = Console::default(); - - f.write_str(&renderer.render(&self.as_text_table())) - } -} - -impl Eq for List {} - -impl PartialEq for List { - fn eq(&self, other: &Self) -> bool { - if let (Ok(left), Ok(right)) = (self.items(), other.items()) { - if left.len() != right.len() { - return false; - } else { - for (i, j) in left.iter().zip(right.iter()) { - if i != j { - return false; - } - } - } - } - - true - } -} - -impl PartialOrd for List { - fn partial_cmp(&self, other: &Self) -> Option { - Some(self.cmp(other)) - } -} - -impl Ord for List { - fn cmp(&self, other: &Self) -> Ordering { - if let (Ok(left), Ok(right)) = (self.items(), other.items()) { - left.cmp(&right) - } else { - Ordering::Equal - } - } -} diff --git a/src/value/map.rs b/src/value/map.rs deleted file mode 100644 index 95eb727..0000000 --- a/src/value/map.rs +++ /dev/null @@ -1,90 +0,0 @@ -use serde::{Deserialize, Serialize}; -use stanza::{ - renderer::{console::Console, Renderer}, - style::{HAlign, Styles}, - table::{Row, Table}, -}; -use std::{ - collections::BTreeMap, - fmt::{self, Display, Formatter}, -}; - -use crate::{Identifier, Value}; - -/// A collection dust variables comprised of key-value pairs. -/// -/// The inner value is a BTreeMap in order to allow VariableMap instances to be sorted and compared -/// to one another. -#[derive(Clone, Debug, Serialize, Deserialize, Eq, PartialEq, PartialOrd, Ord)] -pub struct Map { - inner: BTreeMap, -} - -impl Map { - /// Creates a new instace. - pub fn new() -> Self { - Map { - inner: BTreeMap::new(), - } - } - - pub fn with_values(variables: BTreeMap) -> Self { - Map { inner: variables } - } - - pub fn inner(&self) -> &BTreeMap { - &self.inner - } - - pub fn get(&self, key: &Identifier) -> Option<&Value> { - self.inner.get(key) - } - - pub fn set(&mut self, key: Identifier, value: Value) { - self.inner.insert(key, value); - } - - pub fn as_text_table(&self) -> Table { - let mut table = Table::with_styles(Styles::default().with(HAlign::Centred)); - - for (key, value) in &self.inner { - if let Value::Map(map) = value { - table.push_row(Row::new( - Styles::default(), - vec![ - key.into(), - map.as_text_table().into(), - "".to_string().into(), - ], - )); - } else if let Value::List(list) = value { - table.push_row(Row::new( - Styles::default(), - vec![key.into(), list.as_text_table().into()], - )); - } else { - table.push_row([key.to_string(), value.to_string()]); - }; - } - - if table.is_empty() { - table.push_row(vec!["", "empty map", ""]) - } - - table - } -} - -impl Default for Map { - fn default() -> Self { - Self::new() - } -} - -impl Display for Map { - fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result { - let renderer = Console::default(); - - f.write_str(&renderer.render(&self.as_text_table())) - } -} diff --git a/src/value/mod.rs b/src/value/mod.rs deleted file mode 100644 index 42df205..0000000 --- a/src/value/mod.rs +++ /dev/null @@ -1,885 +0,0 @@ -//! Types that represent runtime values. -use crate::{ - built_in_values::BuiltInValue, - error::{rw_lock_error::RwLockError, RuntimeError, ValidationError}, - Identifier, SourcePosition, Type, -}; - -use serde::{ - de::{MapAccess, SeqAccess, Visitor}, - ser::{SerializeMap, SerializeTuple}, - Deserialize, Serialize, Serializer, -}; - -use std::{ - cmp::Ordering, - collections::BTreeMap, - convert::TryFrom, - fmt::{self, Display, Formatter}, - marker::PhantomData, - ops::RangeInclusive, - sync::{Arc, RwLock, RwLockReadGuard}, -}; - -pub use self::{ - enum_instance::EnumInstance, function::Function, list::List, map::Map, - struct_instance::StructInstance, -}; - -pub mod enum_instance; -pub mod function; -pub mod list; -pub mod map; -pub mod struct_instance; - -/// Dust value representation. -/// -/// Every dust variable has a key and a Value. Variables are represented by -/// storing them in a VariableMap. This means the map of variables is itself a -/// value that can be treated as any other. -#[derive(Debug)] -pub enum Value { - Boolean(bool), - Enum(EnumInstance), - Float(f64), - Function(Function), - Integer(i64), - List(List), - Map(Map), - Range(RangeInclusive), - String(Arc>), - Struct(StructInstance), -} - -impl Value { - pub fn none() -> Self { - BuiltInValue::None.get().clone() - } - - pub fn some(value: Value) -> Value { - Value::Enum(EnumInstance::new( - Identifier::new("Option"), - Identifier::new("Some"), - Some(value), - )) - } - - pub fn string>(string: T) -> Self { - Value::String(Arc::new(RwLock::new(string.into()))) - } - - pub fn range(start: i64, end: i64) -> Self { - Value::Range(start..=end) - } - - pub fn r#type(&self) -> Result { - let r#type = match self { - Value::List(list) => { - let mut item_types = Vec::new(); - - for value in list.items()?.iter() { - let r#type = value.r#type()?; - - item_types.push(r#type); - } - - Type::ListExact(item_types) - } - Value::Map(map) => { - if map.inner().is_empty() { - Type::Map(None) - } else { - let mut type_map = BTreeMap::new(); - - for (identifier, value) in map.inner() { - type_map.insert(identifier.clone(), value.r#type()?); - } - - Type::Map(Some(type_map)) - } - } - Value::Function(function) => function.r#type().clone(), - Value::String(_) => Type::String, - Value::Float(_) => Type::Float, - Value::Integer(_) => Type::Integer, - Value::Boolean(_) => Type::Boolean, - Value::Range(_) => todo!(), - Value::Struct(_) => todo!(), - Value::Enum(enum_instance) => { - let arguments = if let Some(value) = enum_instance.value() { - vec![value.r#type()?] - } else { - Vec::with_capacity(0) - }; - - Type::Custom { - name: enum_instance.name().clone(), - arguments, - } - } - }; - - Ok(r#type) - } - - pub fn is_string(&self) -> bool { - matches!(self, Value::String(_)) - } - - pub fn is_integer(&self) -> bool { - matches!(self, Value::Integer(_)) - } - - pub fn is_float(&self) -> bool { - matches!(self, Value::Float(_)) - } - - pub fn is_number(&self) -> bool { - matches!(self, Value::Integer(_) | Value::Float(_)) - } - - pub fn is_boolean(&self) -> bool { - matches!(self, Value::Boolean(_)) - } - - pub fn is_list(&self) -> bool { - matches!(self, Value::List(_)) - } - - pub fn is_map(&self) -> bool { - matches!(self, Value::Map(_)) - } - - pub fn is_function(&self) -> bool { - matches!(self, Value::Function(_)) - } - - pub fn is_none(&self) -> bool { - self == &Value::none() - } - - /// Borrows the value stored in `self` as `&str`, or returns `Err` if - /// `self` is not a `Value::String`. - pub fn as_string(&self) -> Result, ValidationError> { - match self { - Value::String(string) => Ok(string.read()?), - value => Err(ValidationError::ExpectedString { - actual: value.clone(), - }), - } - } - - /// Copies the value stored in `self` as `i64`, or returns `Err` if `self` - /// is not a `Value::Int` - pub fn as_integer(&self) -> Result { - match self { - Value::Integer(i) => Ok(*i), - value => Err(ValidationError::ExpectedInteger { - actual: value.clone(), - }), - } - } - - /// Copies the value stored in `self` as `f64`, or returns `Err` if `self` - /// is not a `Primitive::Float`. - pub fn as_float(&self) -> Result { - match self { - Value::Float(f) => Ok(*f), - value => Err(ValidationError::ExpectedFloat { - actual: value.clone(), - }), - } - } - - /// Copies the value stored in `self` as `f64`, or returns `Err` if `self` - /// is not a `Primitive::Float` or `Value::Int`. - /// - /// Note that this method silently converts `i64` to `f64`, if `self` is - /// a `Value::Int`. - pub fn as_number(&self) -> Result { - match self { - Value::Float(f) => Ok(*f), - Value::Integer(i) => Ok(*i as f64), - value => Err(ValidationError::ExpectedNumber { - actual: value.clone(), - }), - } - } - - /// Copies the value stored in `self` as `bool`, or returns `Err` if `self` - /// is not a `Primitive::Boolean`. - pub fn as_boolean(&self) -> Result { - match self { - Value::Boolean(boolean) => Ok(*boolean), - value => Err(ValidationError::ExpectedBoolean { - actual: value.clone(), - }), - } - } - - /// Borrows the value stored in `self` as `Vec`, or returns `Err` if - /// `self` is not a `Value::List`. - pub fn as_list(&self) -> Result<&List, ValidationError> { - match self { - Value::List(list) => Ok(list), - value => Err(ValidationError::ExpectedList { - actual: value.clone(), - }), - } - } - - /// Takes ownership of the value stored in `self` as `Vec`, or - /// returns `Err` if `self` is not a `Value::List`. - pub fn into_inner_list(self) -> Result { - match self { - Value::List(list) => Ok(list), - value => Err(ValidationError::ExpectedList { - actual: value.clone(), - }), - } - } - - /// Borrows the value stored in `self` as `Vec`, or returns `Err` if - /// `self` is not a `Value::Map`. - pub fn as_map(&self) -> Result<&Map, ValidationError> { - match self { - Value::Map(map) => Ok(map), - value => Err(ValidationError::ExpectedMap { - actual: value.clone(), - }), - } - } - - /// Borrows the value stored in `self` as `Function`, or returns `Err` if - /// `self` is not a `Value::Function`. - pub fn as_function(&self) -> Result<&Function, ValidationError> { - match self { - Value::Function(function) => Ok(function), - value => Err(ValidationError::ExpectedFunction { - actual: value.clone(), - }), - } - } - - /// Return the sum of `self` and `other`. - pub fn add(self, other: Self, position: SourcePosition) -> Result { - match (self, other) { - (Value::Float(left), Value::Float(right)) => Ok(Value::Float(left + right)), - (Value::Float(left), Value::Integer(right)) => Ok(Value::Float(left + right as f64)), - (Value::Integer(left), Value::Float(right)) => Ok(Value::Float((left as f64) + right)), - (Value::Integer(left), Value::Integer(right)) => { - Ok(Value::Integer(left.saturating_add(right))) - } - (Value::List(list), value) | (value, Value::List(list)) => { - list.items_mut()?.push(value); - - Ok(Value::List(list)) - } - (Value::String(left), Value::String(right)) => { - let left = left.read()?.to_string(); - let right = right.read()?; - - Ok(Value::string(left + right.as_str())) - } - (left, right) => Err(ValidationError::CannotAdd { - left, - right, - position, - }), - } - } - - /// Return the difference of `self` and `other`. - pub fn subtract(self, other: Self, position: SourcePosition) -> Result { - match (self, other) { - (Value::Float(left), Value::Float(right)) => Ok(Value::Float(left - right)), - (Value::Float(left), Value::Integer(right)) => Ok(Value::Float(left - right as f64)), - (Value::Integer(left), Value::Float(right)) => Ok(Value::Float(left as f64 - right)), - (Value::Integer(left), Value::Integer(right)) => { - Ok(Value::Integer(left.saturating_sub(right))) - } - (left, right) => Err(ValidationError::CannotSubtract { - left, - right, - position, - }), - } - } - - /// Return the product of `self` and `other`. - pub fn multiply(self, other: Self, position: SourcePosition) -> Result { - match (self, other) { - (Value::Float(left), Value::Float(right)) => Ok(Value::Float(left * right)), - (Value::Float(left), Value::Integer(right)) => Ok(Value::Float(left * right as f64)), - (Value::Integer(left), Value::Float(right)) => Ok(Value::Float(left as f64 * right)), - (Value::Integer(left), Value::Integer(right)) => Ok(Value::Integer(left * right)), - (left, right) => Err(ValidationError::CannotMultiply { - left, - right, - position, - }), - } - } - - /// Return the quotient of `self` and `other`. - pub fn divide(self, other: Self, position: SourcePosition) -> Result { - match (self, other) { - (Value::Float(left), Value::Float(right)) => Ok(Value::Float(left / right)), - (Value::Float(left), Value::Integer(right)) => Ok(Value::Float(left / right as f64)), - (Value::Integer(left), Value::Float(right)) => Ok(Value::Float(left as f64 / right)), - (Value::Integer(left), Value::Integer(right)) => Ok(Value::Integer(left / right)), - (left, right) => Err(ValidationError::CannotDivide { - left, - right, - position, - }), - } - } - - /// Return the remainder after diving `self` and `other`. - pub fn modulo(self, other: Self, position: SourcePosition) -> Result { - match (self, other) { - (Value::Float(left), Value::Float(right)) => Ok(Value::Float(left % right)), - (Value::Float(left), Value::Integer(right)) => Ok(Value::Float(left % right as f64)), - (Value::Integer(left), Value::Float(right)) => Ok(Value::Float(left as f64 % right)), - (Value::Integer(left), Value::Integer(right)) => Ok(Value::Integer(left % right)), - (left, right) => Err(ValidationError::CannotDivide { - left, - right, - position, - }), - } - } -} - -impl Default for Value { - fn default() -> Self { - Value::none() - } -} - -impl Eq for Value {} - -impl PartialEq for Value { - fn eq(&self, other: &Self) -> bool { - match (self, other) { - (Value::Integer(left), Value::Integer(right)) => left == right, - (Value::Float(left), Value::Float(right)) => left == right, - (Value::Boolean(left), Value::Boolean(right)) => left == right, - (Value::String(left), Value::String(right)) => { - if let (Ok(left), Ok(right)) = (left.read(), right.read()) { - left.as_str() == right.as_str() - } else { - false - } - } - (Value::List(left), Value::List(right)) => left == right, - (Value::Map(left), Value::Map(right)) => left == right, - (Value::Function(left), Value::Function(right)) => left == right, - (Value::Range(left), Value::Range(right)) => left == right, - (Value::Struct(left), Value::Struct(right)) => left == right, - (Value::Enum(left), Value::Enum(right)) => left == right, - _ => false, - } - } -} - -impl PartialOrd for Value { - fn partial_cmp(&self, other: &Self) -> Option { - Some(self.cmp(other)) - } -} - -impl Ord for Value { - fn cmp(&self, other: &Self) -> Ordering { - match (self, other) { - (Value::String(left), Value::String(right)) => { - if let (Ok(left), Ok(right)) = (left.read(), right.read()) { - left.cmp(&right) - } else { - Ordering::Equal - } - } - (Value::String(_), _) => Ordering::Greater, - (Value::Float(left), Value::Float(right)) => left.total_cmp(right), - (Value::Integer(left), Value::Integer(right)) => left.cmp(right), - (Value::Float(float), Value::Integer(integer)) => { - let int_as_float = *integer as f64; - float.total_cmp(&int_as_float) - } - (Value::Integer(integer), Value::Float(float)) => { - let int_as_float = *integer as f64; - int_as_float.total_cmp(float) - } - (Value::Float(_), _) => Ordering::Greater, - (Value::Integer(_), _) => Ordering::Greater, - (Value::Boolean(left), Value::Boolean(right)) => left.cmp(right), - (Value::Boolean(_), _) => Ordering::Greater, - (Value::List(left), Value::List(right)) => left.cmp(right), - (Value::List(_), _) => Ordering::Greater, - (Value::Map(left), Value::Map(right)) => left.cmp(right), - (Value::Map(_), _) => Ordering::Greater, - (Value::Function(left), Value::Function(right)) => left.cmp(right), - (Value::Function(_), _) => Ordering::Greater, - (Value::Struct(left), Value::Struct(right)) => left.cmp(right), - (Value::Struct(_), _) => Ordering::Greater, - (Value::Enum(left), Value::Enum(right)) => left.cmp(right), - (Value::Enum(_), _) => Ordering::Greater, - (Value::Range(left), Value::Range(right)) => { - let left_len = left.end() - left.start(); - let right_len = right.end() - right.start(); - - left_len.cmp(&right_len) - } - (Value::Range(_), _) => Ordering::Less, - } - } -} - -impl Serialize for Value { - fn serialize(&self, serializer: S) -> std::result::Result - where - S: Serializer, - { - match self { - Value::String(inner) => { - let inner = inner - .read() - .map_err(|_| serde::ser::Error::custom("failed to get read lock on string"))?; - - serializer.serialize_str(inner.as_str()) - } - Value::Float(inner) => serializer.serialize_f64(*inner), - Value::Integer(inner) => serializer.serialize_i64(*inner), - Value::Boolean(inner) => serializer.serialize_bool(*inner), - Value::List(inner) => { - let items = if let Ok(items) = inner.items() { - items - } else { - return Err(serde::ser::Error::custom("failed to obtain a read lock")); - }; - - let mut list = serializer.serialize_tuple(items.len())?; - - for value in items.iter() { - list.serialize_element(value)?; - } - - list.end() - } - Value::Map(map) => { - let entries = map.inner(); - let mut map = serializer.serialize_map(Some(entries.len()))?; - - for (key, value) in entries.iter() { - map.serialize_entry(key, value)?; - } - - map.end() - } - Value::Function(inner) => inner.serialize(serializer), - Value::Struct(inner) => inner.serialize(serializer), - Value::Range(range) => range.serialize(serializer), - Value::Enum(_) => todo!(), - } - } -} - -impl Clone for Value { - fn clone(&self) -> Self { - log::trace!("Cloning value {self}"); - - match self { - Value::Boolean(boolean) => Value::Boolean(*boolean), - Value::Enum(r#enum) => Value::Enum(r#enum.clone()), - Value::Float(float) => Value::Float(*float), - Value::Function(function) => Value::Function(function.clone()), - Value::Integer(integer) => Value::Integer(*integer), - Value::List(list) => Value::List(list.clone()), - Value::Map(map) => Value::Map(map.clone()), - Value::Range(range) => Value::Range(range.clone()), - Value::String(string) => Value::String(string.clone()), - Value::Struct(r#struct) => Value::Struct(r#struct.clone()), - } - } -} - -impl Display for Value { - fn fmt(&self, f: &mut Formatter) -> fmt::Result { - match self { - Value::String(string) => { - let string = string.read().map_err(|_| fmt::Error)?; - - write!(f, "{}", string.as_str()) - } - Value::Float(float) => write!(f, "{float}"), - Value::Integer(int) => write!(f, "{int}"), - Value::Boolean(boolean) => write!(f, "{boolean}"), - Value::List(list) => write!(f, "{list}"), - Value::Map(map) => write!(f, "{map}"), - Value::Function(function) => write!(f, "{function}"), - Value::Struct(structure) => write!(f, "{structure}"), - Value::Range(range) => write!(f, "{}..{}", range.start(), range.end()), - Value::Enum(enum_instance) => write!(f, "{enum_instance}"), - } - } -} - -impl From for Value { - fn from(string: String) -> Self { - Value::string(string) - } -} - -impl From<&str> for Value { - fn from(string: &str) -> Self { - Value::string(string.to_string()) - } -} - -impl From for Value { - fn from(float: f64) -> Self { - Value::Float(float) - } -} - -impl From for Value { - fn from(int: i64) -> Self { - Value::Integer(int) - } -} - -impl From for Value { - fn from(boolean: bool) -> Self { - Value::Boolean(boolean) - } -} - -impl From> for Value { - fn from(vec: Vec) -> Self { - Value::List(List::with_items(vec)) - } -} - -impl From for Result { - fn from(value: Value) -> Self { - Ok(value) - } -} - -impl From<()> for Value { - fn from(_: ()) -> Self { - Value::none() - } -} - -impl TryFrom for String { - type Error = RuntimeError; - - fn try_from(value: Value) -> std::result::Result { - if let Value::String(string) = value { - Ok(string.read()?.clone()) - } else { - Err(RuntimeError::ValidationFailure( - ValidationError::ExpectedString { actual: value }, - )) - } - } -} - -impl TryFrom for f64 { - type Error = RuntimeError; - - fn try_from(value: Value) -> std::result::Result { - if let Value::Float(value) = value { - Ok(value) - } else { - Err(RuntimeError::ValidationFailure( - ValidationError::ExpectedFloat { actual: value }, - )) - } - } -} - -impl TryFrom for i64 { - type Error = RuntimeError; - - fn try_from(value: Value) -> std::result::Result { - if let Value::Integer(value) = value { - Ok(value) - } else { - Err(RuntimeError::ValidationFailure( - ValidationError::ExpectedInteger { actual: value }, - )) - } - } -} - -impl TryFrom for bool { - type Error = RuntimeError; - - fn try_from(value: Value) -> std::result::Result { - if let Value::Boolean(value) = value { - Ok(value) - } else { - Err(RuntimeError::ValidationFailure( - ValidationError::ExpectedBoolean { actual: value }, - )) - } - } -} - -struct ValueVisitor { - marker: PhantomData Value>, -} - -impl ValueVisitor { - fn new() -> Self { - ValueVisitor { - marker: PhantomData, - } - } -} - -impl<'de> Visitor<'de> for ValueVisitor { - type Value = Value; - - fn expecting(&self, formatter: &mut Formatter) -> fmt::Result { - formatter.write_str("Dust-compatible data format.") - } - - fn visit_bool(self, v: bool) -> std::result::Result - where - E: serde::de::Error, - { - Ok(Value::Boolean(v)) - } - - fn visit_i8(self, v: i8) -> std::result::Result - where - E: serde::de::Error, - { - self.visit_i64(v as i64) - } - - fn visit_i16(self, v: i16) -> std::result::Result - where - E: serde::de::Error, - { - self.visit_i64(v as i64) - } - - fn visit_i32(self, v: i32) -> std::result::Result - where - E: serde::de::Error, - { - self.visit_i64(v as i64) - } - - fn visit_i64(self, v: i64) -> std::result::Result - where - E: serde::de::Error, - { - Ok(Value::Integer(v)) - } - - fn visit_i128(self, v: i128) -> std::result::Result - where - E: serde::de::Error, - { - if v > i64::MAX as i128 { - Ok(Value::Integer(i64::MAX)) - } else { - Ok(Value::Integer(v as i64)) - } - } - - fn visit_u8(self, v: u8) -> std::result::Result - where - E: serde::de::Error, - { - self.visit_u64(v as u64) - } - - fn visit_u16(self, v: u16) -> std::result::Result - where - E: serde::de::Error, - { - self.visit_u64(v as u64) - } - - fn visit_u32(self, v: u32) -> std::result::Result - where - E: serde::de::Error, - { - self.visit_u64(v as u64) - } - - fn visit_u64(self, v: u64) -> std::result::Result - where - E: serde::de::Error, - { - self.visit_i64(v as i64) - } - - fn visit_u128(self, v: u128) -> std::result::Result - where - E: serde::de::Error, - { - self.visit_i128(v as i128) - } - - fn visit_f32(self, v: f32) -> std::result::Result - where - E: serde::de::Error, - { - self.visit_f64(v as f64) - } - - fn visit_f64(self, v: f64) -> std::result::Result - where - E: serde::de::Error, - { - Ok(Value::Float(v)) - } - - fn visit_char(self, v: char) -> std::result::Result - where - E: serde::de::Error, - { - self.visit_str(&v.to_string()) - } - - fn visit_str(self, v: &str) -> std::result::Result - where - E: serde::de::Error, - { - Ok(Value::string(v.to_string())) - } - - fn visit_borrowed_str(self, v: &'de str) -> std::result::Result - where - E: serde::de::Error, - { - self.visit_str(v) - } - - fn visit_string(self, v: String) -> std::result::Result - where - E: serde::de::Error, - { - Ok(Value::string(v)) - } - - fn visit_bytes(self, v: &[u8]) -> std::result::Result - where - E: serde::de::Error, - { - let _ = v; - Err(serde::de::Error::invalid_type( - serde::de::Unexpected::Bytes(v), - &self, - )) - } - - fn visit_borrowed_bytes(self, v: &'de [u8]) -> std::result::Result - where - E: serde::de::Error, - { - self.visit_bytes(v) - } - - fn visit_byte_buf(self, v: Vec) -> std::result::Result - where - E: serde::de::Error, - { - self.visit_bytes(&v) - } - - fn visit_none(self) -> std::result::Result - where - E: serde::de::Error, - { - Ok(Value::none()) - } - - fn visit_some(self, deserializer: D) -> std::result::Result - where - D: serde::Deserializer<'de>, - { - Ok(Value::Enum(EnumInstance::deserialize(deserializer)?)) - } - - fn visit_unit(self) -> std::result::Result - where - E: serde::de::Error, - { - Ok(Value::none()) - } - - fn visit_newtype_struct(self, deserializer: D) -> std::result::Result - where - D: serde::Deserializer<'de>, - { - let _ = deserializer; - Err(serde::de::Error::invalid_type( - serde::de::Unexpected::NewtypeStruct, - &self, - )) - } - - fn visit_seq(self, mut access: A) -> std::result::Result - where - A: SeqAccess<'de>, - { - let mut list = Vec::new(); - - while let Some(value) = access.next_element()? { - list.push(value); - } - - Ok(Value::List(List::with_items(list))) - } - - fn visit_map(self, mut access: M) -> std::result::Result - where - M: MapAccess<'de>, - { - let mut map = Map::new(); - - while let Some((key, value)) = access.next_entry::()? { - let identifier = Identifier::new(&key); - - map.set(identifier, value); - } - - Ok(Value::Map(map)) - } - - fn visit_enum(self, data: A) -> std::result::Result - where - A: serde::de::EnumAccess<'de>, - { - let _ = data; - Err(serde::de::Error::invalid_type( - serde::de::Unexpected::Enum, - &self, - )) - } - - fn __private_visit_untagged_option(self, _: D) -> std::result::Result - where - D: serde::Deserializer<'de>, - { - Err(()) - } -} - -impl<'de> Deserialize<'de> for Value { - fn deserialize(deserializer: D) -> std::result::Result - where - D: serde::Deserializer<'de>, - { - deserializer.deserialize_any(ValueVisitor::new()) - } -} diff --git a/src/value/struct_instance.rs b/src/value/struct_instance.rs deleted file mode 100644 index 24239a0..0000000 --- a/src/value/struct_instance.rs +++ /dev/null @@ -1,45 +0,0 @@ -use std::fmt::{self, Display, Formatter}; - -use serde::{ser::SerializeMap, Serialize, Serializer}; - -use crate::{Identifier, Map}; - -#[derive(Clone, Debug, Eq, PartialEq, PartialOrd, Ord)] -pub struct StructInstance { - name: Identifier, - map: Map, -} - -impl StructInstance { - pub fn new(name: Identifier, map: Map) -> Self { - StructInstance { name, map } - } -} - -impl Display for StructInstance { - fn fmt(&self, f: &mut Formatter) -> fmt::Result { - writeln!(f, "{{")?; - - for (key, value) in self.map.inner() { - writeln!(f, " {key} <{}> = {value}", value.r#type().unwrap())?; - } - - write!(f, "}}") - } -} - -impl Serialize for StructInstance { - fn serialize(&self, serializer: S) -> Result - where - S: Serializer, - { - let map = self.map.inner(); - let mut serde_map = serializer.serialize_map(Some(map.len()))?; - - for (key, value) in map.iter() { - serde_map.serialize_entry(key, value)?; - } - - serde_map.end() - } -} diff --git a/tests/as.rs b/tests/as.rs deleted file mode 100644 index 354ca2d..0000000 --- a/tests/as.rs +++ /dev/null @@ -1,53 +0,0 @@ -use dust_lang::{ - error::{RuntimeError, ValidationError}, - *, -}; - -#[test] -fn string_as_string_list() { - assert_eq!( - interpret("'foobar' as [str]"), - Ok(Value::List(List::with_items(vec![ - Value::string("f"), - Value::string("o"), - Value::string("o"), - Value::string("b"), - Value::string("a"), - Value::string("r"), - ]))) - ) -} - -#[test] -fn string_as_list_error() { - assert_eq!( - interpret("'foobar' as [float]"), - Err(Error::Validation(ValidationError::ConversionImpossible { - initial_type: Type::String, - target_type: Type::ListOf(Box::new(Type::Float)) - })) - ) -} - -const JSON: &str = "{ \"x\": 1 }"; - -#[test] -fn conversion_runtime_error() { - let json_value = interpret(&format!("json:parse('{JSON}')")).unwrap(); - - assert_eq!( - interpret(&format!("json:parse('{JSON}') as [map]")), - Err(Error::Runtime(RuntimeError::ConversionImpossible { - from: json_value.r#type().unwrap(), - to: Type::ListOf(Box::new(Type::Map(None))), - position: SourcePosition { - start_byte: 0, - end_byte: 33, - start_row: 1, - start_column: 0, - end_row: 1, - end_column: 33, - } - })) - ) -} diff --git a/tests/assignment.rs b/tests/assignment.rs deleted file mode 100644 index 6691b40..0000000 --- a/tests/assignment.rs +++ /dev/null @@ -1,57 +0,0 @@ -use dust_lang::{error::ValidationError, *}; - -#[test] -fn simple_assignment() { - let test = interpret("x = 1 x"); - - assert_eq!(Ok(Value::Integer(1)), test); -} - -#[test] -fn simple_assignment_with_type() { - let test = interpret("x = 1 x"); - - assert_eq!(Ok(Value::Integer(1)), test); -} - -#[test] -fn list_add_assign() { - let test = interpret( - " - x <[int]> = [] - x += 1 - x - ", - ); - - assert_eq!( - Ok(Value::List(List::with_items(vec![Value::Integer(1)]))), - test - ); -} - -#[test] -fn list_add_wrong_type() { - let result = interpret( - " - x <[str]> = [] - x += 1 - ", - ); - - assert_eq!( - Err(Error::Validation(ValidationError::TypeCheck { - expected: Type::String, - actual: Type::Integer, - position: SourcePosition { - start_byte: 40, - end_byte: 46, - start_row: 3, - start_column: 12, - end_row: 3, - end_column: 18 - } - })), - result - ); -} diff --git a/tests/block.rs b/tests/block.rs deleted file mode 100644 index e1133cb..0000000 --- a/tests/block.rs +++ /dev/null @@ -1,32 +0,0 @@ -use dust_lang::*; - -#[test] -fn simple() { - assert_eq!(interpret("{ 1 }"), Ok(Value::Integer(1))); -} - -#[test] -fn nested() { - assert_eq!(interpret("{ 1 { 1 + 1 } }"), Ok(Value::Integer(2))); -} - -#[test] -fn with_return() { - assert_eq!(interpret("{ return 1; 1 + 1; }"), Ok(Value::Integer(1))); -} - -#[test] -fn async_with_return() { - assert_eq!( - interpret( - " - async { - return 1 - 1 + 1 - 3 - } - " - ), - Ok(Value::Integer(1)) - ); -} diff --git a/tests/built_in_string_functions.rs b/tests/built_in_string_functions.rs deleted file mode 100644 index e9b3b73..0000000 --- a/tests/built_in_string_functions.rs +++ /dev/null @@ -1,49 +0,0 @@ -use dust_lang::{interpret, List, Value}; - -#[test] -fn as_bytes() { - let result = interpret("str:as_bytes('123')"); - - assert_eq!( - result, - Ok(Value::List(List::with_items(vec![ - Value::Integer(49), - Value::Integer(50), - Value::Integer(51), - ]))) - ); -} - -#[test] -fn ends_with() { - let result = interpret("str:ends_with('abc', 'c')"); - - assert_eq!(result, Ok(Value::Boolean(true))); - - let result = interpret("str:ends_with('abc', 'b')"); - - assert_eq!(result, Ok(Value::Boolean(false))); -} - -#[test] -fn find() { - let result = interpret("str:find('abc', 'a')"); - - assert_eq!(result, Ok(Value::some(Value::Integer(0)))); - - let result = interpret("str:find('foobar', 'b')"); - - assert_eq!(result, Ok(Value::some(Value::Integer(3)))); -} - -#[test] -fn insert() { - assert_eq!( - interpret("str:insert('ac', 1, 'b')"), - Ok(Value::string("abc")) - ); - assert_eq!( - interpret("str:insert('foo', 3, 'bar')"), - Ok(Value::string("foobar")) - ); -} diff --git a/tests/built_in_type_definitions.rs b/tests/built_in_type_definitions.rs deleted file mode 100644 index 80a4026..0000000 --- a/tests/built_in_type_definitions.rs +++ /dev/null @@ -1,71 +0,0 @@ -use dust_lang::*; - -#[test] -fn override_built_ins() { - assert_eq!( - interpret( - " - enum Option { - Some - None - } - - my_option