diff --git a/Cargo.lock b/Cargo.lock index 4ff50ae..a808278 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -9,53 +9,66 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] -name = "anstream" -version = "0.6.5" +name = "aligned-vec" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d664a92ecae85fd0a7392615844904654d1d5f5514837f471ddef4a057aba1b6" +checksum = "4aa90d7ce82d4be67b64039a3d588d38dbcc6736577de4a847025ce5b0c468d1" + +[[package]] +name = "anstream" +version = "0.6.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", + "is_terminal_polyfill", "utf8parse", ] [[package]] name = "anstyle" -version = "1.0.4" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" +checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b" [[package]] name = "anstyle-parse" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" +checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.0.2" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" +checksum = "ad186efb764318d35165f1758e7dcef3b10628e26d41a44bc5550652e6804391" dependencies = [ "windows-sys 0.52.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.2" +version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" +checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19" dependencies = [ "anstyle", "windows-sys 0.52.0", ] +[[package]] +name = "anyhow" +version = "1.0.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" + [[package]] name = "app" version = "0.1.0" @@ -66,6 +79,7 @@ dependencies = [ "eval", "ir", "owo-colors", + "prowocessing", "ron", "serde", "serde_json", @@ -73,26 +87,81 @@ dependencies = [ ] [[package]] -name = "ariadne" -version = "0.4.0" +name = "approx" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd002a6223f12c7a95cdd4b1cb3a0149d22d37f7a9ecdb2cb691a071fe236c29" +checksum = "cab112f0a86d568ea0e627cc1d6be74a1e9cd55214684db5561995f6dad897c6" +dependencies = [ + "num-traits", +] + +[[package]] +name = "arbitrary" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" + +[[package]] +name = "arg_enum_proc_macro" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "ariadne" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44055e597c674aef7cb903b2b9f6e4cba1277ed0d2d61dae7cd52d7ffa81f8e2" dependencies = [ "unicode-width", "yansi", ] [[package]] -name = "autocfg" -version = "1.1.0" +name = "arrayvec" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" + +[[package]] +name = "autocfg" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" + +[[package]] +name = "av1-grain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6678909d8c5d46a42abcf571271e15fdbc0a225e3646cf23762cd415046c78bf" +dependencies = [ + "anyhow", + "arrayvec", + "log", + "nom", + "num-rational", + "v_frame", +] + +[[package]] +name = "avif-serialize" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "876c75a42f6364451a033496a14c44bffe41f5f4a8236f697391f11024e596d2" +dependencies = [ + "arrayvec", +] [[package]] name = "base64" -version = "0.21.5" +version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" [[package]] name = "beef" @@ -114,18 +183,42 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.1" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" dependencies = [ "serde", ] [[package]] -name = "bytemuck" -version = "1.14.0" +name = "bitstream-io" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6" +checksum = "3dcde5f311c85b8ca30c2e4198d4326bc342c76541590106f5fa4a50946ea499" + +[[package]] +name = "built" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "236e6289eda5a812bc6b53c3b024039382a2895fbbeef2d748b2931546d392c4" + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "by_address" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64fa3c856b712db6612c019f14756e64e4bcea13337a6b33b696333a9eaa2d06" + +[[package]] +name = "bytemuck" +version = "1.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b236fc92302c97ed75b38da1f4917b5cdda4984745740f153a5d3059e48d725e" [[package]] name = "byteorder" @@ -133,6 +226,32 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +[[package]] +name = "byteorder-lite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" + +[[package]] +name = "cc" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "324c74f2155653c90b04f25b2a47a8a631360cb908f92a772695f430c7e31052" +dependencies = [ + "jobserver", + "libc", +] + +[[package]] +name = "cfg-expr" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" +dependencies = [ + "smallvec", + "target-lexicon", +] + [[package]] name = "cfg-if" version = "1.0.0" @@ -141,9 +260,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "clap" -version = "4.4.12" +version = "4.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcfab8ba68f3668e89f6ff60f5b205cea56aa7b769451a59f34b8682f51c056d" +checksum = "84b3edb18336f4df585bc9aa31dd99c036dfa5dc5e9a2939a722a188f3a8970d" dependencies = [ "clap_builder", "clap_derive", @@ -151,9 +270,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.4.12" +version = "4.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb7fb5e4e979aec3be7791562fcba452f94ad85e954da024396433e0e25a79e9" +checksum = "c1c09dd5ada6c6c78075d6fd0da3f90d8080651e2d6cc8eb2f1aaa4034ced708" dependencies = [ "anstream", "anstyle", @@ -163,9 +282,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.4.7" +version = "4.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442" +checksum = "2bac35c6dafb060fd4d275d9a4ffae97917c13a6327903a8be2153cd964f7085" dependencies = [ "heck", "proc-macro2", @@ -175,9 +294,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.6.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" +checksum = "4b82cf0babdbd58558212896d1a4272303a57bdb245c2bf1147185fb45640e70" [[package]] name = "color_quant" @@ -187,9 +306,9 @@ checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" [[package]] name = "colorchoice" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422" [[package]] name = "countme" @@ -199,9 +318,9 @@ checksum = "7704b5fdd17b18ae31c4c1da5a2e0305a2bf17b5249300a9ee9ed7b72114c636" [[package]] name = "crc32fast" -version = "1.3.2" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" dependencies = [ "cfg-if", ] @@ -230,23 +349,20 @@ dependencies = [ [[package]] name = "crossbeam-deque" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fca89a0e215bab21874660c67903c5f143333cab1da83d041c7ded6053774751" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" dependencies = [ - "cfg-if", "crossbeam-epoch", "crossbeam-utils", ] [[package]] name = "crossbeam-epoch" -version = "0.9.17" +version = "0.9.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e3681d554572a651dda4186cd47240627c3d0114d45a95f6ad27f2f22e7548d" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" dependencies = [ - "autocfg", - "cfg-if", "crossbeam-utils", ] @@ -261,12 +377,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.18" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3a430a770ebd84726f584a90ee7f020d28db52c6d02138900f22341f866d39c" -dependencies = [ - "cfg-if", -] +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" [[package]] name = "crunchy" @@ -285,9 +398,9 @@ dependencies = [ [[package]] name = "darling" -version = "0.20.8" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54e36fcd13ed84ffdfda6f5be89b31287cbb80c439841fe69e04841435464391" +checksum = "83b2eb4d90d12bdda5ed17de686c2acb4c57914f8f921b8da7e112b5a36f3fe1" dependencies = [ "darling_core", "darling_macro", @@ -295,9 +408,9 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.8" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c2cf1c23a687a1feeb728783b993c4e1ad83d99f351801977dd809b48d0a70f" +checksum = "622687fe0bac72a04e5599029151f5796111b90f1baaa9b544d807a5e31cd120" dependencies = [ "fnv", "ident_case", @@ -308,9 +421,9 @@ dependencies = [ [[package]] name = "darling_macro" -version = "0.20.8" +version = "0.20.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" +checksum = "733cabb43482b1a1b53eee8583c2b9e8684d592215ea83efd305dd31bc2f0178" dependencies = [ "darling_core", "quote", @@ -374,9 +487,9 @@ checksum = "3a68a4904193147e0a8dec3314640e6db742afd5f6e634f428a6af230d9b3591" [[package]] name = "either" -version = "1.9.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" [[package]] name = "enumset" @@ -410,16 +523,26 @@ name = "eval" version = "0.1.0" dependencies = [ "clap", - "image", + "image 0.24.9", "ir", "serde", ] +[[package]] +name = "executor-poc" +version = "0.1.0" +dependencies = [ + "image 0.25.1", + "indexmap", + "nalgebra", + "petgraph", +] + [[package]] name = "exr" -version = "1.71.0" +version = "1.72.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "832a761f35ab3e6664babfbdc6cef35a4860e816ec3916dcfd0882954e98a8a8" +checksum = "887d93f60543e9a9362ef8a21beedd0a833c5d9610e18c67abe15a5963dcb1a4" dependencies = [ "bit_field", "flume", @@ -432,10 +555,16 @@ dependencies = [ ] [[package]] -name = "fdeflate" -version = "0.3.3" +name = "fast-srgb8" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "209098dd6dfc4445aa6111f0e98653ac323eaa4dfd212c9ca3931bf9955c31bd" +checksum = "dd2e7510819d6fbf51a5545c8f922716ecfb14df168a3242f7d33e0239efe6a1" + +[[package]] +name = "fdeflate" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f9bfee30e4dedf0ab8b422f03af778d9612b63f502710fc500a334ebe2de645" dependencies = [ "simd-adler32", ] @@ -448,9 +577,9 @@ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" [[package]] name = "flate2" -version = "1.0.28" +version = "1.0.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" +checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae" dependencies = [ "crc32fast", "miniz_oxide", @@ -473,9 +602,9 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "getrandom" -version = "0.2.12" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", "libc", @@ -484,9 +613,9 @@ dependencies = [ [[package]] name = "gif" -version = "0.12.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80792593675e051cf94a4b111980da2ba60d4a83e43e0048c5693baab3977045" +checksum = "3fb2d69b19215e18bb912fa30f7ce15846e301408695e44e0ef719f1da9e19f2" dependencies = [ "color_quant", "weezl", @@ -494,24 +623,25 @@ dependencies = [ [[package]] name = "half" -version = "2.2.1" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b4af3693f1b705df946e9fe5631932443781d0aabb423b62fcd4d73f6d2fd0" +checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" dependencies = [ + "cfg-if", "crunchy", ] [[package]] name = "hashbrown" -version = "0.14.3" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" [[package]] name = "heck" -version = "0.4.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] name = "hermit-abi" @@ -527,9 +657,9 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "image" -version = "0.24.7" +version = "0.24.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f3dfdbdd72063086ff443e297b61695500514b1e41095b6fb9a5ab48a70a711" +checksum = "5690139d2f55868e080017335e4b94cb7414274c74f1669c84fb5feba2c9f69d" dependencies = [ "bytemuck", "byteorder", @@ -537,13 +667,51 @@ dependencies = [ "exr", "gif", "jpeg-decoder", - "num-rational", "num-traits", "png", "qoi", "tiff", ] +[[package]] +name = "image" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd54d660e773627692c524beaad361aca785a4f9f5730ce91f42aabe5bce3d11" +dependencies = [ + "bytemuck", + "byteorder", + "color_quant", + "exr", + "gif", + "image-webp", + "num-traits", + "png", + "qoi", + "ravif", + "rayon", + "rgb", + "tiff", + "zune-core", + "zune-jpeg", +] + +[[package]] +name = "image-webp" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f79afb8cbee2ef20f59ccd477a218c12a93943d075b492015ecb1bb81f8ee904" +dependencies = [ + "byteorder-lite", + "quick-error", +] + +[[package]] +name = "imgref" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44feda355f4159a7c757171a77de25daf6411e217b4cabd03bd6650690468126" + [[package]] name = "indexmap" version = "2.2.6" @@ -560,6 +728,17 @@ version = "2.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b248f5224d1d606005e02c97f5aa4e88eeb230488bcc03bc9ca4d7991399f2b5" +[[package]] +name = "interpolate_name" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "ir" version = "0.1.0" @@ -582,25 +761,59 @@ dependencies = [ [[package]] name = "is_ci" -version = "1.1.1" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "616cde7c720bb2bb5824a224687d8f77bfd38922027f01d825cd7453be5099fb" +checksum = "7655c9839580ee829dfacba1d1278c2b7883e50a277ff7541299489d6bdfdc45" + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" + +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] [[package]] name = "itoa" -version = "1.0.10" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" + +[[package]] +name = "jobserver" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" +dependencies = [ + "libc", +] [[package]] name = "jpeg-decoder" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc0000e42512c92e31c2252315bda326620a4e034105e900c98ec492fa077b3e" +checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" dependencies = [ "rayon", ] +[[package]] +name = "json-pawarser" +version = "0.1.0" +dependencies = [ + "enumset", + "logos", + "pawarser", + "rowan", +] + [[package]] name = "lang" version = "0.1.0" @@ -623,9 +836,9 @@ dependencies = [ [[package]] name = "lazy_static" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "lebe" @@ -640,40 +853,56 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" [[package]] -name = "libredox" -version = "0.0.1" +name = "libfuzzer-sys" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" +checksum = "a96cfd5557eb82f2b83fed4955246c988d331975a002961b07c81584d107e7f7" dependencies = [ - "bitflags 2.4.1", + "arbitrary", + "cc", + "once_cell", +] + +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.6.0", "libc", - "redox_syscall 0.4.1", ] [[package]] name = "lock_api" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" dependencies = [ "autocfg", "scopeguard", ] [[package]] -name = "logos" -version = "0.14.0" +name = "log" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "161971eb88a0da7ae0c333e1063467c5b5727e7fb6b710b8db4814eade3a42e8" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" + +[[package]] +name = "logos" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c6b6e02facda28ca5fb8dbe4b152496ba3b1bd5a4b40bb2b1b2d8ad74e0f39b" dependencies = [ "logos-derive", ] [[package]] name = "logos-codegen" -version = "0.14.0" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e31badd9de5131fdf4921f6473d457e3dd85b11b7f091ceb50e4df7c3eeb12a" +checksum = "b32eb6b5f26efacd015b000bfc562186472cd9b34bdba3f6b264e2a052676d10" dependencies = [ "beef", "fnv", @@ -686,18 +915,47 @@ dependencies = [ [[package]] name = "logos-derive" -version = "0.14.0" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c2a69b3eb68d5bd595107c9ee58d7e07fe2bb5e360cc85b0f084dedac80de0a" +checksum = "3e5d0c5463c911ef55624739fc353238b4e310f0144be1f875dc42fec6bfd5ec" dependencies = [ "logos-codegen", ] [[package]] -name = "memchr" -version = "2.7.1" +name = "loop9" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" +checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" +dependencies = [ + "imgref", +] + +[[package]] +name = "matrixmultiply" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7574c1cf36da4798ab73da5b215bbf444f50718207754cb522201d78d1cd0ff2" +dependencies = [ + "autocfg", + "rawpointer", +] + +[[package]] +name = "maybe-rayon" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" +dependencies = [ + "cfg-if", + "rayon", +] + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] name = "memoffset" @@ -709,50 +967,140 @@ dependencies = [ ] [[package]] -name = "miniz_oxide" -version = "0.7.1" +name = "minimal-lexical" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" dependencies = [ "adler", "simd-adler32", ] [[package]] -name = "num-integer" -version = "0.1.45" +name = "nalgebra" +version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +checksum = "3c4b5f057b303842cf3262c27e465f4c303572e7f6b0648f60e16248ac3397f4" +dependencies = [ + "approx", + "matrixmultiply", + "nalgebra-macros", + "num-complex", + "num-rational", + "num-traits", + "simba", + "typenum", +] + +[[package]] +name = "nalgebra-macros" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "254a5372af8fc138e36684761d3c0cdb758a4410e938babcff1c860ce14ddbfc" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "noop_proc_macro" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-complex" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" dependencies = [ - "autocfg", "num-traits", ] [[package]] name = "num-rational" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" dependencies = [ - "autocfg", + "num-bigint", "num-integer", "num-traits", ] [[package]] name = "num-traits" -version = "0.2.17" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ "autocfg", ] [[package]] name = "num_threads" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" +checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" dependencies = [ "libc", ] @@ -778,6 +1126,30 @@ dependencies = [ "supports-color", ] +[[package]] +name = "palette" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cbf71184cc5ecc2e4e1baccdb21026c20e5fc3dcf63028a086131b3ab00b6e6" +dependencies = [ + "approx", + "fast-srgb8", + "palette_derive", + "phf", +] + +[[package]] +name = "palette_derive" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5030daf005bface118c096f510ffb781fc28f9ab6a32ab224d8631be6851d30" +dependencies = [ + "by_address", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "parking_lot_core" version = "0.9.10" @@ -786,16 +1158,31 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.1", + "redox_syscall", "smallvec", - "windows-targets 0.52.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pawarser" +version = "0.1.0" +dependencies = [ + "drop_bomb", + "enumset", + "rowan", ] [[package]] name = "petgraph" -version = "0.6.4" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" dependencies = [ "fixedbitset", "indexmap", @@ -844,10 +1231,16 @@ dependencies = [ ] [[package]] -name = "png" -version = "0.17.10" +name = "pkg-config" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd75bf2d8dd3702b9707cdbc56a5b9ef42cec752eb8b3bafc01234558442aa64" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" + +[[package]] +name = "png" +version = "0.17.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06e4b0d3d1312775e782c86c91a111aa1f910cbb65e1337f9975b5f9a554b5e1" dependencies = [ "bitflags 1.3.2", "crc32fast", @@ -863,14 +1256,47 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" [[package]] -name = "proc-macro2" -version = "1.0.70" +name = "ppv-lite86" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "proc-macro2" +version = "1.0.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ "unicode-ident", ] +[[package]] +name = "profiling" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43d84d1d7a6ac92673717f9f6d1518374ef257669c24ebc5ac25d5033828be58" +dependencies = [ + "profiling-procmacros", +] + +[[package]] +name = "profiling-procmacros" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8021cf59c8ec9c432cfc2526ac6b8aa508ecaf29cd415f271b8406c1b851c3fd" +dependencies = [ + "quote", + "syn", +] + +[[package]] +name = "prowocessing" +version = "0.1.0" +dependencies = [ + "image 0.24.9", + "palette", +] + [[package]] name = "qoi" version = "0.4.1" @@ -880,6 +1306,12 @@ dependencies = [ "bytemuck", ] +[[package]] +name = "quick-error" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" + [[package]] name = "quick-xml" version = "0.31.0" @@ -892,9 +1324,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.33" +version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" dependencies = [ "proc-macro2", ] @@ -905,6 +1337,18 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ + "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", ] @@ -913,6 +1357,65 @@ name = "rand_core" version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rav1e" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd87ce80a7665b1cce111f8a16c1f3929f6547ce91ade6addf4ec86a8dda5ce9" +dependencies = [ + "arbitrary", + "arg_enum_proc_macro", + "arrayvec", + "av1-grain", + "bitstream-io", + "built", + "cfg-if", + "interpolate_name", + "itertools", + "libc", + "libfuzzer-sys", + "log", + "maybe-rayon", + "new_debug_unreachable", + "noop_proc_macro", + "num-derive", + "num-traits", + "once_cell", + "paste", + "profiling", + "rand", + "rand_chacha", + "simd_helpers", + "system-deps", + "thiserror", + "v_frame", + "wasm-bindgen", +] + +[[package]] +name = "ravif" +version = "0.11.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6ba61c28ba24c0cf8406e025cb29a742637e3f70776e61c27a8a8b72a042d12" +dependencies = [ + "avif-serialize", + "imgref", + "loop9", + "quick-error", + "rav1e", + "rayon", + "rgb", +] + +[[package]] +name = "rawpointer" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" [[package]] name = "rayon" @@ -936,27 +1439,18 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.4.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +checksum = "c82cf8cff14456045f55ec4241383baeff27af886adb72ffb2162f99911de0fd" dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_syscall" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7e" -dependencies = [ - "bitflags 2.4.1", + "bitflags 2.6.0", ] [[package]] name = "redox_users" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a18479200779601e498ada4e8c1e1f50e3ee19deb0259c25825a98b5603b2cb4" +checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891" dependencies = [ "getrandom", "libredox", @@ -965,9 +1459,18 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.2" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" +checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" + +[[package]] +name = "rgb" +version = "0.8.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ade4539f42266ded9e755c605bdddf546242b2c961b03b06a7375260788a0523" +dependencies = [ + "bytemuck", +] [[package]] name = "ron" @@ -976,7 +1479,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b91f7eff05f748767f183df4320a63d6936e9c6107d97c9e6bdd9784f4289c94" dependencies = [ "base64", - "bitflags 2.4.1", + "bitflags 2.6.0", "serde", "serde_derive", ] @@ -1002,9 +1505,18 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "ryu" -version = "1.0.16" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" + +[[package]] +name = "safe_arch" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3460605018fdc9612bce72735cba0d27efbcd9904780d44c7e3a9948f96148a" +dependencies = [ + "bytemuck", +] [[package]] name = "scopeguard" @@ -1014,18 +1526,18 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "serde" -version = "1.0.193" +version = "1.0.204" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" +checksum = "bc76f558e0cbb2a839d37354c575f1dc3fdc6546b5be373ba43d95f231bf7c12" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.193" +version = "1.0.204" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" +checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222" dependencies = [ "proc-macro2", "quote", @@ -1034,21 +1546,52 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.109" +version = "1.0.120" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb0652c533506ad7a2e353cce269330d6afd8bdfb6d75e0ace5b35aacbd7b9e9" +checksum = "4e0d21c9a8cae1235ad58a00c11cb40d4b1e5c784f1ef2c537876ed6ffd8b7c5" dependencies = [ "itoa", "ryu", "serde", ] +[[package]] +name = "serde_spanned" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79e674e01f999af37c49f70a6ede167a8a60b2503e56c5599532a65baa5969a0" +dependencies = [ + "serde", +] + +[[package]] +name = "simba" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3a386a501cd104797982c15ae17aafe8b9261315b5d07e3ec803f2ea26be0fa" +dependencies = [ + "approx", + "num-complex", + "num-traits", + "paste", + "wide", +] + [[package]] name = "simd-adler32" version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" +[[package]] +name = "simd_helpers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6" +dependencies = [ + "quote", +] + [[package]] name = "siphasher" version = "0.3.11" @@ -1057,9 +1600,9 @@ checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" [[package]] name = "smallvec" -version = "1.11.2" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] name = "spin" @@ -1081,9 +1624,9 @@ dependencies = [ [[package]] name = "strsim" -version = "0.10.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] name = "supports-color" @@ -1107,15 +1650,34 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.41" +version = "2.0.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c8b28c477cc3bf0e7966561e3460130e1255f7a1cf71931075f1c5e7a7e269" +checksum = "2f0209b68b3613b093e0ec905354eccaedcfe83b8cb37cbdeae64026c3064c16" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] +[[package]] +name = "system-deps" +version = "6.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +dependencies = [ + "cfg-expr", + "heck", + "pkg-config", + "toml", + "version-compare", +] + +[[package]] +name = "target-lexicon" +version = "0.12.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4873307b7c257eddcb50c9bedf158eb669578359fb28428bef438fec8e6ba7c2" + [[package]] name = "text-size" version = "1.1.1" @@ -1124,18 +1686,18 @@ checksum = "f18aa187839b2bdb1ad2fa35ead8c4c2976b64e4363c386d45ac0f7ee85c9233" [[package]] name = "thiserror" -version = "1.0.55" +version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e3de26b0965292219b4287ff031fcba86837900fe9cd2b34ea8ad893c0953d2" +checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.55" +version = "1.0.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "268026685b2be38d7103e9e507c938a1fcb3d7e6eb15e87870b617bf37b6d581" +checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533" dependencies = [ "proc-macro2", "quote", @@ -1144,9 +1706,9 @@ dependencies = [ [[package]] name = "tiff" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d172b0f4d3fba17ba89811858b9d3d97f928aece846475bbda076ca46736211" +checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" dependencies = [ "flate2", "jpeg-decoder", @@ -1155,12 +1717,13 @@ dependencies = [ [[package]] name = "time" -version = "0.3.31" +version = "0.3.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f657ba42c3f86e7680e53c8cd3af8abbe56b5491790b46e22e19c0d57463583e" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" dependencies = [ "deranged", "libc", + "num-conv", "num_threads", "powerfmt", "serde", @@ -1173,6 +1736,46 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" +[[package]] +name = "toml" +version = "0.8.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac2caab0bf757388c6c0ae23b3293fdb463fee59434529014f85e3263b995c28" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.22.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "278f3d518e152219c994ce877758516bca5e118eaed6996192a774fb9fbf0788" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + [[package]] name = "unicode-ident" version = "1.0.12" @@ -1181,15 +1784,32 @@ checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "unicode-width" -version = "0.1.11" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" +checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" [[package]] name = "utf8parse" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "v_frame" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f32aaa24bacd11e488aa9ba66369c7cd514885742c9fe08cfe85884db3e92b" +dependencies = [ + "aligned-vec", + "num-traits", + "wasm-bindgen", +] + +[[package]] +name = "version-compare" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" [[package]] name = "vte" @@ -1218,10 +1838,74 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] -name = "weezl" -version = "0.1.7" +name = "wasm-bindgen" +version = "0.2.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9193164d4de03a926d909d3bc7c30543cecb35400c02114792c2cae20d5e2dbb" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" + +[[package]] +name = "weezl" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" + +[[package]] +name = "wide" +version = "0.7.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2caba658a80831539b30698ae9862a72db6697dfdd7151e46920f5f2755c3ce2" +dependencies = [ + "bytemuck", + "safe_arch", +] [[package]] name = "windows-sys" @@ -1238,7 +1922,7 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets 0.52.0", + "windows-targets 0.52.6", ] [[package]] @@ -1258,17 +1942,18 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 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", + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", ] [[package]] @@ -1279,9 +1964,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_msvc" @@ -1291,9 +1976,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_i686_gnu" @@ -1303,9 +1988,15 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_msvc" @@ -1315,9 +2006,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_x86_64_gnu" @@ -1327,9 +2018,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnullvm" @@ -1339,9 +2030,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_msvc" @@ -1351,15 +2042,30 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.0" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winnow" +version = "0.6.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59b5e5f6c299a3c7890b876a2a587f3115162487e704907d9b6cd29473052ba1" +dependencies = [ + "memchr", +] [[package]] name = "yansi" -version = "0.5.1" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" +checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" + +[[package]] +name = "zune-core" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" [[package]] name = "zune-inflate" @@ -1369,3 +2075,12 @@ checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" dependencies = [ "simd-adler32", ] + +[[package]] +name = "zune-jpeg" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec866b44a2a1fd6133d363f073ca1b179f438f99e7e5bfb1e33f7181facfe448" +dependencies = [ + "zune-core", +] diff --git a/Cargo.toml b/Cargo.toml index 2d4a618..794dd5a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,6 +5,10 @@ members = [ "crates/ir", "crates/lang", "crates/svg-filters", + "crates/prowocessing", + "crates/executor-poc", + "crates/pawarser", + "crates/json-pawarser", ] resolver = "2" diff --git a/crates/app/Cargo.toml b/crates/app/Cargo.toml index 10182c2..d316efc 100644 --- a/crates/app/Cargo.toml +++ b/crates/app/Cargo.toml @@ -12,6 +12,7 @@ clap = { workspace = true, features = [ "derive", "env" ] } dirs = "5" eval = { path = "../eval" } ir = { path = "../ir" } +prowocessing = { path = "../prowocessing"} owo-colors = "4" ron = "0.8" serde = { workspace = true, features = [ "derive" ] } diff --git a/crates/app/src/config.rs b/crates/app/src/config.rs index b4d1ed1..17cd39c 100644 --- a/crates/app/src/config.rs +++ b/crates/app/src/config.rs @@ -1,18 +1,11 @@ -use std::path::PathBuf; - -use clap::Parser; - -use self::{ - cli::Args, - config_file::{find_config_file, Configs}, -}; +use self::config_file::{find_config_file, Configs}; +pub(crate) use cli::CliConfigs; mod cli; mod config_file; /// this struct may hold all configuration pub struct Config { - pub source: PathBuf, pub evaluator: eval::Available, pub startup_msg: bool, @@ -20,13 +13,17 @@ pub struct Config { impl Config { /// Get the configs from all possible places (args, file, env...) - pub fn read() -> Self { - let args = Args::parse(); - let config = if let Some(config) = args.config_path { - Ok(config) - } else { - find_config_file() - }; + pub fn read(args: &CliConfigs) -> Self { + // let config = if let Some(config) = &args.config_path { + // Ok(config.clone()) + // } else { + // find_config_file() + // }; + let config = args + .config_path + .clone() + .ok_or(()) + .or_else(|()| find_config_file()); // try to read a maybe existing config file let config = config.ok().and_then(|path| { @@ -42,7 +39,6 @@ impl Config { if let Some(file) = config { Self { - source: args.source, evaluator: args.evaluator.and(file.evaluator).unwrap_or_default(), // this is negated because to an outward api, the negative is more intuitive, // while in the source the other way around is more intuitive @@ -50,7 +46,6 @@ impl Config { } } else { Self { - source: args.source, startup_msg: !args.no_startup_message, evaluator: args.evaluator.unwrap_or_default(), } diff --git a/crates/app/src/config/cli.rs b/crates/app/src/config/cli.rs index 1d9c57a..c0e6c4d 100644 --- a/crates/app/src/config/cli.rs +++ b/crates/app/src/config/cli.rs @@ -1,12 +1,9 @@ use std::path::PathBuf; -use clap::{builder::BoolishValueParser, ArgAction, Parser}; - -#[derive(Parser)] -pub(crate) struct Args { - /// What file contains the pipeline to evaluate. - pub source: PathBuf, +use clap::{builder::BoolishValueParser, ArgAction, Args}; +#[derive(Args)] +pub(crate) struct CliConfigs { /// How to actually run the pipeline. /// Overrides the config file. Defaults to the debug evaluator. #[arg(short, long)] diff --git a/crates/app/src/main.rs b/crates/app/src/main.rs index 58103a5..9c7c0de 100644 --- a/crates/app/src/main.rs +++ b/crates/app/src/main.rs @@ -1,6 +1,8 @@ -use std::fs; +use std::{fs, path::PathBuf}; -use config::Config; +use clap::{Parser, Subcommand}; +use config::{CliConfigs, Config}; +use dev::DevCommands; use welcome_msg::print_startup_msg; mod config; @@ -9,19 +11,60 @@ mod config; mod error_reporting; mod welcome_msg; +#[derive(Parser)] +struct Args { + #[command(flatten)] + configs: CliConfigs, + #[command(subcommand)] + command: Commands, +} + +#[derive(Subcommand)] +enum Commands { + Run { + /// What file contains the pipeline to evaluate. + source: PathBuf, + }, + Dev { + #[command(subcommand)] + command: DevCommands, + }, +} + fn main() { // TODO: proper error handling across the whole function // don't forget to also look inside `Config` - let cfg = Config::read(); + let args = Args::parse(); + let cfg = Config::read(&args.configs); if cfg.startup_msg { print_startup_msg(); } - let source = fs::read_to_string(cfg.source).expect("can't find source file"); - let ir = ir::from_ron(&source).expect("failed to parse source to graph ir"); + match args.command { + Commands::Run { source } => { + let source = fs::read_to_string(source).expect("can't find source file"); + let ir = ir::from_ron(&source).expect("failed to parse source to graph ir"); - let mut machine = cfg.evaluator.pick(); - machine.feed(ir); - machine.eval_full(); + let mut machine = cfg.evaluator.pick(); + machine.feed(ir); + machine.eval_full(); + } + Commands::Dev { + command: dev_command, + } => dev_command.run(), + } +} + +mod dev { + use clap::Subcommand; + + #[derive(Subcommand)] + pub(crate) enum DevCommands {} + + impl DevCommands { + pub fn run(self) { + println!("There are currently no dev commands."); + } + } } diff --git a/crates/app/src/welcome_msg.rs b/crates/app/src/welcome_msg.rs index a3e15a3..63b7601 100644 --- a/crates/app/src/welcome_msg.rs +++ b/crates/app/src/welcome_msg.rs @@ -13,4 +13,10 @@ pub fn print_startup_msg() { } else { println!("Hello, thanks for using iOwO! :3"); } + if now.year() >= 2100 { + println!("Is your system time set correctly? If yes, ... wow, humanity still exists! :0"); + println!( + "Given current politics, I'm surprised we as a species made it another 75 years..." + ); + } } diff --git a/crates/eval/src/lib.rs b/crates/eval/src/lib.rs index c3a6c38..8687d91 100644 --- a/crates/eval/src/lib.rs +++ b/crates/eval/src/lib.rs @@ -37,7 +37,7 @@ impl Available { #[must_use] pub fn pick(&self) -> Box { match self { - Self::Debug => Box::new(kind::debug::Evaluator::default()), + Self::Debug => Box::::default(), } } } diff --git a/crates/executor-poc/Cargo.toml b/crates/executor-poc/Cargo.toml new file mode 100644 index 0000000..563b1aa --- /dev/null +++ b/crates/executor-poc/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "executor-poc" +version = "0.1.0" +edition = "2021" + +[dependencies] +image = "0.25.1" +indexmap = "2.2.6" +nalgebra = "0.33.0" +petgraph.workspace = true + +[lints] +workspace = true diff --git a/crates/executor-poc/src/lib.rs b/crates/executor-poc/src/lib.rs new file mode 100644 index 0000000..e5c703e --- /dev/null +++ b/crates/executor-poc/src/lib.rs @@ -0,0 +1,128 @@ +use indexmap::IndexMap; +use instructions::Instruction; +use petgraph::graph::DiGraph; +use types::Type; + +trait Node { + fn inputs() -> IndexMap; + fn outputs() -> IndexMap; +} + +struct NodeGraph { + graph: DiGraph, +} + +struct TypedEdge { + from: String, + to: String, + typ: Type, +} + +mod instructions { + //! This is the lowest level of the IR, the one the executor will use. + + use std::path::Path; + + use indexmap::{indexmap, IndexMap}; + pub enum Instruction { + // File handling + LoadFile, + SaveFile, + + ColorMatrix, + PosMatrix, + + Blend, + SplitChannels, + } + + impl Instruction { + fn inputs(&self) -> IndexMap { + match self { + Instruction::LoadFile => indexmap! { + "path" => Type::Path + }, + Instruction::SaveFile => indexmap! { + "path" => Type::Path + }, + + Instruction::ColorMatrix => indexmap! { + "image" => Type::ImageData, + "matrix" => Type::Mat(4,5) + }, + Instruction::PosMatrix => indexmap! { + "image" => Type::ImageData, + "matrix" => Type::Mat(2, 3), + }, + + Instruction::Blend => todo!(), + Instruction::SplitChannels => todo!(), + } + } + fn outputs(&self) -> IndexMap { + match self { + Instruction::LoadFile => indexmap! { + "image" => Type::ImageData + }, + Instruction::SaveFile => indexmap! {}, + + Instruction::ColorMatrix => indexmap! { + "resut" => Type::ImageData + }, + Instruction::PosMatrix => todo!(), + + Instruction::Blend => todo!(), + Instruction::SplitChannels => todo!(), + } + } + } +} + +mod types { + pub enum Type { + // TODO: later do lower level type system for this stuff? + // Image(Size, PixelType), + // // image data for processing. + // // always PixelType::Rgba32F + // ImageData(Size), + // // stuff that's still to be generated, not sized and no pixeltype + // ProceduralImage, + ImageData, + Text, + Integer, + Float, + Double, + Path, + Bool, + Vec( + // length, + u8, + ), + Mat( + // Rows + u8, + // Columns + u8, + ), + } + + // pub struct Size { + // width: u16, + // height: u16, + // } + + // Pixel types. Taken from variants [here](https://docs.rs/image/latest/image/pub enum.DynamicImage.html). + // pub enum PixelType { + // Luma8, + // LumaA8, + // Rgb8, + // Rgba8, + // Luma16, + // LumaA16, + // Rgb16, + // Rgba16, + // Rgb32F, + // #[default] + // Rgba32F, + // } +} diff --git a/crates/json-pawarser/Cargo.toml b/crates/json-pawarser/Cargo.toml new file mode 100644 index 0000000..eb342e9 --- /dev/null +++ b/crates/json-pawarser/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "json-pawarser" +version = "0.1.0" +edition = "2021" + +[dependencies] +logos = "0.14.2" +enumset = "1.1.3" +rowan = "0.15.15" +pawarser = { path = "../pawarser" } + +[lints] +workspace = true diff --git a/crates/json-pawarser/src/grammar.rs b/crates/json-pawarser/src/grammar.rs new file mode 100644 index 0000000..bb94474 --- /dev/null +++ b/crates/json-pawarser/src/grammar.rs @@ -0,0 +1,78 @@ +use array::array; +use enumset::{enum_set, EnumSet}; +use pawarser::parser::ParserBuilder; + +use crate::{ + syntax_error::SyntaxError, + syntax_kind::{lex, SyntaxKind}, +}; + +use self::object::object; + +mod array; +mod object; + +pub(crate) type Parser<'src> = pawarser::Parser<'src, SyntaxKind, SyntaxError>; +pub(crate) type CompletedMarker = pawarser::CompletedMarker; + +const BASIC_VALUE_TOKENS: EnumSet = + enum_set!(SyntaxKind::BOOL | SyntaxKind::NULL | SyntaxKind::NUMBER | SyntaxKind::STRING); + +pub fn value(p: &mut Parser) -> bool { + if BASIC_VALUE_TOKENS.contains(p.current()) { + p.do_bump(); + return true; + } else { + object(p).or_else(|| array(p)).is_some() + } +} + +#[cfg(test)] +mod tests { + use super::{ + test_utils::{check_parser, gen_checks}, + value, + }; + + #[test] + fn value_lit() { + gen_checks! {value; + r#""helo world""# => r#"ROOT { STRING "\"helo world\""; }"#, + "42" => r#"ROOT { NUMBER "42"; }"#, + "null" => r#"ROOT { NULL "null"; }"#, + "true" => r#"ROOT { BOOL "true"; }"#, + "false" => r#"ROOT { BOOL "false"; }"# + }; + } +} + +#[cfg(test)] +mod test_utils { + use pawarser::parser::ParserBuilder; + + use crate::syntax_kind::{lex, SyntaxKind}; + + use super::Parser; + + macro_rules! gen_checks { + ($fn_to_test:ident; $($in:literal => $out:literal),+) => { + $(crate::grammar::test_utils::check_parser($in, |p| { $fn_to_test(p); }, $out);)+ + } + } + + pub(super) use gen_checks; + + pub(super) fn check_parser(input: &str, parser_fn: fn(&mut Parser), expected_output: &str) { + let toks = lex(input); + let mut p: Parser = ParserBuilder::new(toks) + .add_meaningless(SyntaxKind::WHITESPACE) + .add_meaningless(SyntaxKind::NEWLINE) + .build(); + + parser_fn(&mut p); + + let out = p.finish(); + + assert_eq!(format!("{out:?}").trim_end(), expected_output); + } +} diff --git a/crates/json-pawarser/src/grammar/array.rs b/crates/json-pawarser/src/grammar/array.rs new file mode 100644 index 0000000..3ae1726 --- /dev/null +++ b/crates/json-pawarser/src/grammar/array.rs @@ -0,0 +1,52 @@ +use crate::{syntax_error::SyntaxError, syntax_kind::SyntaxKind}; + +use super::{value, CompletedMarker, Parser}; + +pub(super) fn array(p: &mut Parser) -> Option { + let array_start = p.start("array"); + + if !p.eat(SyntaxKind::BRACKET_OPEN) { + array_start.abandon(p); + return None; + } + + let el = p.start("arr_el"); + value(p); + el.complete(p, SyntaxKind::ELEMENT); + + while p.at(SyntaxKind::COMMA) { + let potential_trailing_comma = p.start("potential_trailing_comma"); + + p.eat(SyntaxKind::COMMA); + let maybe_el = p.start("arr_el"); + if !value(p) { + maybe_el.abandon(p); + potential_trailing_comma.complete(p, SyntaxKind::TRAILING_COMMA); + } else { + maybe_el.complete(p, SyntaxKind::ELEMENT); + potential_trailing_comma.abandon(p); + } + } + + Some(if !p.eat(SyntaxKind::BRACKET_CLOSE) { + array_start.error(p, SyntaxError::UnclosedArray) + } else { + array_start.complete(p, SyntaxKind::ARRAY) + }) +} + +#[cfg(test)] +mod tests { + use crate::grammar::{array::array, test_utils::gen_checks}; + + #[test] + fn array_basic() { + gen_checks! {array; + r#"[1,2,3]"# => r#"ROOT { ARRAY { BRACKET_OPEN "["; ELEMENT { NUMBER "1"; } COMMA ","; ELEMENT { NUMBER "2"; } COMMA ","; ELEMENT { NUMBER "3"; } BRACKET_CLOSE "]"; } }"#, + r#"[1,2,]"# => r#"ROOT { ARRAY { BRACKET_OPEN "["; ELEMENT { NUMBER "1"; } COMMA ","; ELEMENT { NUMBER "2"; } TRAILING_COMMA { COMMA ","; } BRACKET_CLOSE "]"; } }"#, + r#"[1,2"# => r#"ROOT { PARSE_ERR: UnclosedArray { BRACKET_OPEN "["; ELEMENT { NUMBER "1"; } COMMA ","; ELEMENT { NUMBER "2"; } } }"#, + r#"[1,2,"# => r#"ROOT { PARSE_ERR: UnclosedArray { BRACKET_OPEN "["; ELEMENT { NUMBER "1"; } COMMA ","; ELEMENT { NUMBER "2"; } TRAILING_COMMA { COMMA ","; } } }"#, + r#"[{"hello":"world""# => r#"ROOT { PARSE_ERR: UnclosedArray { BRACKET_OPEN "["; ELEMENT { PARSE_ERR: UnclosedObject { BRACE_OPEN "{"; MEMBER { MEMBER_NAME { STRING "\"hello\""; } COLON ":"; MEMBER_VALUE { STRING "\"world\""; } } } } } }"# + } + } +} diff --git a/crates/json-pawarser/src/grammar/object.rs b/crates/json-pawarser/src/grammar/object.rs new file mode 100644 index 0000000..02d9e73 --- /dev/null +++ b/crates/json-pawarser/src/grammar/object.rs @@ -0,0 +1,92 @@ +use crate::{grammar::value, syntax_error::SyntaxError, syntax_kind::SyntaxKind}; + +use super::{CompletedMarker, Parser, BASIC_VALUE_TOKENS}; + +pub(super) fn object(p: &mut Parser) -> Option { + let obj_start = p.start("object"); + + if !p.eat(SyntaxKind::BRACE_OPEN) { + obj_start.abandon(p); + return None; + } + + member(p); + while p.at(SyntaxKind::COMMA) { + // not always an error, later configurable + let potential_trailing_comma = p.start("potential_trailing_comma"); + p.eat(SyntaxKind::COMMA); + + if member(p).is_none() { + potential_trailing_comma.complete(p, SyntaxKind::TRAILING_COMMA); + } else { + potential_trailing_comma.abandon(p); + } + } + + Some(if p.eat(SyntaxKind::BRACE_CLOSE) { + obj_start.complete(p, SyntaxKind::OBJECT) + } else { + obj_start.error(p, SyntaxError::UnclosedObject) + }) +} + +fn member(p: &mut Parser) -> Option { + let member_start = p.start("member"); + + if p.at(SyntaxKind::BRACE_CLOSE) { + member_start.abandon(p); + return None; + } else if p.at(SyntaxKind::STRING) { + let member_name_start = p.start("member_name"); + p.eat(SyntaxKind::STRING); + member_name_start.complete(p, SyntaxKind::MEMBER_NAME); + } else { + return todo!("handle other tokens: {:?}", p.current()); + } + + if !p.eat(SyntaxKind::COLON) { + todo!("handle wrong tokens") + } + + let member_value_start = p.start("member_value_start"); + if value(p) { + member_value_start.complete(p, SyntaxKind::MEMBER_VALUE); + Some(member_start.complete(p, SyntaxKind::MEMBER)) + } else { + member_value_start.abandon(p); + let e = member_start.error(p, SyntaxError::MemberMissingValue); + Some( + e.precede(p, "member but failed already") + .complete(p, SyntaxKind::MEMBER), + ) + } +} + +#[cfg(test)] +mod tests { + use crate::grammar::{ + object::{member, object}, + test_utils::gen_checks, + }; + + #[test] + fn object_basic() { + gen_checks! {object; + r#"{"a": "b"}"# => r#"ROOT { OBJECT { BRACE_OPEN "{"; MEMBER { MEMBER_NAME { STRING "\"a\""; } COLON ":"; WHITESPACE " "; MEMBER_VALUE { STRING "\"b\""; } } BRACE_CLOSE "}"; } }"#, + r#"{"a": 42}"# => r#"ROOT { OBJECT { BRACE_OPEN "{"; MEMBER { MEMBER_NAME { STRING "\"a\""; } COLON ":"; WHITESPACE " "; MEMBER_VALUE { NUMBER "42"; } } BRACE_CLOSE "}"; } }"#, + r#"{"a": "b""# => r#"ROOT { PARSE_ERR: UnclosedObject { BRACE_OPEN "{"; MEMBER { MEMBER_NAME { STRING "\"a\""; } COLON ":"; WHITESPACE " "; MEMBER_VALUE { STRING "\"b\""; } } } }"#, + r#"{"a": }"# => r#"ROOT { OBJECT { BRACE_OPEN "{"; MEMBER { PARSE_ERR: MemberMissingValue { MEMBER_NAME { STRING "\"a\""; } COLON ":"; } } WHITESPACE " "; BRACE_CLOSE "}"; } }"#, + r#"{"a":"# => r#"ROOT { PARSE_ERR: UnclosedObject { BRACE_OPEN "{"; MEMBER { PARSE_ERR: MemberMissingValue { MEMBER_NAME { STRING "\"a\""; } COLON ":"; } } } }"#, + r#"{"a":true,}"# => r#"ROOT { OBJECT { BRACE_OPEN "{"; MEMBER { MEMBER_NAME { STRING "\"a\""; } COLON ":"; MEMBER_VALUE { BOOL "true"; } } TRAILING_COMMA { COMMA ","; } BRACE_CLOSE "}"; } }"# + } + } + + #[test] + fn member_basic() { + gen_checks! {member; + r#""a": "b""# => r#"ROOT { MEMBER { MEMBER_NAME { STRING "\"a\""; } COLON ":"; WHITESPACE " "; MEMBER_VALUE { STRING "\"b\""; } } }"#, + r#""a": 42"# => r#"ROOT { MEMBER { MEMBER_NAME { STRING "\"a\""; } COLON ":"; WHITESPACE " "; MEMBER_VALUE { NUMBER "42"; } } }"#, + r#""a":"# => r#"ROOT { MEMBER { PARSE_ERR: MemberMissingValue { MEMBER_NAME { STRING "\"a\""; } COLON ":"; } } }"# + } + } +} diff --git a/crates/json-pawarser/src/lib.rs b/crates/json-pawarser/src/lib.rs new file mode 100644 index 0000000..89160be --- /dev/null +++ b/crates/json-pawarser/src/lib.rs @@ -0,0 +1,3 @@ +mod grammar; +mod syntax_error; +mod syntax_kind; diff --git a/crates/json-pawarser/src/syntax_error.rs b/crates/json-pawarser/src/syntax_error.rs new file mode 100644 index 0000000..8c76de2 --- /dev/null +++ b/crates/json-pawarser/src/syntax_error.rs @@ -0,0 +1,11 @@ +use crate::syntax_kind::SyntaxKind; + +#[derive(Debug, Clone, PartialEq, Eq)] +pub enum SyntaxError { + UnclosedObject, + UnclosedArray, + DisallowedKeyType(SyntaxKind), + MemberMissingValue, + UnexpectedTrailingComma, +} +impl pawarser::parser::SyntaxError for SyntaxError {} diff --git a/crates/json-pawarser/src/syntax_kind.rs b/crates/json-pawarser/src/syntax_kind.rs new file mode 100644 index 0000000..6e6b966 --- /dev/null +++ b/crates/json-pawarser/src/syntax_kind.rs @@ -0,0 +1,117 @@ +use logos::Logos; + +pub fn lex(src: &str) -> Vec<(SyntaxKind, &str)> { + let mut lex = SyntaxKind::lexer(src); + let mut r = Vec::new(); + + while let Some(tok_res) = lex.next() { + r.push((tok_res.unwrap_or(SyntaxKind::LEX_ERR), lex.slice())) + } + + r +} + +#[derive(enumset::EnumSetType, Debug, Logos, PartialEq, Eq, Clone, Copy, Hash)] +#[repr(u16)] +#[enumset(no_super_impls)] +#[allow(non_camel_case_types)] +pub enum SyntaxKind { + OBJECT, + MEMBER, + MEMBER_NAME, + MEMBER_VALUE, + + ARRAY, + ELEMENT, + + // SyntaxKinds for future json5/etc support + TRAILING_COMMA, + + // Tokens + // Regexes adapted from [the logos handbook](https://logos.maciej.codes/examples/json_borrowed.html) + #[token("true")] + #[token("false")] + BOOL, + #[token("{")] + BRACE_OPEN, + #[token("}")] + BRACE_CLOSE, + #[token("[")] + BRACKET_OPEN, + #[token("]")] + BRACKET_CLOSE, + #[token(":")] + COLON, + #[token(",")] + COMMA, + #[token("null")] + NULL, + #[regex(r"-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?")] + NUMBER, + #[regex(r#""([^"\\]|\\["\\bnfrt]|u[a-fA-F0-9]{4})*""#)] + STRING, + + // Whitespace tokens + #[regex("[ \\t\\f]+")] + WHITESPACE, + #[token("\n")] + NEWLINE, + + // Error SyntaxKinds + LEX_ERR, + PARSE_ERR, + + // Meta SyntaxKinds + ROOT, + EOF, +} + +impl pawarser::parser::SyntaxElement for SyntaxKind { + const SYNTAX_EOF: Self = Self::EOF; + + const SYNTAX_ERROR: Self = Self::PARSE_ERR; + const SYNTAX_ROOT: Self = Self::ROOT; +} + +impl From for rowan::SyntaxKind { + fn from(kind: SyntaxKind) -> Self { + Self(kind as u16) + } +} + +impl From for SyntaxKind { + fn from(raw: rowan::SyntaxKind) -> Self { + assert!(raw.0 <= SyntaxKind::EOF as u16); + #[allow(unsafe_code, reason = "The transmute is necessary here")] + unsafe { + std::mem::transmute::(raw.0) + } + } +} + +#[cfg(test)] +mod tests { + use crate::syntax_kind::{lex, SyntaxKind}; + + #[test] + fn simple_object() { + const TEST_DATA: &str = r#"{"hello_world": "meow", "some_num":7.42}"#; + + assert_eq!( + dbg!(lex(TEST_DATA)), + vec![ + (SyntaxKind::BRACE_OPEN, "{"), + (SyntaxKind::STRING, "\"hello_world\""), + (SyntaxKind::COLON, ":"), + (SyntaxKind::WHITESPACE, " "), + (SyntaxKind::STRING, "\"meow\""), + (SyntaxKind::COMMA, ","), + (SyntaxKind::WHITESPACE, " "), + (SyntaxKind::STRING, "\"some_num\""), + (SyntaxKind::COLON, ":"), + (SyntaxKind::NUMBER, "7.42"), + (SyntaxKind::BRACE_CLOSE, "}") + ] + ); + } +} diff --git a/crates/pawarser/Cargo.toml b/crates/pawarser/Cargo.toml new file mode 100644 index 0000000..787cb2f --- /dev/null +++ b/crates/pawarser/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "pawarser" +version = "0.1.0" +edition = "2021" + +[dependencies] +rowan = "0.15.15" +drop_bomb = "0.1.5" +enumset = "1.1.3" + +[lints] +workspace = true diff --git a/crates/pawarser/src/lib.rs b/crates/pawarser/src/lib.rs new file mode 100644 index 0000000..26d8679 --- /dev/null +++ b/crates/pawarser/src/lib.rs @@ -0,0 +1,8 @@ +#![feature(iter_collect_into)] +pub mod parser; + +pub use parser::{ + error::SyntaxError, + marker::{CompletedMarker, Marker}, + Parser, SyntaxElement, +}; diff --git a/crates/pawarser/src/parser.rs b/crates/pawarser/src/parser.rs new file mode 100644 index 0000000..c592cdb --- /dev/null +++ b/crates/pawarser/src/parser.rs @@ -0,0 +1,253 @@ +use std::{cell::Cell, fmt, marker::PhantomData, mem}; + +use enumset::{EnumSet, EnumSetType}; +use rowan::{GreenNode, GreenNodeBuilder}; + +use crate::parser::event::NodeKind; + +use self::{event::Event, input::Input, marker::Marker}; +pub use {error::SyntaxError, output::ParserOutput}; + +pub mod error; +mod event; +mod input; +pub mod marker; +pub mod output; + +/// this is used to define some required SyntaxKinds like an EOF token or an error token +pub trait SyntaxElement +where + Self: EnumSetType + + Into + + From + + fmt::Debug + + Clone + + PartialEq + + Eq, +{ + /// EOF value. This will be used by the rest of the parser library to represent an EOF. + const SYNTAX_EOF: Self; + /// Error value. This will be used as a placeholder for associated respective errors. + const SYNTAX_ERROR: Self; + const SYNTAX_ROOT: Self; +} + +pub struct Parser<'src, SyntaxKind: SyntaxElement, SyntaxErr: SyntaxError> { + input: Input<'src, SyntaxKind>, + pos: usize, + events: Vec>, + step_limit: u32, + steps: Cell, +} + +impl<'src, 'toks, SyntaxKind: SyntaxElement, SyntaxErr: SyntaxError> + Parser<'src, SyntaxKind, SyntaxErr> +{ + /// eat all meaningless tokens at the end of the file. + pub fn eat_succeeding_meaningless(&mut self) { + self.push_ev(Event::Eat { + count: self.input.meaningless_tail_len(), + }); + } + + /// Get token from current position of the parser. + pub fn current(&self) -> SyntaxKind { + self.step(); + self.input.kind(self.pos) + } + + pub fn start(&mut self, name: &str) -> Marker { + let pos = self.events.len(); + self.push_ev(Event::tombstone()); + Marker::new(pos, name) + } + + /// Eat next token if it's of kind `kind` and return `true`. + /// Otherwise, `false`. + pub fn eat(&mut self, kind: SyntaxKind) -> bool { + if !self.at(kind) { + return false; + } + + self.do_bump(); + true + } + + pub fn do_bump(&mut self) { + self.push_ev(Event::Eat { + count: self.input.preceding_meaningless(self.pos), + }); + self.pos += 1; + } + + /// Check if the token at the current parser position is of `kind` + pub fn at(&self, kind: SyntaxKind) -> bool { + self.nth_at(0, kind) + } + + /// Check if the token that is `n` ahead is of `kind` + pub fn nth_at(&self, n: usize, kind: SyntaxKind) -> bool { + self.nth(n) == kind + } + + pub fn nth(&self, n: usize) -> SyntaxKind { + self.step(); + self.input.kind(self.pos + n) + } + + fn push_ev(&mut self, event: Event) { + self.events.push(event); + } + + fn step(&self) { + let steps = self.steps.get(); + assert!(steps <= self.step_limit, "the parser seems stuck."); + self.steps.set(steps + 1); + } + + pub fn finish(self) -> ParserOutput { + let Self { + input, + pos, + mut events, + step_limit, + steps, + } = self; + let (mut raw_toks, meaningless_tokens) = input.dissolve(); + let mut builder = GreenNodeBuilder::new(); + // TODO: document what the hell a forward parent is + let mut fw_parents = Vec::new(); + let mut errors: Vec = Vec::new(); + raw_toks.reverse(); + + // always have an implicit root node to avoid [`GreenNodeBuilder::finish()`] panicking due to multiple root elements. + builder.start_node(SyntaxKind::SYNTAX_ROOT.into()); + + for i in 0..events.len() { + match mem::replace(&mut events[i], Event::tombstone()) { + Event::Start { + kind, + forward_parent, + } => { + if kind == NodeKind::Tombstone && forward_parent.is_none() { + continue; + } + + // resolving forward parents + // temporarily jump around with the parser index and replace them with tombstones + fw_parents.push(kind); + let mut idx = i; + let mut fp = forward_parent; + while let Some(fwd) = fp { + idx += fwd as usize; + fp = match mem::replace(&mut events[idx], Event::tombstone()) { + Event::Start { + kind, + forward_parent, + } => { + fw_parents.push(kind); + forward_parent + } + _ => unreachable!(), + } + } + + // clear semantically meaningless tokens before the new tree node for aesthetic reasons + while raw_toks + .last() + .is_some_and(|v| meaningless_tokens.contains(v.0)) + { + // update first next Eat event + match events.iter_mut().find(|ev| matches!(ev, Event::Eat { .. })) { + Some(Event::Eat { count }) => *count -= 1, + _ => unreachable!(), + } + + // put whitespace into lst + let (tok, text) = raw_toks.pop().unwrap(); + builder.token(tok.into(), text); + } + + // insert forward parents into the tree in correct order + for kind in fw_parents.drain(..).rev() { + match kind { + NodeKind::Syntax(kind) => builder.start_node(kind.into()), + NodeKind::Error(err) => { + errors.push(err); + builder.start_node(SyntaxKind::SYNTAX_ERROR.into()) + } + _ => {} + } + } + } + Event::Finish => builder.finish_node(), + Event::Eat { count } => (0..count).for_each(|_| { + let (tok, text) = raw_toks.pop().unwrap(); + builder.token(tok.into(), text); + }), + } + } + + // finish SYNTAX_ROOT + builder.finish_node(); + + ParserOutput { + green_node: builder.finish(), + errors, + _syntax_kind: PhantomData::, + } + } +} + +pub struct ParserBuilder< + 'src, + SyntaxKind: SyntaxElement, + // SyntaxErr: SyntaxError, +> { + raw_toks: Vec<(SyntaxKind, &'src str)>, + meaningless_token_kinds: EnumSet, + step_limit: u32, +} + +impl<'src, SyntaxKind: SyntaxElement> ParserBuilder<'src, SyntaxKind> { + pub fn new(raw_toks: Vec<(SyntaxKind, &'src str)>) -> Self { + Self { + raw_toks, + meaningless_token_kinds: EnumSet::new(), + step_limit: 4096, + } + } + + /// Sets the parser step limit. + /// Defaults to 4096 + pub fn step_limit(mut self, new: u32) -> Self { + self.step_limit = new; + self + } + + pub fn add_meaningless(mut self, kind: SyntaxKind) -> Self { + self.meaningless_token_kinds.insert(kind); + self + } + + pub fn add_meaningless_many(mut self, kind: Vec) -> Self { + self.meaningless_token_kinds + .insert_all(kind.into_iter().collect()); + self + } + + pub fn build(self) -> Parser<'src, SyntaxKind, SyntaxErr> { + let Self { + raw_toks, + meaningless_token_kinds, + step_limit, + } = self; + Parser { + input: Input::new(raw_toks, Some(meaningless_token_kinds)), + pos: 0, + events: Vec::new(), + step_limit, + steps: Cell::new(0), + } + } +} diff --git a/crates/pawarser/src/parser/error.rs b/crates/pawarser/src/parser/error.rs new file mode 100644 index 0000000..9c9d893 --- /dev/null +++ b/crates/pawarser/src/parser/error.rs @@ -0,0 +1,9 @@ +use std::fmt; + +/// A marker trait... for now! +// TODO: constrain that conversion to `NodeKind::Error` is enforced to be possible +pub trait SyntaxError +where + Self: fmt::Debug + Clone + PartialEq + Eq, +{ +} diff --git a/crates/pawarser/src/parser/event.rs b/crates/pawarser/src/parser/event.rs new file mode 100644 index 0000000..1b71d8e --- /dev/null +++ b/crates/pawarser/src/parser/event.rs @@ -0,0 +1,42 @@ +use enumset::EnumSetType; + +use super::{error::SyntaxError, SyntaxElement}; + +pub enum Event { + Start { + kind: NodeKind, + forward_parent: Option, + }, + Finish, + Eat { + count: usize, + }, +} + +impl Event { + pub fn tombstone() -> Self { + Self::Start { + kind: NodeKind::Tombstone, + forward_parent: None, + } + } +} + +#[derive(Clone, PartialEq, Eq)] +pub enum NodeKind { + Tombstone, + Syntax(SyntaxKind), + Error(SyntaxErr), +} + +impl NodeKind { + pub fn is_tombstone(&self) -> bool { + matches!(self, Self::Tombstone) + } + pub fn is_syntax(&self) -> bool { + matches!(self, Self::Syntax(_)) + } + pub fn is_error(&self) -> bool { + matches!(self, Self::Error(_)) + } +} diff --git a/crates/pawarser/src/parser/input.rs b/crates/pawarser/src/parser/input.rs new file mode 100644 index 0000000..d7e14b3 --- /dev/null +++ b/crates/pawarser/src/parser/input.rs @@ -0,0 +1,67 @@ +use enumset::{EnumSet, EnumSetType}; + +use super::SyntaxElement; + +pub struct Input<'src, SyntaxKind: SyntaxElement> { + raw: Vec<(SyntaxKind, &'src str)>, + // enumset of meaningless tokens + semantically_meaningless: EnumSet, + // indices of non-meaningless tokens + meaningful_toks: Vec, +} + +impl<'src, SyntaxKind: SyntaxElement> Input<'src, SyntaxKind> { + pub fn new( + raw_toks: Vec<(SyntaxKind, &'src str)>, + meaningless: Option>, + ) -> Self { + let mut meaningful_toks = Vec::new(); + + if let Some(meaningless) = meaningless { + let meaningful_toks = raw_toks + .iter() + .enumerate() + .filter_map(|(i, tok)| (!meaningless.contains(tok.0)).then_some(i)) + .collect_into(&mut meaningful_toks); + } + + Self { + raw: raw_toks, + semantically_meaningless: meaningless.unwrap_or_default(), + meaningful_toks, + } + } + + pub fn kind(&self, idx: usize) -> SyntaxKind { + let Some(meaningful_idx) = self.meaningful_toks.get(idx) else { + return SyntaxKind::SYNTAX_EOF; + }; + + self.raw.get(*meaningful_idx).unwrap().0 + } + + pub fn preceding_meaningless(&self, idx: usize) -> usize { + assert!(self.meaningful_toks.len() > idx); + + if idx == 0 { + // maybe should be `self.meaningful_toks[idx]` instead?? + 1 + } else { + self.meaningful_toks[idx] - self.meaningful_toks[idx - 1] + } + } + + /// get the count of meaningless tokens at the end of the file. + pub fn meaningless_tail_len(&self) -> usize { + self.raw.len() - (self.meaningful_toks.last().unwrap() + 1) + } + + pub fn dissolve(self) -> (Vec<(SyntaxKind, &'src str)>, EnumSet) { + let Self { + raw, + semantically_meaningless, + .. + } = self; + (raw, semantically_meaningless) + } +} diff --git a/crates/pawarser/src/parser/marker.rs b/crates/pawarser/src/parser/marker.rs new file mode 100644 index 0000000..2e1244d --- /dev/null +++ b/crates/pawarser/src/parser/marker.rs @@ -0,0 +1,97 @@ +use drop_bomb::DropBomb; +use rowan::SyntaxKind; + +use super::{ + error::SyntaxError, + event::{Event, NodeKind}, + Parser, SyntaxElement, +}; + +pub struct Marker { + pos: usize, + bomb: DropBomb, +} + +impl Marker { + pub(super) fn new(pos: usize, name: &str) -> Self { + Self { + pos, + bomb: DropBomb::new(format!("Marker {name} must be completed or abandoned.")), + } + } + + fn close_node( + mut self, + p: &mut Parser, + kind: NodeKind, + ) -> CompletedMarker { + self.bomb.defuse(); + + match &mut p.events[self.pos] { + Event::Start { kind: slot, .. } => *slot = kind.clone(), + _ => unreachable!(), + } + + p.push_ev(Event::Finish); + CompletedMarker { + pos: self.pos, + kind, + } + } + + pub fn complete( + self, + p: &mut Parser, + kind: SyntaxKind, + ) -> CompletedMarker { + self.close_node(p, NodeKind::Syntax(kind)) + } + + pub fn error( + self, + p: &mut Parser, + kind: SyntaxErr, + ) -> CompletedMarker { + self.close_node(p, NodeKind::Error(kind)) + } + + pub fn abandon( + mut self, + p: &mut Parser, + ) { + self.bomb.defuse(); + + // clean up empty tombstone event from marker + if self.pos == p.events.len() - 1 { + match p.events.pop() { + Some(Event::Start { + kind: NodeKind::Tombstone, + forward_parent: None, + }) => (), + _ => unreachable!(), + } + } + } +} + +pub struct CompletedMarker { + pos: usize, + kind: NodeKind, +} + +impl CompletedMarker { + pub fn precede(self, p: &mut Parser, name: &str) -> Marker { + let new_pos = p.start(name); + + match &mut p.events[self.pos] { + Event::Start { forward_parent, .. } => { + // point forward parent of the node this marker completed to the new node + // will later be used to make the new node a parent of the current node. + *forward_parent = Some(new_pos.pos - self.pos) + } + _ => unreachable!(), + } + + new_pos + } +} diff --git a/crates/pawarser/src/parser/output.rs b/crates/pawarser/src/parser/output.rs new file mode 100644 index 0000000..76c3cf7 --- /dev/null +++ b/crates/pawarser/src/parser/output.rs @@ -0,0 +1,73 @@ +use std::{fmt, marker::PhantomData}; + +use rowan::{GreenNode, GreenNodeData, GreenTokenData, NodeOrToken}; + +use crate::{SyntaxElement, SyntaxError}; + +pub struct ParserOutput { + pub green_node: GreenNode, + pub errors: Vec, + pub(super) _syntax_kind: PhantomData, +} + +impl std::fmt::Debug + for ParserOutput +{ + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + let mut errs: Vec<&SyntaxErr> = self.errors.iter().collect(); + errs.reverse(); + debug_print_output::( + NodeOrToken::Node(&self.green_node), + f, + 0, + &mut errs, + ) + } +} + +fn debug_print_output( + node: NodeOrToken<&GreenNodeData, &GreenTokenData>, + f: &mut std::fmt::Formatter<'_>, + lvl: i32, + errs: &mut Vec<&SyntaxErr>, +) -> std::fmt::Result { + if f.alternate() { + for _ in 0..lvl { + f.write_str(" ")?; + } + } + let maybe_newline = if f.alternate() { "\n" } else { " " }; + + match node { + NodeOrToken::Node(n) => { + let kind: SyntaxKind = node.kind().into(); + if kind != SyntaxKind::SYNTAX_ERROR { + write!(f, "{:?} {{{maybe_newline}", kind)?; + } else { + let err = errs + .pop() + .expect("all error syntax nodes should correspond to an error"); + + write!(f, "{:?}: {err:?} {{{maybe_newline}", kind)?; + } + for c in n.children() { + debug_print_output::(c, f, lvl + 1, errs)?; + } + + if f.alternate() { + for _ in 0..lvl { + f.write_str(" ")?; + } + } + write!(f, "}}{maybe_newline}") + } + NodeOrToken::Token(t) => { + write!( + f, + "{:?} {:?};{maybe_newline}", + Into::::into(t.kind()), + t.text() + ) + } + } +} diff --git a/crates/prowocessing/Cargo.toml b/crates/prowocessing/Cargo.toml new file mode 100644 index 0000000..42d1a80 --- /dev/null +++ b/crates/prowocessing/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "prowocessing" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +image = "0.24.8" +palette = "0.7.4" + +[lints] +workspace = true diff --git a/crates/prowocessing/src/experimental.rs b/crates/prowocessing/src/experimental.rs new file mode 100644 index 0000000..1a0f7e3 --- /dev/null +++ b/crates/prowocessing/src/experimental.rs @@ -0,0 +1,2 @@ +pub mod enum_based; +pub mod trait_based; diff --git a/crates/prowocessing/src/experimental/enum_based.rs b/crates/prowocessing/src/experimental/enum_based.rs new file mode 100644 index 0000000..c60f4a9 --- /dev/null +++ b/crates/prowocessing/src/experimental/enum_based.rs @@ -0,0 +1,64 @@ +pub enum Instruction { + Uppercase, + Lowercase, +} + +pub struct Pipeline { + pipeline: Vec String>, +} + +impl Pipeline { + pub fn run(&self, val: String) -> String { + let mut current = val; + + for instr in &self.pipeline { + current = instr(current); + } + + current + } +} + +pub struct PipelineBuilder { + pipeline: Vec, +} + +impl PipelineBuilder { + pub fn new() -> Self { + Self { + pipeline: Vec::new(), + } + } + + #[must_use] + pub fn insert(mut self, instr: Instruction) -> Self { + self.pipeline.push(instr); + self + } + + pub fn build(&self) -> Pipeline { + fn uppercase(v: String) -> String { + str::to_uppercase(&v) + } + fn lowercase(v: String) -> String { + str::to_lowercase(&v) + } + + let mut res = Vec::new(); + + for item in &self.pipeline { + res.push(match item { + Instruction::Uppercase => uppercase, + Instruction::Lowercase => lowercase, + }); + } + + Pipeline { pipeline: res } + } +} + +impl Default for PipelineBuilder { + fn default() -> Self { + Self::new() + } +} diff --git a/crates/prowocessing/src/experimental/trait_based.rs b/crates/prowocessing/src/experimental/trait_based.rs new file mode 100644 index 0000000..251fb35 --- /dev/null +++ b/crates/prowocessing/src/experimental/trait_based.rs @@ -0,0 +1,11 @@ +//! An experiment for a hyper-modular trait-based architecture. +//! +//! Patterns defining this (or well, which I reference a lot while writing this): +//! - [Command pattern using trait objects](https://rust-unofficial.github.io/patterns/patterns/behavioural/command.html) +//! - [Builder pattern](https://rust-unofficial.github.io/patterns/patterns/creational/builder.html) + +pub mod data; +#[macro_use] +pub mod element; +pub mod ops; +pub mod pipeline; diff --git a/crates/prowocessing/src/experimental/trait_based/data.rs b/crates/prowocessing/src/experimental/trait_based/data.rs new file mode 100644 index 0000000..e3dd671 --- /dev/null +++ b/crates/prowocessing/src/experimental/trait_based/data.rs @@ -0,0 +1,5 @@ +//! Definitions of the data transfer and storage types. + +pub mod io; + +pub mod raw; diff --git a/crates/prowocessing/src/experimental/trait_based/data/io.rs b/crates/prowocessing/src/experimental/trait_based/data/io.rs new file mode 100644 index 0000000..4eb9bd3 --- /dev/null +++ b/crates/prowocessing/src/experimental/trait_based/data/io.rs @@ -0,0 +1,53 @@ +//! Types for element and pipeline IO + +use std::{borrow::ToOwned, convert::Into}; + +use super::raw::Data; + +/// Newtype struct with borrowed types for pipeline/element inputs, so that doesn't force a move or clone +#[derive(PartialEq, Eq, Debug)] +pub struct Inputs<'a>(pub Vec<&'a Data>); + +impl<'a> From> for Inputs<'a> { + fn from(value: Vec<&'a Data>) -> Self { + Self(value) + } +} + +impl<'a, T: Into<&'a Data>> From for Inputs<'a> { + fn from(value: T) -> Self { + Self(vec![value.into()]) + } +} + +impl<'a> From<&'a Outputs> for Inputs<'a> { + fn from(value: &'a Outputs) -> Self { + Self(value.0.iter().map(Into::into).collect()) + } +} + +/// Used for pipeline/element outputs +#[derive(PartialEq, Eq, Debug)] +pub struct Outputs(pub Vec); + +impl Outputs { + /// consume self and return inner value(s) + pub fn into_inner(self) -> Vec { + self.0 + } +} +impl From> for Outputs { + fn from(value: Vec) -> Self { + Self(value) + } +} +impl> From for Outputs { + fn from(value: T) -> Self { + Self(vec![value.into()]) + } +} +impl From> for Outputs { + fn from(value: Inputs) -> Self { + Self(value.0.into_iter().map(ToOwned::to_owned).collect()) + } +} diff --git a/crates/prowocessing/src/experimental/trait_based/data/raw.rs b/crates/prowocessing/src/experimental/trait_based/data/raw.rs new file mode 100644 index 0000000..6640e64 --- /dev/null +++ b/crates/prowocessing/src/experimental/trait_based/data/raw.rs @@ -0,0 +1,20 @@ +//! Dynamic data storage and transfer types for use in [`io`] + +// Dynamic data type +#[derive(Clone, Debug, PartialEq, Eq)] +pub enum Data { + String(String), + Int(i32), +} + +impl From for Data { + fn from(value: String) -> Self { + Self::String(value) + } +} + +impl From for Data { + fn from(value: i32) -> Self { + Self::Int(value) + } +} diff --git a/crates/prowocessing/src/experimental/trait_based/element.rs b/crates/prowocessing/src/experimental/trait_based/element.rs new file mode 100644 index 0000000..b07c739 --- /dev/null +++ b/crates/prowocessing/src/experimental/trait_based/element.rs @@ -0,0 +1,29 @@ +//! The trait and type representations + +use std::any::TypeId; + +use crate::experimental::trait_based::data::io::Inputs; + +use super::data::io::Outputs; + +pub(crate) trait PipelineElement { + /// return a static runner function pointer to avoid dynamic dispatch during pipeline execution - Types MUST match the signature + fn runner(&self) -> fn(&Inputs) -> Outputs; + /// return the signature of the element + fn signature(&self) -> ElementSignature; +} + +/// Type signature for an element used for static checking +pub(crate) struct ElementSignature { + pub inputs: Vec, + pub outputs: Vec, +} + +macro_rules! signature { + ($($inputs:ty),+ => $($outputs:ty),+) => ( + ElementSignature { + inputs: vec![$(std::any::TypeId::of::<$inputs>(), )+], + outputs: vec![$(std::any::TypeId::of::<$outputs>(), )+] + } + ) +} diff --git a/crates/prowocessing/src/experimental/trait_based/ops.rs b/crates/prowocessing/src/experimental/trait_based/ops.rs new file mode 100644 index 0000000..e7c9d04 --- /dev/null +++ b/crates/prowocessing/src/experimental/trait_based/ops.rs @@ -0,0 +1,7 @@ +mod num; +mod str; + +pub mod prelude { + pub(crate) use super::num::*; + pub(crate) use super::str::*; +} diff --git a/crates/prowocessing/src/experimental/trait_based/ops/num.rs b/crates/prowocessing/src/experimental/trait_based/ops/num.rs new file mode 100644 index 0000000..ea189bf --- /dev/null +++ b/crates/prowocessing/src/experimental/trait_based/ops/num.rs @@ -0,0 +1,62 @@ +//! Operations on numeric data +use core::panic; +use std::any::TypeId; + +use crate::experimental::trait_based::{ + data::{ + io::{Inputs, Outputs}, + raw::Data, + }, + element::{ElementSignature, PipelineElement}, +}; + +/// Addition +pub struct Add(pub i32); +impl PipelineElement for Add { + fn runner(&self) -> fn(&Inputs) -> Outputs { + |input| { + let [Data::Int(i0), Data::Int(i1), ..] = input.0[..] else { + panic!("Invalid data passed") + }; + (i0 + i1).into() + } + } + + fn signature(&self) -> ElementSignature { + signature!(i32, i32 => i32) + } +} + +/// Subtraction +pub struct Subtract(pub i32); +impl PipelineElement for Subtract { + fn runner(&self) -> fn(&Inputs) -> Outputs { + |input| { + let [Data::Int(i0), Data::Int(i1), ..] = input.0[..] else { + panic!("Invalid data passed") + }; + (i0 + i1).into() + } + } + + fn signature(&self) -> ElementSignature { + signature!(i32, i32 => i32) + } +} + +/// Turn input to string +pub struct Stringify; +impl PipelineElement for Stringify { + fn runner(&self) -> fn(&Inputs) -> Outputs { + |input| { + let [Data::Int(int), ..] = input.0[..] else { + panic!("Invalid data passed") + }; + int.to_string().into() + } + } + + fn signature(&self) -> ElementSignature { + signature!(i32 => String) + } +} diff --git a/crates/prowocessing/src/experimental/trait_based/ops/str.rs b/crates/prowocessing/src/experimental/trait_based/ops/str.rs new file mode 100644 index 0000000..fb59ada --- /dev/null +++ b/crates/prowocessing/src/experimental/trait_based/ops/str.rs @@ -0,0 +1,59 @@ +//! Operation on String/text data +use crate::experimental::trait_based::{ + data::{ + io::{Inputs, Outputs}, + raw::Data, + }, + element::{ElementSignature, PipelineElement}, +}; + +/// Concatenate the inputs +pub struct Concatenate(pub String); +impl PipelineElement for Concatenate { + fn runner(&self) -> fn(&Inputs) -> Outputs { + |input| { + let [Data::String(s0), Data::String(s1), ..] = input.0[..] else { + panic!("Invalid data passed") + }; + format!("{s0}{s1}").into() + } + } + + fn signature(&self) -> ElementSignature { + signature!(String, String => String) + } +} + +/// Turn input text to uppercase +pub struct Upper; +impl PipelineElement for Upper { + fn runner(&self) -> fn(&Inputs) -> Outputs { + |input| { + let [Data::String(s), ..] = input.0[..] else { + panic!("Invalid data passed") + }; + s.to_uppercase().into() + } + } + + fn signature(&self) -> ElementSignature { + signature!(String => String) + } +} + +/// Turn input text to lowercase +pub struct Lower; +impl PipelineElement for Lower { + fn runner(&self) -> fn(&Inputs) -> Outputs { + |input| { + let [Data::String(s), ..] = input.0[..] else { + panic!("Invalid data passed") + }; + s.to_lowercase().into() + } + } + + fn signature(&self) -> ElementSignature { + signature!(String => String) + } +} diff --git a/crates/prowocessing/src/experimental/trait_based/pipeline.rs b/crates/prowocessing/src/experimental/trait_based/pipeline.rs new file mode 100644 index 0000000..715fda7 --- /dev/null +++ b/crates/prowocessing/src/experimental/trait_based/pipeline.rs @@ -0,0 +1,107 @@ +use super::data::io::{Inputs, Outputs}; +use super::element::PipelineElement; +use super::ops::prelude::*; + +/// Builder for the pipelines that are actually run +/// +/// TODO: +/// - Bind additional inputs if instruction has more then one and is passd without any additional +/// - allow binding to pointers to other pipelines? +/// - allow referencing earlier data +pub struct PipelineBuilder { + elements: Vec>, +} + +impl PipelineBuilder { + /// Create new, empty builder + pub fn new() -> Self { + Self { + elements: Vec::new(), + } + } + + /// Insert element into pipeline + fn insert(mut self, el: T) -> Self { + if let Some(previous_item) = self.elements.last() { + assert_eq!( + previous_item.signature().outputs[0], + el.signature().inputs[0] + ); + } + self.elements.push(Box::new(el)); + self + } + + /// insert string concatenattion element + #[must_use] + pub fn concatenate(self, sec: String) -> Self { + self.insert(Concatenate(sec)) + } + + /// insert string uppercase element + #[must_use] + pub fn upper(self) -> Self { + self.insert(Upper) + } + + /// insert string lowercase element + #[must_use] + pub fn lower(self) -> Self { + self.insert(Lower) + } + + /// insert numeric addition element + #[must_use] + #[allow( + clippy::should_implement_trait, + reason = "is not equivalent to addition" + )] + pub fn add(self, sec: i32) -> Self { + self.insert(Add(sec)) + } + + /// insert numeric subtraction element + #[must_use] + pub fn subtract(self, sec: i32) -> Self { + self.insert(Subtract(sec)) + } + + /// insert stringify element + #[must_use] + pub fn stringify(self) -> Self { + self.insert(Stringify) + } + + /// Build the pipeline. Doesn't check again - `insert` should verify correctness. + pub fn build(&self) -> Pipeline { + let mut r = Vec::new(); + + self.elements.iter().for_each(|el| r.push(el.runner())); + + Pipeline { runners: r } + } +} + +impl Default for PipelineBuilder { + fn default() -> Self { + Self::new() + } +} + +/// Runnable pipeline - at the core of this library +pub struct Pipeline { + runners: Vec Outputs>, +} + +impl Pipeline { + /// run the pipeline + pub fn run(&self, inputs: Inputs) -> Outputs { + let mut out: Outputs = inputs.into(); + + for runner in &self.runners { + out = runner(&(&out).into()); + } + + out + } +} diff --git a/crates/prowocessing/src/lib.rs b/crates/prowocessing/src/lib.rs new file mode 100644 index 0000000..083eb4f --- /dev/null +++ b/crates/prowocessing/src/lib.rs @@ -0,0 +1,40 @@ +//! # This is the image processing library for iOwO +//! +//! One of the design goals for this library is, however, to be a simple, generic image processing library. +//! For now, it's just indev... lets see what comes of it! +#![feature(lint_reasons)] + +/// just some experiments, to test whether the architecture i want is even possible (or how to do it). probably temporary. +/// Gonna first try string processing... +pub mod experimental; + +#[cfg(test)] +mod tests { + use crate::experimental::{ + enum_based, + trait_based::{self, data::io::Outputs}, + }; + + #[test] + fn test_enums() { + let builder = enum_based::PipelineBuilder::new().insert(enum_based::Instruction::Uppercase); + let upr = builder.build(); + let upr_lowr = builder.insert(enum_based::Instruction::Lowercase).build(); + + assert_eq!(upr.run(String::from("Test")), String::from("TEST")); + assert_eq!(upr_lowr.run(String::from("Test")), String::from("test")); + } + + #[test] + fn add() { + let pipe = trait_based::pipeline::PipelineBuilder::new() + .add(0) + .stringify() + .build(); + + assert_eq!( + pipe.run(vec![&2.into(), &3.into()].into()), + Outputs(vec![String::from("5").into()]) + ); + } +} diff --git a/flake.lock b/flake.lock index 9719001..0d61b34 100644 --- a/flake.lock +++ b/flake.lock @@ -3,12 +3,54 @@ "cachix": { "inputs": { "devenv": "devenv_2", - "flake-compat": "flake-compat_2", + "flake-compat": [ + "devenv", + "flake-compat" + ], + "git-hooks": [ + "devenv", + "pre-commit-hooks" + ], "nixpkgs": [ "devenv", "nixpkgs" + ] + }, + "locked": { + "lastModified": 1726520618, + "narHash": "sha256-jOsaBmJ/EtX5t/vbylCdS7pWYcKGmWOKg4QKUzKr6dA=", + "owner": "cachix", + "repo": "cachix", + "rev": "695525f9086542dfb09fde0871dbf4174abbf634", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "cachix", + "type": "github" + } + }, + "cachix_2": { + "inputs": { + "devenv": "devenv_3", + "flake-compat": [ + "devenv", + "cachix", + "devenv", + "flake-compat" ], - "pre-commit-hooks": "pre-commit-hooks" + "nixpkgs": [ + "devenv", + "cachix", + "devenv", + "nixpkgs" + ], + "pre-commit-hooks": [ + "devenv", + "cachix", + "devenv", + "pre-commit-hooks" + ] }, "locked": { "lastModified": 1712055811, @@ -27,17 +69,17 @@ "devenv": { "inputs": { "cachix": "cachix", - "flake-compat": "flake-compat_4", - "nix": "nix_2", - "nixpkgs": "nixpkgs_2", + "flake-compat": "flake-compat_2", + "nix": "nix_3", + "nixpkgs": "nixpkgs_3", "pre-commit-hooks": "pre-commit-hooks_2" }, "locked": { - "lastModified": 1712925466, - "narHash": "sha256-MJ6VxGNu/ftbn8SErJjBz80FUNXkZfcObHg/JP7wwAc=", + "lastModified": 1729445229, + "narHash": "sha256-3vhSEs2ufSvv2Oct8G9CWEPFI57c4NAZ2wR2accHELM=", "owner": "cachix", "repo": "devenv", - "rev": "1af93652caf48bfeef6ba7d1cf59fc66e506e5c2", + "rev": "006016cf4191c34c17cfdb6669e0690e24302ac0", "type": "github" }, "original": { @@ -48,15 +90,53 @@ }, "devenv_2": { "inputs": { + "cachix": "cachix_2", "flake-compat": [ "devenv", "cachix", "flake-compat" ], + "nix": "nix_2", + "nixpkgs": [ + "devenv", + "cachix", + "nixpkgs" + ], + "pre-commit-hooks": [ + "devenv", + "cachix", + "git-hooks" + ] + }, + "locked": { + "lastModified": 1723156315, + "narHash": "sha256-0JrfahRMJ37Rf1i0iOOn+8Z4CLvbcGNwa2ChOAVrp/8=", + "owner": "cachix", + "repo": "devenv", + "rev": "ff5eb4f2accbcda963af67f1a1159e3f6c7f5f91", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "devenv", + "type": "github" + } + }, + "devenv_3": { + "inputs": { + "flake-compat": [ + "devenv", + "cachix", + "devenv", + "cachix", + "flake-compat" + ], "nix": "nix", "nixpkgs": "nixpkgs", "poetry2nix": "poetry2nix", "pre-commit-hooks": [ + "devenv", + "cachix", "devenv", "cachix", "pre-commit-hooks" @@ -79,15 +159,15 @@ }, "fenix": { "inputs": { - "nixpkgs": "nixpkgs_3", + "nixpkgs": "nixpkgs_4", "rust-analyzer-src": "rust-analyzer-src" }, "locked": { - "lastModified": 1712903033, - "narHash": "sha256-KcvsEm0h1mIwBHFAzWFBjGihnbf2fxpAaXOdVbUfAI4=", + "lastModified": 1729492502, + "narHash": "sha256-d6L4bBlUWr4sHC+eRXo+4acFPEFXKmqHpM/BfQ5gQQw=", "owner": "nix-community", "repo": "fenix", - "rev": "c739f83545e625227f4d0af7fe2a71e69931fa4c", + "rev": "4002a1ec3486b855f341d2b864ba06b61e73af28", "type": "github" }, "original": { @@ -128,51 +208,25 @@ "type": "github" } }, - "flake-compat_3": { - "flake": false, + "flake-parts": { + "inputs": { + "nixpkgs-lib": [ + "devenv", + "nix", + "nixpkgs" + ] + }, "locked": { - "lastModified": 1696426674, - "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", - "owner": "edolstra", - "repo": "flake-compat", - "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", + "lastModified": 1712014858, + "narHash": "sha256-sB4SWl2lX95bExY2gMFG5HIzvva5AVMJd4Igm+GpZNw=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "9126214d0a59633752a136528f5f3b9aa8565b7d", "type": "github" }, "original": { - "owner": "edolstra", - "repo": "flake-compat", - "type": "github" - } - }, - "flake-compat_4": { - "flake": false, - "locked": { - "lastModified": 1696426674, - "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=", - "owner": "edolstra", - "repo": "flake-compat", - "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", - "type": "github" - }, - "original": { - "owner": "edolstra", - "repo": "flake-compat", - "type": "github" - } - }, - "flake-compat_5": { - "flake": false, - "locked": { - "lastModified": 1673956053, - "narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=", - "owner": "edolstra", - "repo": "flake-compat", - "rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9", - "type": "github" - }, - "original": { - "owner": "edolstra", - "repo": "flake-compat", + "owner": "hercules-ci", + "repo": "flake-parts", "type": "github" } }, @@ -195,33 +249,12 @@ } }, "flake-utils_2": { - "inputs": { - "systems": "systems_2" - }, "locked": { - "lastModified": 1701680307, - "narHash": "sha256-kAuep2h5ajznlPMD9rnQyffWG8EM/C73lejGofXvdM8=", + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", "owner": "numtide", "repo": "flake-utils", - "rev": "4022d587cbbfd70fe950c1e2083a02621806a725", - "type": "github" - }, - "original": { - "owner": "numtide", - "repo": "flake-utils", - "type": "github" - } - }, - "flake-utils_3": { - "inputs": { - "systems": "systems_3" - }, - "locked": { - "lastModified": 1710146030, - "narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", "type": "github" }, "original": { @@ -231,29 +264,6 @@ } }, "gitignore": { - "inputs": { - "nixpkgs": [ - "devenv", - "cachix", - "pre-commit-hooks", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1703887061, - "narHash": "sha256-gGPa9qWNc6eCXT/+Z5/zMkyYOuRZqeFZBDbopNZQkuY=", - "owner": "hercules-ci", - "repo": "gitignore.nix", - "rev": "43e1aa1308018f37118e34d3a9cb4f5e75dc11d5", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "gitignore.nix", - "type": "github" - } - }, - "gitignore_2": { "inputs": { "nixpkgs": [ "devenv", @@ -275,10 +285,28 @@ "type": "github" } }, + "libgit2": { + "flake": false, + "locked": { + "lastModified": 1697646580, + "narHash": "sha256-oX4Z3S9WtJlwvj0uH9HlYcWv+x1hqp8mhXl7HsLu2f0=", + "owner": "libgit2", + "repo": "libgit2", + "rev": "45fd9ed7ae1a9b74b957ef4f337bc3c8b3df01b5", + "type": "github" + }, + "original": { + "owner": "libgit2", + "repo": "libgit2", + "type": "github" + } + }, "nix": { "inputs": { "flake-compat": "flake-compat", "nixpkgs": [ + "devenv", + "cachix", "devenv", "cachix", "devenv", @@ -287,11 +315,11 @@ "nixpkgs-regression": "nixpkgs-regression" }, "locked": { - "lastModified": 1708577783, - "narHash": "sha256-92xq7eXlxIT5zFNccLpjiP7sdQqQI30Gyui2p/PfKZM=", + "lastModified": 1712911606, + "narHash": "sha256-BGvBhepCufsjcUkXnEEXhEVjwdJAwPglCC2+bInc794=", "owner": "domenkozar", "repo": "nix", - "rev": "ecd0af0c1f56de32cbad14daa1d82a132bf298f8", + "rev": "b24a9318ea3f3600c1e24b4a00691ee912d4de12", "type": "github" }, "original": { @@ -304,6 +332,8 @@ "nix-github-actions": { "inputs": { "nixpkgs": [ + "devenv", + "cachix", "devenv", "cachix", "devenv", @@ -327,8 +357,15 @@ }, "nix_2": { "inputs": { - "flake-compat": "flake-compat_5", + "flake-compat": [ + "devenv", + "cachix", + "devenv", + "flake-compat" + ], "nixpkgs": [ + "devenv", + "cachix", "devenv", "nixpkgs" ], @@ -349,6 +386,34 @@ "type": "github" } }, + "nix_3": { + "inputs": { + "flake-compat": [ + "devenv", + "flake-compat" + ], + "flake-parts": "flake-parts", + "libgit2": "libgit2", + "nixpkgs": "nixpkgs_2", + "nixpkgs-23-11": "nixpkgs-23-11", + "nixpkgs-regression": "nixpkgs-regression_3", + "pre-commit-hooks": "pre-commit-hooks" + }, + "locked": { + "lastModified": 1727438425, + "narHash": "sha256-X8ES7I1cfNhR9oKp06F6ir4Np70WGZU5sfCOuNBEwMg=", + "owner": "domenkozar", + "repo": "nix", + "rev": "f6c5ae4c1b2e411e6b1e6a8181cc84363d6a7546", + "type": "github" + }, + "original": { + "owner": "domenkozar", + "ref": "devenv-2.24", + "repo": "nix", + "type": "github" + } + }, "nixpkgs": { "locked": { "lastModified": 1692808169, @@ -365,6 +430,22 @@ "type": "github" } }, + "nixpkgs-23-11": { + "locked": { + "lastModified": 1717159533, + "narHash": "sha256-oamiKNfr2MS6yH64rUn99mIZjc45nGJlj9eGth/3Xuw=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "a62e6edd6d5e1fa0329b8653c801147986f8d446", + "type": "github" + }, + "original": { + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "a62e6edd6d5e1fa0329b8653c801147986f8d446", + "type": "github" + } + }, "nixpkgs-regression": { "locked": { "lastModified": 1643052045, @@ -397,45 +478,61 @@ "type": "github" } }, - "nixpkgs-stable": { + "nixpkgs-regression_3": { "locked": { - "lastModified": 1704874635, - "narHash": "sha256-YWuCrtsty5vVZvu+7BchAxmcYzTMfolSPP5io8+WYCg=", + "lastModified": 1643052045, + "narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "3dc440faeee9e889fe2d1b4d25ad0f430d449356", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixos-23.11", "repo": "nixpkgs", + "rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2", "type": "github" } }, - "nixpkgs-stable_2": { + "nixpkgs-stable": { "locked": { - "lastModified": 1710695816, - "narHash": "sha256-3Eh7fhEID17pv9ZxrPwCLfqXnYP006RKzSs0JptsN84=", + "lastModified": 1720386169, + "narHash": "sha256-NGKVY4PjzwAa4upkGtAMz1npHGoRzWotlSnVlqI40mo=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "614b4613980a522ba49f0d194531beddbb7220d3", + "rev": "194846768975b7ad2c4988bdb82572c00222c0d7", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixos-23.11", + "ref": "nixos-24.05", "repo": "nixpkgs", "type": "github" } }, "nixpkgs_2": { "locked": { - "lastModified": 1710796454, - "narHash": "sha256-lQlICw60RhH8sHTDD/tJiiJrlAfNn8FDI9c+7G2F0SE=", + "lastModified": 1717432640, + "narHash": "sha256-+f9c4/ZX5MWDOuB1rKoWj+lBNm0z0rs4CK47HBLxy1o=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "88269ab3044128b7c2f4c7d68448b2fb50456870", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "release-24.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_3": { + "locked": { + "lastModified": 1716977621, + "narHash": "sha256-Q1UQzYcMJH4RscmpTkjlgqQDX5yi1tZL0O345Ri6vXQ=", "owner": "cachix", "repo": "devenv-nixpkgs", - "rev": "06fb0f1c643aee3ae6838dda3b37ef0abc3c763b", + "rev": "4267e705586473d3e5c8d50299e71503f16a6fb6", "type": "github" }, "original": { @@ -445,13 +542,13 @@ "type": "github" } }, - "nixpkgs_3": { + "nixpkgs_4": { "locked": { - "lastModified": 1712791164, - "narHash": "sha256-3sbWO1mbpWsLepZGbWaMovSO7ndZeFqDSdX0hZ9nVyw=", + "lastModified": 1729256560, + "narHash": "sha256-/uilDXvCIEs3C9l73JTACm4quuHUsIHcns1c+cHUJwA=", "owner": "nixos", "repo": "nixpkgs", - "rev": "1042fd8b148a9105f3c0aca3a6177fd1d9360ba5", + "rev": "4c2fcb090b1f3e5b47eaa7bd33913b574a11e0a0", "type": "github" }, "original": { @@ -461,13 +558,13 @@ "type": "github" } }, - "nixpkgs_4": { + "nixpkgs_5": { "locked": { - "lastModified": 1712791164, - "narHash": "sha256-3sbWO1mbpWsLepZGbWaMovSO7ndZeFqDSdX0hZ9nVyw=", + "lastModified": 1729256560, + "narHash": "sha256-/uilDXvCIEs3C9l73JTACm4quuHUsIHcns1c+cHUJwA=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "1042fd8b148a9105f3c0aca3a6177fd1d9360ba5", + "rev": "4c2fcb090b1f3e5b47eaa7bd33913b574a11e0a0", "type": "github" }, "original": { @@ -482,6 +579,8 @@ "flake-utils": "flake-utils", "nix-github-actions": "nix-github-actions", "nixpkgs": [ + "devenv", + "cachix", "devenv", "cachix", "devenv", @@ -503,44 +602,26 @@ } }, "pre-commit-hooks": { - "inputs": { - "flake-compat": "flake-compat_3", - "flake-utils": "flake-utils_2", - "gitignore": "gitignore", - "nixpkgs": [ - "devenv", - "cachix", - "nixpkgs" - ], - "nixpkgs-stable": "nixpkgs-stable" - }, - "locked": { - "lastModified": 1708018599, - "narHash": "sha256-M+Ng6+SePmA8g06CmUZWi1AjG2tFBX9WCXElBHEKnyM=", - "owner": "cachix", - "repo": "pre-commit-hooks.nix", - "rev": "5df5a70ad7575f6601d91f0efec95dd9bc619431", - "type": "github" - }, - "original": { - "owner": "cachix", - "repo": "pre-commit-hooks.nix", - "type": "github" - } - }, - "pre-commit-hooks_2": { "inputs": { "flake-compat": [ "devenv", - "flake-compat" + "nix" + ], + "flake-utils": "flake-utils_2", + "gitignore": [ + "devenv", + "nix" ], - "flake-utils": "flake-utils_3", - "gitignore": "gitignore_2", "nixpkgs": [ "devenv", + "nix", "nixpkgs" ], - "nixpkgs-stable": "nixpkgs-stable_2" + "nixpkgs-stable": [ + "devenv", + "nix", + "nixpkgs" + ] }, "locked": { "lastModified": 1712897695, @@ -556,22 +637,49 @@ "type": "github" } }, + "pre-commit-hooks_2": { + "inputs": { + "flake-compat": [ + "devenv", + "flake-compat" + ], + "gitignore": "gitignore", + "nixpkgs": [ + "devenv", + "nixpkgs" + ], + "nixpkgs-stable": "nixpkgs-stable" + }, + "locked": { + "lastModified": 1726745158, + "narHash": "sha256-D5AegvGoEjt4rkKedmxlSEmC+nNLMBPWFxvmYnVLhjk=", + "owner": "cachix", + "repo": "pre-commit-hooks.nix", + "rev": "4e743a6920eab45e8ba0fbe49dc459f1423a4b74", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "pre-commit-hooks.nix", + "type": "github" + } + }, "root": { "inputs": { "devenv": "devenv", "fenix": "fenix", - "nixpkgs": "nixpkgs_4", - "systems": "systems_4" + "nixpkgs": "nixpkgs_5", + "systems": "systems_2" } }, "rust-analyzer-src": { "flake": false, "locked": { - "lastModified": 1712818880, - "narHash": "sha256-VDxsvgj/bNypHq48tQWtc3VRbWvzlFjzKf9ZZIVO10Y=", + "lastModified": 1729454508, + "narHash": "sha256-1W5B/CnLgdC03iIFG0wtawO1+dGDWDpc84PeOHo2ecU=", "owner": "rust-lang", "repo": "rust-analyzer", - "rev": "657b33b0cb9bd49085202e91ad5b4676532c9140", + "rev": "9323b5385863739d1c113f02e4cf3f2777c09977", "type": "github" }, "original": { @@ -610,36 +718,6 @@ "repo": "default", "type": "github" } - }, - "systems_3": { - "locked": { - "lastModified": 1681028828, - "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", - "owner": "nix-systems", - "repo": "default", - "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", - "type": "github" - }, - "original": { - "owner": "nix-systems", - "repo": "default", - "type": "github" - } - }, - "systems_4": { - "locked": { - "lastModified": 1681028828, - "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", - "owner": "nix-systems", - "repo": "default", - "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", - "type": "github" - }, - "original": { - "owner": "nix-systems", - "repo": "default", - "type": "github" - } } }, "root": "root",