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 592d8d0..0000000 Binary files a/docs/assets/debugging.png and /dev/null differ diff --git a/docs/assets/example_0.png b/docs/assets/example_0.png deleted file mode 100644 index bfcbb06..0000000 Binary files a/docs/assets/example_0.png and /dev/null differ diff --git a/docs/assets/syntax_error.png b/docs/assets/syntax_error.png deleted file mode 100644 index 6e0048e..0000000 Binary files a/docs/assets/syntax_error.png and /dev/null differ diff --git a/docs/assets/type_error.png b/docs/assets/type_error.png deleted file mode 100644 index 9773be2..0000000 Binary files a/docs/assets/type_error.png and /dev/null differ diff --git a/docs/language.md b/docs/language.md deleted file mode 100644 index 611ead0..0000000 --- a/docs/language.md +++ /dev/null @@ -1,515 +0,0 @@ -# Dust Language Reference - -!!! This is a **work in progress** and has incomplete information. !!! - -This is an in-depth description of the syntax and abstractions used by the Dust language. It is not -necessary to read or understand all of it before you start using Dust. Instead, refer to it when -you need help with the syntax or understanding how the code is run. - -Each section of this document corresponds to a node in the concrete syntax tree. Creating this tree -is the first step in interpreting Dust code. Second, the syntax tree is traversed and an abstract -tree is generated. Each node in the syntax tree corresponds to a node in the abstract tree. Third, -the abstract tree is verified to ensure that it will not generate any values that violate the type -restrictions. Finally, the abstract tree is run, beginning at the [root](#root). - -You may reference the [grammar file](tree-sitter-dust/grammar.js) and the [Tree Sitter docs] -(https://tree-sitter.github.io/) while reading this guide to understand how the language is parsed. - - -- [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