diff options
-rw-r--r-- | Cargo.lock | 964 | ||||
-rw-r--r-- | Cargo.toml | 40 | ||||
-rw-r--r-- | README.adoc | 25 | ||||
-rw-r--r-- | hittekaart-cli/Cargo.toml | 16 | ||||
-rw-r--r-- | hittekaart-cli/src/main.rs (renamed from src/main.rs) | 0 | ||||
-rw-r--r-- | hittekaart-py/Cargo.toml | 14 | ||||
-rw-r--r-- | hittekaart-py/hittekaart_py/__init__.py | 1 | ||||
-rw-r--r-- | hittekaart-py/hittekaart_py/hittekaart_py.pyi | 43 | ||||
-rw-r--r-- | hittekaart-py/hittekaart_py/py.typed | 0 | ||||
-rw-r--r-- | hittekaart-py/pyproject.toml | 15 | ||||
-rw-r--r-- | hittekaart-py/src/lib.rs | 350 | ||||
-rw-r--r-- | hittekaart/Cargo.toml | 29 | ||||
-rw-r--r-- | hittekaart/benches/bench.gpx (renamed from benches/bench.gpx) | 0 | ||||
-rw-r--r-- | hittekaart/benches/hittebench.rs (renamed from benches/hittebench.rs) | 0 | ||||
-rw-r--r-- | hittekaart/src/error.rs | 36 | ||||
-rw-r--r-- | hittekaart/src/gpx.rs (renamed from src/gpx.rs) | 40 | ||||
-rw-r--r-- | hittekaart/src/layer.rs (renamed from src/layer.rs) | 5 | ||||
-rw-r--r-- | hittekaart/src/lib.rs (renamed from src/lib.rs) | 1 | ||||
-rw-r--r-- | hittekaart/src/renderer/heatmap.rs (renamed from src/renderer/heatmap.rs) | 8 | ||||
-rw-r--r-- | hittekaart/src/renderer/marktile.rs (renamed from src/renderer/marktile.rs) | 2 | ||||
-rw-r--r-- | hittekaart/src/renderer/mod.rs (renamed from src/renderer/mod.rs) | 6 | ||||
-rw-r--r-- | hittekaart/src/renderer/tile-marked.png (renamed from src/renderer/tile-marked.png) | bin | 116 -> 116 bytes | |||
-rw-r--r-- | hittekaart/src/renderer/tilehunt.rs (renamed from src/renderer/tilehunt.rs) | 2 | ||||
-rw-r--r-- | hittekaart/src/storage.rs (renamed from src/storage.rs) | 26 |
24 files changed, 1065 insertions, 558 deletions
@@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "ab_glyph_rasterizer" @@ -10,35 +10,36 @@ checksum = "c71b1793ee61086797f5c80b6efa2b8ffa6d5dd703f118545808a7f2e27f7046" [[package]] name = "addr2line" -version = "0.21.0" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ "gimli", ] [[package]] -name = "adler" -version = "1.0.2" +name = "adler2" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" [[package]] name = "ahash" -version = "0.8.3" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" dependencies = [ "cfg-if", "once_cell", "version_check", + "zerocopy", ] [[package]] name = "aho-corasick" -version = "1.1.2" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" dependencies = [ "memchr", ] @@ -60,9 +61,9 @@ dependencies = [ [[package]] name = "allocator-api2" -version = "0.2.16" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "anes" @@ -72,50 +73,52 @@ checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" [[package]] name = "anstream" -version = "0.6.4" +version = "0.6.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ab91ebe16eb252986481c5b62f6098f3b698a45e34b5b98200cf20dd2484a44" +checksum = "301af1932e46185686725e0fad2f8f2aa7da69dd70bf6ecc44d6b703844a3933" dependencies = [ "anstyle", "anstyle-parse", "anstyle-query", "anstyle-wincon", "colorchoice", + "is_terminal_polyfill", "utf8parse", ] [[package]] name = "anstyle" -version = "1.0.4" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" +checksum = "862ed96ca487e809f1c8e5a8447f6ee2cf102f846893800b20cebdf541fc6bbd" [[package]] name = "anstyle-parse" -version = "0.2.2" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317b9a89c1868f5ea6ff1d9539a69f45dffc21ce321ac1fd1160dfa48c8e2140" +checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.0.0" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" +checksum = "6c8bdeb6047d8983be085bab0ba1472e6dc604e7041dbf6fcd5e71523014fae9" dependencies = [ - "windows-sys 0.48.0", + "windows-sys", ] [[package]] name = "anstyle-wincon" -version = "3.0.1" +version = "3.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0699d10d2f4d628a98ee7b57b289abbc98ff3bad977cb3152709d4bf2330628" +checksum = "403f75924867bb1033c59fbf0797484329750cfbe3c4325cd33127941fabc882" dependencies = [ "anstyle", - "windows-sys 0.48.0", + "once_cell_polyfill", + "windows-sys", ] [[package]] @@ -129,23 +132,23 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.1.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "backtrace" -version = "0.3.69" +version = "0.3.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" dependencies = [ "addr2line", - "cc", "cfg-if", "libc", "miniz_oxide", "object", "rustc-demangle", + "windows-targets", ] [[package]] @@ -162,15 +165,15 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.0" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635" +checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" [[package]] name = "brotli" -version = "3.4.0" +version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "516074a47ef4bce09577a3b379392300159ce5b1ba2e501ff1c819950066100f" +checksum = "d640d25bc63c50fb1f0b545ffd80207d2e10a4c965530809b40ba3386825c391" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -179,9 +182,9 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "2.5.0" +version = "2.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da74e2b81409b1b743f8f0c62cc6254afefb8b8e50bbfe3735550f7aeefa3448" +checksum = "4e2e4afe60d7dd600fdd3de8d0f08c2b7ec039712e3b6137ff98b7004e82de4f" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -189,15 +192,15 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.14.0" +version = "3.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" [[package]] name = "bytemuck" -version = "1.14.0" +version = "1.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6" +checksum = "5c76a5792e44e4abe34d3abf15636779261d45a7450612059293d1d2cfc63422" [[package]] name = "byteorder" @@ -212,25 +215,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] -name = "cc" -version = "1.0.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" -dependencies = [ - "libc", -] - -[[package]] name = "cfg-if" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" [[package]] name = "ciborium" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "effd91f6c78e5a4ace8a5d3c0b6bfaec9e2baaef55f3efc00e45fb2e477ee926" +checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" dependencies = [ "ciborium-io", "ciborium-ll", @@ -239,25 +233,25 @@ dependencies = [ [[package]] name = "ciborium-io" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdf919175532b369853f5d5e20b26b43112613fd6fe7aee757e35f7a44642656" +checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" [[package]] name = "ciborium-ll" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "defaa24ecc093c77630e6c15e17c51f5e187bf35ee514f4e2d67baaa96dae22b" +checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" dependencies = [ "ciborium-io", - "half 1.8.2", + "half", ] [[package]] name = "clap" -version = "4.4.6" +version = "4.5.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d04704f56c2cde07f43e8e2c154b43f216dc5c92fc98ada720177362f953b956" +checksum = "40b6887a1d8685cebccf115538db5c0efe625ccac9696ad45c409d96566e910f" dependencies = [ "clap_builder", "clap_derive", @@ -265,9 +259,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.4.6" +version = "4.5.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e231faeaca65ebd1ea3c737966bf858971cd38c3849107aa3ea7de90a804e45" +checksum = "e0c66c08ce9f0c698cbce5c0279d0bb6ac936d8674174fe48f736533b964f59e" dependencies = [ "anstream", "anstyle", @@ -277,27 +271,27 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.4.2" +version = "4.5.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0862016ff20d69b84ef8247369fabf5c008a7417002411897d40ee1f4532b873" +checksum = "d2c7947ae4cc3d851207c1adb5b5e260ff0cca11446b1d6d1423788e442257ce" dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.38", + "syn", ] [[package]] name = "clap_lex" -version = "0.5.1" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd7cc57abe963c6d3b9d8be5b06ba7c8957a930305ca90304f24ef040aa6f961" +checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" [[package]] name = "color-eyre" -version = "0.6.2" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a667583cca8c4f8436db8de46ea8233c42a7d9ae424a82d338f2e4675229204" +checksum = "e5920befb47832a6d61ee3a3a846565cfa39b331331e68a3b1d1116630f2f26d" dependencies = [ "backtrace", "color-spantrace", @@ -310,9 +304,9 @@ dependencies = [ [[package]] name = "color-spantrace" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ba75b3d9449ecdccb27ecbc479fdc0b87fa2dd43d2f8298f9bf0e59aacc8dce" +checksum = "b8b88ea9df13354b55bc7234ebcce36e6ef896aca2e42a15de9e10edce01b427" dependencies = [ "once_cell", "owo-colors", @@ -328,9 +322,9 @@ checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" [[package]] name = "colorchoice" -version = "1.0.0" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" +checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" [[package]] name = "colorgrad" @@ -343,15 +337,15 @@ dependencies = [ [[package]] name = "console" -version = "0.15.7" +version = "0.15.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c926e00cc70edefdc64d3a5ff31cc65bb97a3460097762bd23afb4d8145fccf8" +checksum = "054ccb5b10f9f2cbf51eb355ca1d05c2d279ce1804688d0db74b4733a5aeafd8" dependencies = [ "encode_unicode", - "lazy_static", "libc", + "once_cell", "unicode-width", - "windows-sys 0.45.0", + "windows-sys", ] [[package]] @@ -365,9 +359,9 @@ dependencies = [ [[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", ] @@ -410,52 +404,43 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.8" +version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" dependencies = [ - "cfg-if", "crossbeam-utils", ] [[package]] name = "crossbeam-deque" -version = "0.8.3" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" dependencies = [ - "cfg-if", "crossbeam-epoch", "crossbeam-utils", ] [[package]] name = "crossbeam-epoch" -version = "0.9.15" +version = "0.9.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" dependencies = [ - "autocfg", - "cfg-if", "crossbeam-utils", - "memoffset", - "scopeguard", ] [[package]] name = "crossbeam-utils" -version = "0.8.16" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" -dependencies = [ - "cfg-if", -] +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "crunchy" -version = "0.2.2" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" [[package]] name = "csscolorparser" @@ -474,35 +459,24 @@ checksum = "ef8ae57c4978a2acd8b869ce6b9ca1dfe817bff704c220209fdef2c0b75a01b9" [[package]] name = "either" -version = "1.9.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] name = "encode_unicode" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" - -[[package]] -name = "errno" -version = "0.3.5" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3e13f66a2f95e32a39eaa81f6b95d42878ca0e1db0c7543723dfe12557e860" -dependencies = [ - "libc", - "windows-sys 0.48.0", -] +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" [[package]] name = "exr" -version = "1.71.0" +version = "1.73.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "832a761f35ab3e6664babfbdc6cef35a4860e816ec3916dcfd0882954e98a8a8" +checksum = "f83197f59927b46c04a183a619b7c29df34e63e63c7869320862268c0ef687e0" dependencies = [ "bit_field", - "flume", - "half 2.2.1", + "half", "lebe", "miniz_oxide", "rayon-core", @@ -512,9 +486,9 @@ dependencies = [ [[package]] name = "eyre" -version = "0.6.8" +version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c2b6b5a29c02cdc822728b7d7b8ae1bab3e3b05d44522770ddd49722eeac7eb" +checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" dependencies = [ "indenter", "once_cell", @@ -534,33 +508,24 @@ checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" [[package]] name = "fdeflate" -version = "0.3.0" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d329bdeac514ee06249dabc27877490f17f5d371ec693360768b838e19f3ae10" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" dependencies = [ "simd-adler32", ] [[package]] name = "flate2" -version = "1.0.28" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" +checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" dependencies = [ "crc32fast", "miniz_oxide", ] [[package]] -name = "flume" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" -dependencies = [ - "spin", -] - -[[package]] name = "fnv" version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -579,9 +544,9 @@ dependencies = [ [[package]] name = "gif" -version = "0.12.0" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80792593675e051cf94a4b111980da2ba60d4a83e43e0048c5693baab3977045" +checksum = "4ae047235e33e2829703574b54fdec96bfbad892062d97fed2f76022287de61b" dependencies = [ "color_quant", "weezl", @@ -589,30 +554,25 @@ dependencies = [ [[package]] name = "gimli" -version = "0.28.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "half" -version = "1.8.2" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" - -[[package]] -name = "half" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b4af3693f1b705df946e9fe5631932443781d0aabb423b62fcd4d73f6d2fd0" +checksum = "459196ed295495a68f7d7fe1d84f6c4b7ff0e21fe3017b2f283c6fac3ad803c9" dependencies = [ + "cfg-if", "crunchy", ] [[package]] name = "hashbrown" -version = "0.14.1" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dfda62a12f55daeae5015f81b0baea145391cb4520f86c248fc615d72640d12" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" dependencies = [ "ahash", "allocator-api2", @@ -629,23 +589,21 @@ dependencies = [ [[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" -version = "0.3.3" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" [[package]] name = "hittekaart" version = "0.1.0" dependencies = [ "brotli", - "clap", - "color-eyre", "colorgrad", "criterion", "crossbeam-channel", @@ -653,20 +611,40 @@ dependencies = [ "fnv", "image", "imageproc", - "indicatif", - "is-terminal", - "nalgebra 0.32.3", + "nalgebra 0.32.6", "num-traits", "rayon", "roxmltree", "rusqlite", + "thiserror", +] + +[[package]] +name = "hittekaart-cli" +version = "0.1.0" +dependencies = [ + "clap", + "color-eyre", + "hittekaart", + "indicatif", + "is-terminal", + "rayon", +] + +[[package]] +name = "hittekaart-py" +version = "0.1.0" +dependencies = [ + "hittekaart", + "pyo3", + "rayon", ] [[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", @@ -674,7 +652,6 @@ dependencies = [ "exr", "gif", "jpeg-decoder", - "num-rational", "num-traits", "png", "qoi", @@ -707,38 +684,41 @@ checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" [[package]] name = "indicatif" -version = "0.17.7" +version = "0.17.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb28741c9db9a713d93deb3bb9515c20788cef5815265bee4980e87bde7e0f25" +checksum = "183b3088984b400f4cfac3620d5e076c84da5364016b4f49473de574b2586235" dependencies = [ "console", - "instant", "number_prefix", "portable-atomic", "unicode-width", + "web-time", ] [[package]] -name = "instant" -version = "0.1.12" +name = "indoc" +version = "2.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" -dependencies = [ - "cfg-if", -] +checksum = "f4c7245a08504955605670dbf141fceab975f15ca21570696aebe9d2e71576bd" [[package]] name = "is-terminal" -version = "0.4.9" +version = "0.4.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" +checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9" dependencies = [ "hermit-abi", - "rustix", - "windows-sys 0.48.0", + "libc", + "windows-sys", ] [[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + +[[package]] name = "itertools" version = "0.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -749,33 +729,34 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.9" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "jpeg-decoder" -version = "0.3.0" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc0000e42512c92e31c2252315bda326620a4e034105e900c98ec492fa077b3e" +checksum = "00810f1d8b74be64b13dbf3db89ac67740615d6c891f0e7b6179326533011a07" dependencies = [ "rayon", ] [[package]] name = "js-sys" -version = "0.3.64" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5f195fe497f702db0f318b07fdd68edb16955aed830df8363d837542f8f935a" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" dependencies = [ + "once_cell", "wasm-bindgen", ] [[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" @@ -785,9 +766,9 @@ checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" [[package]] name = "libc" -version = "0.2.149" +version = "0.2.174" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b" +checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" [[package]] name = "libsqlite3-sys" @@ -800,32 +781,16 @@ dependencies = [ ] [[package]] -name = "linux-raw-sys" -version = "0.4.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da2479e8c062e40bf0066ffa0bc823de0a9368974af99c9f6df941d2c231e03f" - -[[package]] -name = "lock_api" -version = "0.4.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] name = "log" -version = "0.4.20" +version = "0.4.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" [[package]] name = "matrixmultiply" -version = "0.3.8" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7574c1cf36da4798ab73da5b215bbf444f50718207754cb522201d78d1cd0ff2" +checksum = "a06de3016e9fae57a36fd14dba131fccf49f74b40b7fbdb472f96e361ec71a08" dependencies = [ "autocfg", "rawpointer", @@ -833,26 +798,26 @@ dependencies = [ [[package]] name = "memchr" -version = "2.6.4" +version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" +checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" [[package]] name = "memoffset" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" dependencies = [ "autocfg", ] [[package]] name = "miniz_oxide" -version = "0.7.1" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" dependencies = [ - "adler", + "adler2", "simd-adler32", ] @@ -873,9 +838,9 @@ dependencies = [ [[package]] name = "nalgebra" -version = "0.32.3" +version = "0.32.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "307ed9b18cc2423f29e83f84fd23a8e73628727990181f18641a8b5dc2ab1caa" +checksum = "7b5c17de023a86f59ed79891b2e5d5a94c705dbe904a5b5c9c952ea6221b03e4" dependencies = [ "approx", "matrixmultiply", @@ -889,20 +854,20 @@ dependencies = [ [[package]] name = "nalgebra-macros" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91761aed67d03ad966ef783ae962ef9bbaca728d2dd7ceb7939ec110fffad998" +checksum = "254a5372af8fc138e36684761d3c0cdb758a4410e938babcff1c860ce14ddbfc" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn", ] [[package]] name = "num" -version = "0.4.1" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b05180d69e3da0e530ba2a1dae5110317e49e3b7f3d41be227dc5f92e49ee7af" +checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" dependencies = [ "num-bigint", "num-complex", @@ -914,39 +879,37 @@ dependencies = [ [[package]] name = "num-bigint" -version = "0.4.4" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" dependencies = [ - "autocfg", "num-integer", "num-traits", ] [[package]] name = "num-complex" -version = "0.4.4" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ba157ca0885411de85d6ca030ba7e2a83a28636056c7c699b07c8b6f7383214" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" dependencies = [ "num-traits", ] [[package]] name = "num-integer" -version = "0.1.45" +version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" dependencies = [ - "autocfg", "num-traits", ] [[package]] name = "num-iter" -version = "0.1.43" +version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" +checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" dependencies = [ "autocfg", "num-integer", @@ -955,11 +918,10 @@ dependencies = [ [[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", @@ -967,9 +929,9 @@ dependencies = [ [[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", ] @@ -982,24 +944,30 @@ checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" [[package]] name = "object" -version = "0.32.1" +version = "0.36.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.18.0" +version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "once_cell_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4895175b425cb1f87721b59f0f286c2092bd4af812243672510e1ac53e2e0ad" [[package]] name = "oorandom" -version = "11.1.3" +version = "11.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" +checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e" [[package]] name = "owned_ttf_parser" @@ -1012,21 +980,21 @@ dependencies = [ [[package]] name = "owo-colors" -version = "3.5.0" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f" +checksum = "48dd4f4a2c8405440fd0462561f0e5806bd0f77e86f51c761481bdd4018b545e" [[package]] name = "paste" -version = "1.0.14" +version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "phf" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" dependencies = [ "phf_macros", "phf_shared", @@ -1034,9 +1002,9 @@ dependencies = [ [[package]] name = "phf_generator" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" +checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" dependencies = [ "phf_shared", "rand 0.8.5", @@ -1044,43 +1012,43 @@ dependencies = [ [[package]] name = "phf_macros" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" +checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" dependencies = [ "phf_generator", "phf_shared", "proc-macro2", "quote", - "syn 2.0.38", + "syn", ] [[package]] name = "phf_shared" -version = "0.11.2" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" dependencies = [ "siphasher", ] [[package]] name = "pin-project-lite" -version = "0.2.13" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] name = "pkg-config" -version = "0.3.27" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "plotters" -version = "0.3.5" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2c224ba00d7cadd4d5c660deaf2098e5e80e07846537c51f9cfa4be50c1fd45" +checksum = "5aeb6f403d7a4911efb1e33402027fc44f29b5bf6def3effcc22d7bb75f2b747" dependencies = [ "num-traits", "plotters-backend", @@ -1091,24 +1059,24 @@ dependencies = [ [[package]] name = "plotters-backend" -version = "0.3.5" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e76628b4d3a7581389a35d5b6e2139607ad7c75b17aed325f210aa91f4a9609" +checksum = "df42e13c12958a16b3f7f4386b9ab1f3e7933914ecea48da7139435263a4172a" [[package]] name = "plotters-svg" -version = "0.3.5" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38f6d39893cca0701371e3c27294f09797214b86f1fb951b89ade8ec04e2abab" +checksum = "51bae2ac328883f7acdfea3d66a7c35751187f870bc81f94563733a154d7a670" dependencies = [ "plotters-backend", ] [[package]] name = "png" -version = "0.17.10" +version = "0.17.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd75bf2d8dd3702b9707cdbc56a5b9ef42cec752eb8b3bafc01234558442aa64" +checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" dependencies = [ "bitflags 1.3.2", "crc32fast", @@ -1119,26 +1087,92 @@ dependencies = [ [[package]] name = "portable-atomic" -version = "1.4.3" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31114a898e107c51bb1609ffaf55a0e011cf6a4d7f1170d0015a165082c0338b" +checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" [[package]] name = "ppv-lite86" -version = "0.2.17" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] [[package]] name = "proc-macro2" -version = "1.0.69" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" dependencies = [ "unicode-ident", ] [[package]] +name = "pyo3" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5203598f366b11a02b13aa20cab591229ff0a89fd121a308a5df751d5fc9219" +dependencies = [ + "cfg-if", + "indoc", + "libc", + "memoffset", + "once_cell", + "portable-atomic", + "pyo3-build-config", + "pyo3-ffi", + "pyo3-macros", + "unindent", +] + +[[package]] +name = "pyo3-build-config" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99636d423fa2ca130fa5acde3059308006d46f98caac629418e53f7ebb1e9999" +dependencies = [ + "once_cell", + "target-lexicon", +] + +[[package]] +name = "pyo3-ffi" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78f9cf92ba9c409279bc3305b5409d90db2d2c22392d443a87df3a1adad59e33" +dependencies = [ + "libc", + "pyo3-build-config", +] + +[[package]] +name = "pyo3-macros" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b999cb1a6ce21f9a6b147dcf1be9ffedf02e0043aec74dc390f3007047cecd9" +dependencies = [ + "proc-macro2", + "pyo3-macros-backend", + "quote", + "syn", +] + +[[package]] +name = "pyo3-macros-backend" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "822ece1c7e1012745607d5cf0bcb2874769f0f7cb34c4cde03b9358eb9ef911a" +dependencies = [ + "heck", + "proc-macro2", + "pyo3-build-config", + "quote", + "syn", +] + +[[package]] name = "qoi" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1149,9 +1183,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.33" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" dependencies = [ "proc-macro2", ] @@ -1229,9 +1263,9 @@ checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" [[package]] name = "rayon" -version = "1.8.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c27db03db7734835b3f53954b534c91069375ce6ccaa2e065441e07d9b6cdb1" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" dependencies = [ "either", "rayon-core", @@ -1239,9 +1273,9 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.12.0" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" dependencies = [ "crossbeam-deque", "crossbeam-utils", @@ -1249,9 +1283,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.1" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aaac441002f822bc9705a681810a4dd2963094b9ca0ddc41cb963a4c189189ea" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", @@ -1261,9 +1295,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.2" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5011c7e263a695dc8ca064cddb722af1be54e517a280b12a5356f98366899e5d" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", @@ -1272,9 +1306,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.2" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "roxmltree" @@ -1291,7 +1325,7 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "549b9d036d571d42e6e85d1c1425e2ac83491075078ca9a15be021c56b1641f2" dependencies = [ - "bitflags 2.4.0", + "bitflags 2.9.1", "fallible-iterator", "fallible-streaming-iterator", "hashlink", @@ -1301,22 +1335,9 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.23" +version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" - -[[package]] -name = "rustix" -version = "0.38.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "745ecfa778e66b2b63c88a61cb36e0eea109e803b0b86bf9879fbc77c70e86ed" -dependencies = [ - "bitflags 2.4.0", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.48.0", -] +checksum = "989e6739f80c4ad5b13e0fd7fe89531180375b18520cc8c82080e4dc4035b84f" [[package]] name = "rusttype" @@ -1329,16 +1350,22 @@ dependencies = [ ] [[package]] +name = "rustversion" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" + +[[package]] name = "ryu" -version = "1.0.15" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" [[package]] name = "safe_arch" -version = "0.7.1" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f398075ce1e6a179b46f51bd88d0598b92b00d3551f1a2d4ac49e771b56ac354" +checksum = "96b02de82ddbe1b636e6170c21be622223aea188ef2e139be0a5b219ec215323" dependencies = [ "bytemuck", ] @@ -1353,38 +1380,33 @@ dependencies = [ ] [[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] name = "serde" -version = "1.0.189" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e422a44e74ad4001bdc8eede9a4570ab52f71190e9c076d14369f38b9200537" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.189" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e48d1f918009ce3145511378cf68d613e3b3d9137d67272562080d68a2b32d5" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn", ] [[package]] name = "serde_json" -version = "1.0.107" +version = "1.0.140" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b420ce6e3d8bd882e9b243c6eed35dbc9a6110c9769e74b584e0d68d1f20c65" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" dependencies = [ "itoa", + "memchr", "ryu", "serde", ] @@ -1432,36 +1454,27 @@ checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" [[package]] name = "siphasher" -version = "0.3.11" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" [[package]] name = "smallvec" -version = "1.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a" - -[[package]] -name = "spin" -version = "0.9.8" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" -dependencies = [ - "lock_api", -] +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[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 = "syn" -version = "1.0.109" +version = "2.0.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" dependencies = [ "proc-macro2", "quote", @@ -1469,31 +1482,45 @@ dependencies = [ ] [[package]] -name = "syn" -version = "2.0.38" +name = "target-lexicon" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e502f78cdbb8ba4718f566c418c52bc729126ffd16baee5baa718cf25dd5a69a" + +[[package]] +name = "thiserror" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e96b79aaa137db8f61e26363a0c9b47d8b4ec75da28b7d1d614c2303e232408b" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" dependencies = [ "proc-macro2", "quote", - "unicode-ident", + "syn", ] [[package]] name = "thread_local" -version = "1.1.7" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" dependencies = [ "cfg-if", - "once_cell", ] [[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", @@ -1512,9 +1539,9 @@ dependencies = [ [[package]] name = "tracing" -version = "0.1.39" +version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee2ef2af84856a50c1d430afce2fdded0a4ec7eda868db86409b4543df0797f9" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ "pin-project-lite", "tracing-core", @@ -1522,9 +1549,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.32" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" dependencies = [ "once_cell", "valuable", @@ -1532,9 +1559,9 @@ dependencies = [ [[package]] name = "tracing-error" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d686ec1c0f384b1277f097b2f279a2ecc11afe8c133c1aabf036a27cb4cd206e" +checksum = "8b1581020d7a273442f5b45074a6a57d5757ad0a47dac0e9f0bd57b81936f3db" dependencies = [ "tracing", "tracing-subscriber", @@ -1542,9 +1569,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.17" +version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77" +checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" dependencies = [ "sharded-slab", "thread_local", @@ -1559,33 +1586,39 @@ checksum = "7b3e06c9b9d80ed6b745c7159c40b311ad2916abb34a49e9be2653b90db0d8dd" [[package]] name = "typenum" -version = "1.17.0" +version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" [[package]] name = "unicode-width" -version = "0.1.11" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a1a07cc7db3810833284e8d372ccdc6da29741639ecc70c9ec107df0fa6154c" + +[[package]] +name = "unindent" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" +checksum = "7264e107f553ccae879d21fbea1d6724ac785e8c3bfc762137959b5802826ef3" [[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 = "valuable" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" [[package]] name = "vcpkg" @@ -1595,15 +1628,15 @@ checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] name = "version_check" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "walkdir" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" dependencies = [ "same-file", "winapi-util", @@ -1617,34 +1650,35 @@ checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" [[package]] name = "wasm-bindgen" -version = "0.2.87" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" dependencies = [ "cfg-if", + "once_cell", + "rustversion", "wasm-bindgen-macro", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.87" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ef2b6d3c510e9625e5fe6f509ab07d66a760f0885d858736483c32ed7809abd" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" dependencies = [ "bumpalo", "log", - "once_cell", "proc-macro2", "quote", - "syn 2.0.38", + "syn", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.87" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dee495e55982a3bd48105a7b947fd2a9b4a8ae3010041b9e0faab3f9cd028f1d" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -1652,217 +1686,169 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.87" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.87" +version = "0.2.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca6ad05a4870b2bf5fe995117d3728437bd27d7cd5f06f13c17443ef369775a1" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] [[package]] name = "web-sys" -version = "0.3.64" +version = "0.3.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b85cbef8c220a6abc02aefd892dfc0fc23afb1c6a426316ec33253a3877249b" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" dependencies = [ "js-sys", "wasm-bindgen", ] [[package]] -name = "weezl" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9193164d4de03a926d909d3bc7c30543cecb35400c02114792c2cae20d5e2dbb" - -[[package]] -name = "wide" -version = "0.7.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebecebefc38ff1860b4bc47550bbfa63af5746061cf0d29fcd7fa63171602598" -dependencies = [ - "bytemuck", - "safe_arch", -] - -[[package]] -name = "winapi" -version = "0.3.9" +name = "web-time" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", + "js-sys", + "wasm-bindgen", ] [[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" +name = "weezl" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +checksum = "a751b3277700db47d3e574514de2eced5e54dc8a5436a3bf7a0b248b2cee16f3" [[package]] -name = "winapi-util" -version = "0.1.6" +name = "wide" +version = "0.7.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +checksum = "0ce5da8ecb62bcd8ec8b7ea19f69a51275e91299be594ea5cc6ef7819e16cd03" dependencies = [ - "winapi", + "bytemuck", + "safe_arch", ] [[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "windows-sys" -version = "0.45.0" +name = "winapi-util" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-targets 0.42.2", + "windows-sys", ] [[package]] name = "windows-sys" -version = "0.48.0" +version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" dependencies = [ - "windows-targets 0.48.5", + "windows-targets", ] [[package]] name = "windows-targets" -version = "0.42.2" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", -] - -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", ] [[package]] name = "windows_aarch64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.2" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_msvc" -version = "0.48.5" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_i686_gnu" -version = "0.42.2" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] -name = "windows_i686_gnu" -version = "0.48.5" +name = "windows_i686_gnullvm" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_msvc" -version = "0.42.2" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" - -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_x86_64_gnu" -version = "0.42.2" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnullvm" -version = "0.42.2" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" +name = "windows_x86_64_msvc" +version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] -name = "windows_x86_64_msvc" -version = "0.42.2" +name = "xmlparser" +version = "0.13.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" +checksum = "66fee0b777b0f5ac1c69bb06d361268faafa61cd4682ae064a171c16c433e9e4" [[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" +name = "zerocopy" +version = "0.8.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" +checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" +dependencies = [ + "zerocopy-derive", +] [[package]] -name = "xmlparser" -version = "0.13.6" +name = "zerocopy-derive" +version = "0.8.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66fee0b777b0f5ac1c69bb06d361268faafa61cd4682ae064a171c16c433e9e4" +checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] [[package]] name = "zune-inflate" @@ -1,35 +1,5 @@ -[package] -name = "hittekaart" -version = "0.1.0" -edition = "2021" -description = "Generates OSM heatmap tiles from GPX tracks" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[[bench]] -name = "hittebench" -harness = false - -[dependencies] -brotli = "3.3.4" -clap = { version = "4.2.7", features = ["derive"] } -color-eyre = "0.6.2" -colorgrad = "0.6.2" -crossbeam-channel = "0.5.8" -flate2 = "1.0.26" -fnv = "1.0.7" -image = "0.24.6" -imageproc = "0.23.0" -indicatif = "0.17.3" -is-terminal = "0.4.7" -nalgebra = "0.32" -num-traits = "0.2.15" -rayon = "1.7.0" -roxmltree = "0.18.0" -rusqlite = "0.29.0" - -[dev-dependencies] -criterion = "0.5.0" - -[profile.release] -lto = false +[workspace] +resolver = "3" +members = [ + "hittekaart", "hittekaart-cli", "hittekaart-py", +] diff --git a/README.adoc b/README.adoc index b628a68..65256fd 100644 --- a/README.adoc +++ b/README.adoc @@ -260,6 +260,31 @@ With the tile server running, you can then open a HTML file like the following: </html> ---- +== PYTHON INTERFACE + +This program comes with a Python interface, which allows easy use from Python +scripts. The `hittekaart_py` subfolder in the repository is an installable +module. + +The Python API is documented in the docstrings, and at +https://docs.fietsboek.org/developer/module/hittekaart_py.html. An example +program may look like: + +[source,python] +---- +from hittekaart_py import ( + Track, HeatmapRenderer, Settings, Storage, generate +) + +settings = Settings(threads=3) +tracks = [ + Track.from_file(b"Documents/track.gpx", None), + Track.from_coordinates([(45.0, 47.0)]), +] +storage = Storage.Sqlite(b"/tmp/tiles.sqlite") +generate(settings, tracks, HeatmapRenderer(), storage) +---- + == BUGS Feel free you report bugs on the issue tracker at diff --git a/hittekaart-cli/Cargo.toml b/hittekaart-cli/Cargo.toml new file mode 100644 index 0000000..1962b87 --- /dev/null +++ b/hittekaart-cli/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "hittekaart-cli" +version = "0.1.0" +edition = "2024" + +[[bin]] +path = "src/main.rs" +name = "hittekaart" + +[dependencies] +hittekaart = { path = "../hittekaart" } +clap = { version = "4.2.7", features = ["derive"] } +color-eyre = "0.6.2" +indicatif = "0.17.3" +is-terminal = "0.4.7" +rayon = "1.10.0" diff --git a/src/main.rs b/hittekaart-cli/src/main.rs index 11133af..11133af 100644 --- a/src/main.rs +++ b/hittekaart-cli/src/main.rs diff --git a/hittekaart-py/Cargo.toml b/hittekaart-py/Cargo.toml new file mode 100644 index 0000000..7e69ef8 --- /dev/null +++ b/hittekaart-py/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "hittekaart-py" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +[lib] +name = "hittekaart_py" +crate-type = ["cdylib"] + +[dependencies] +pyo3 = "0.24.0" +hittekaart = { path = "../hittekaart" } +rayon = "1.10.0" diff --git a/hittekaart-py/hittekaart_py/__init__.py b/hittekaart-py/hittekaart_py/__init__.py new file mode 100644 index 0000000..039ffd1 --- /dev/null +++ b/hittekaart-py/hittekaart_py/__init__.py @@ -0,0 +1 @@ +from .hittekaart_py import * diff --git a/hittekaart-py/hittekaart_py/hittekaart_py.pyi b/hittekaart-py/hittekaart_py/hittekaart_py.pyi new file mode 100644 index 0000000..0efe011 --- /dev/null +++ b/hittekaart-py/hittekaart_py/hittekaart_py.pyi @@ -0,0 +1,43 @@ +from typing import Iterable + + +class Track: + @staticmethod + def from_file(path: bytes, compression: str | None) -> "Track": ... + + @staticmethod + def from_coordinates(coordinates: list[tuple[float, float]]) -> "Track": ... + + +class Storage: + @staticmethod + def Folder(path: bytes) -> "Storage": ... + + @staticmethod + def Sqlite(path: bytes) -> "Storage": ... + + +class HeatmapRenderer: + def __new__(cls) -> "HeatmapRenderer": ... + + +class MarktileRenderer: + def __new__(cls) -> "MarktileRenderer": ... + + +class TilehuntRenderer: + def __new__(cls, zoom: int) -> "TilehuntRenderer": ... + + +class Settings: + min_zoom: int + max_zoom: int + threads: int + def __new__(cls, min_zoom: int=0, max_zoom: int=19, threads: int=0) -> "Settings": ... + + +def generate(settings: Settings, items: Iterable[Track], renderer: HeatmapRenderer | MarktileRenderer | TilehuntRenderer, storage: Storage): ... + + +class HitteError(Exception): + ... diff --git a/hittekaart-py/hittekaart_py/py.typed b/hittekaart-py/hittekaart_py/py.typed new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/hittekaart-py/hittekaart_py/py.typed diff --git a/hittekaart-py/pyproject.toml b/hittekaart-py/pyproject.toml new file mode 100644 index 0000000..865cc21 --- /dev/null +++ b/hittekaart-py/pyproject.toml @@ -0,0 +1,15 @@ +[build-system] +requires = ["maturin>=1.8,<2.0"] +build-backend = "maturin" + +[project] +name = "hittekaart-py" +requires-python = ">=3.8" +classifiers = [ + "Programming Language :: Rust", + "Programming Language :: Python :: Implementation :: CPython", + "Programming Language :: Python :: Implementation :: PyPy", +] +dynamic = ["version"] +[tool.maturin] +features = ["pyo3/extension-module"] diff --git a/hittekaart-py/src/lib.rs b/hittekaart-py/src/lib.rs new file mode 100644 index 0000000..f14515a --- /dev/null +++ b/hittekaart-py/src/lib.rs @@ -0,0 +1,350 @@ +//! Python bindings for hittekaart. +//! +//! This module provides simple-to-use bindings for hittekaart generation from Python scripts. +use hittekaart::gpx::{self, Compression, Coordinates}; +use hittekaart::renderer::{self, Renderer}; +use pyo3::create_exception; +use pyo3::exceptions::PyTypeError; +use pyo3::prelude::*; +use std::error::Error; +use std::ffi::OsStr; +use std::fmt::Write as _; +use std::os::unix::ffi::OsStrExt as _; +use std::path::PathBuf; + +create_exception!(hittekaart_py, HitteError, pyo3::exceptions::PyException); + +/// Converts an error to a Python error. +/// +/// This basically maps everything to [`HitteError`] and provides a stringified error explanation. +/// +/// This recursively uses `::source()` to walk the chain. +fn err_to_py(mut error: &dyn Error) -> PyErr { + let mut text = error.to_string(); + loop { + match error.source() { + None => break, + Some(e) => error = e, + } + write!(&mut text, "\ncaused by: {error}").unwrap(); + } + HitteError::new_err(text) +} + +/// Represents a track. +/// +/// This is what you want to load in order to render the heatmaps. +/// +/// Tracks can be loaded from GPX files (see Track.from_file()) or from in-memory coordinates +/// (Track.from_coordinates()). Otherwise, tracks should be treated as opaque objects, whose only +/// purpose is to be passed to generate(). +#[pyclass] +#[derive(Debug, Clone)] +struct Track { + inner: Vec<Coordinates>, +} + +#[pymethods] +impl Track { + /// Load a track from a file. + /// + /// The path should be given as a bytes object. + /// + /// The compression parameter - if given - should be one of the strings "gzip" or "brotli". It + /// can be set to None to use no compression. + #[staticmethod] + fn from_file(path: &[u8], compression: Option<&str>) -> PyResult<Track> { + let compression = match compression { + None | Some("") => Compression::None, + Some("gzip") => Compression::Gzip, + Some("brotli") => Compression::Brotli, + Some(x) => return Err(HitteError::new_err(format!("invalid compression: {x}"))), + }; + let track = gpx::extract_from_file(OsStr::from_bytes(path), compression) + .map_err(|e| err_to_py(&e))?; + Ok(Track { inner: track }) + } + + /// Load a track from the given coordinates. + /// + /// The coordinates should be a list of (longitude, latitude) tuples, where longitude and + /// latitude are represented as floats. + #[staticmethod] + fn from_coordinates(coordinates: Vec<(f64, f64)>) -> Track { + Track { + inner: coordinates + .iter() + .map(|(lon, lat)| Coordinates::new(*lon, *lat)) + .collect(), + } + } + + fn __repr__(&self) -> String { + format!("<Track [{} coordinates]>", self.inner.len()) + } +} + +#[derive(Debug, Clone, PartialEq, Eq)] +enum StorageType { + Folder(PathBuf), + Sqlite(PathBuf), +} + +/// Represents a storage target. +/// +/// Hittekaart can store tiles either in folders (easy-to-use, but wasteful), or as a SQLite +/// database (more space-efficient). +/// +/// See hittekaart's README for more detailed information. +#[pyclass] +#[derive(Debug, Clone, PartialEq, Eq)] +struct Storage(StorageType); + +#[pymethods] +impl Storage { + /// Output to the given folder. + /// + /// This will create files path/{z}/{x}/{y}.png, where {z} is the zoom level, and {x} and {y} + /// are the tile coordinates. + #[staticmethod] + #[pyo3(name = "Folder")] + fn folder(path: &[u8]) -> Self { + let path = OsStr::from_bytes(path); + Storage(StorageType::Folder(path.into())) + } + + /// Output to the given SQLite file. + /// + /// This will create a single table 'tiles' with the columns 'zoom', 'x', 'y' and 'data'. + /// + /// Note that you cannot "append" to an existing database, it must be a non-existing file. + #[staticmethod] + #[pyo3(name = "Sqlite")] + fn sqlite(path: &[u8]) -> Self { + let path = OsStr::from_bytes(path); + Storage(StorageType::Sqlite(path.into())) + } + + fn __repr__(&self) -> String { + match self.0 { + StorageType::Folder(ref path) => format!("<Storage.Folder path='{}'>", path.display()), + StorageType::Sqlite(ref path) => format!("<Storage.Sqlite path='{}'>", path.display()), + } + } +} + +impl Storage { + fn open(&self) -> PyResult<Box<dyn hittekaart::storage::Storage + Send>> { + match self.0 { + StorageType::Folder(ref path) => { + let storage = hittekaart::storage::Folder::new(path.clone()); + Ok(Box::new(storage)) + } + StorageType::Sqlite(ref path) => { + let storage = hittekaart::storage::Sqlite::connect(path.clone()) + .map_err(|e| err_to_py(&e))?; + Ok(Box::new(storage)) + } + } + } +} + +/// A renderer that produces a heatmap. +/// +/// The constructor takes no parameters: HeatmapRenderer() +#[pyclass] +struct HeatmapRenderer { + inner: renderer::heatmap::Renderer, +} + +#[pymethods] +impl HeatmapRenderer { + #[new] + fn new() -> HeatmapRenderer { + HeatmapRenderer { + inner: renderer::heatmap::Renderer, + } + } +} + +/// A renderer that only marks visited tiles. +/// +/// The constructor takes no parameters: MarktileRenderer() +#[pyclass] +struct MarktileRenderer { + inner: renderer::marktile::Renderer, +} + +#[pymethods] +impl MarktileRenderer { + #[new] + fn new() -> MarktileRenderer { + MarktileRenderer { + inner: renderer::marktile::Renderer, + } + } +} + +/// A renderer that renders a "tile hunt". +/// +/// A tile hunt marks visited tiles on a fixed zoom level. +/// +/// The constructor takes the tile hunt level as parameter: TilehuntRenderer(zoom) +#[pyclass] +struct TilehuntRenderer { + inner: renderer::tilehunt::Renderer, +} + +#[pymethods] +impl TilehuntRenderer { + #[new] + fn new(zoom: u32) -> TilehuntRenderer { + TilehuntRenderer { + inner: renderer::tilehunt::Renderer::new(zoom), + } + } +} + +/// Tile generation settings. +/// +/// This contains everything that is overarching to the renderers and output modules, such as zoom +/// levels and thread count. +#[pyclass] +struct Settings { + #[pyo3(get, set)] + /// Smallest zoom level that will be generated. + min_zoom: u32, + + #[pyo3(get, set)] + /// Largest zoom level that will be generated. + max_zoom: u32, + + #[pyo3(get, set)] + /// How many threads to use for generation. + /// + /// A count of 0 will automatically use as many threads as you have CPU cores. + threads: u32, +} + +#[pymethods] +impl Settings { + #[new] + #[pyo3(signature = (min_zoom = 1, max_zoom = 19, threads = 0))] + fn new(min_zoom: u32, max_zoom: u32, threads: u32) -> Settings { + Settings { + min_zoom, + max_zoom, + threads, + } + } + + fn __repr__(&self) -> String { + format!( + "Settings(min_zoom={}, max_zoom={}, threads={})", + self.min_zoom, self.max_zoom, self.threads + ) + } +} + +macro_rules! dispatch_generate { + ($settings:expr, $tracks:expr, $renderer:expr, $storage:expr => <$type:ty>, $(<$types:ty>,)*) => { + if let Ok(r) = $renderer.downcast::<$type>() { + do_generate($settings, $tracks, &r.borrow().inner, $storage) + } else { + dispatch_generate!($settings, $tracks, $renderer, $storage => $(<$types>,)*) + } + }; + + ($settings:expr, $tracks:expr, $renderer:expr, $storage:expr =>) => { + Err(PyTypeError::new_err( + "Expected a HeatmapRenderer, MarktileRenderer or TilehuntRenderer", + )) + }; +} + +/// Generate the heatmap. +/// +/// * settings are the rendering Settings +/// * items is an iterable of Track +/// * renderer should be one of the renderers (such as HeatmapRenderer) +/// * storage is the Storage output +#[pyfunction] +fn generate( + settings: &Bound<'_, Settings>, + items: &Bound<'_, PyAny>, + renderer: &Bound<'_, PyAny>, + storage: &Bound<'_, Storage>, +) -> PyResult<()> { + let mut tracks = vec![]; + + for item in items.try_iter()? { + let item = item?; + tracks.push(item.extract::<Track>()?.inner); + } + + let settings = &*settings.borrow(); + + // We cannot easily do dynamic dispatch here, because Renderer::Prepared exists. Maybe this can + // change in the future, but for now we have to stick to this: + dispatch_generate! { + settings, tracks, renderer, &mut *storage.borrow().open()? => + <HeatmapRenderer>, + <MarktileRenderer>, + <TilehuntRenderer>, + } +} + +fn do_generate<R: Renderer>( + settings: &Settings, + tracks: Vec<Vec<Coordinates>>, + renderer: &R, + storage: &mut (dyn hittekaart::storage::Storage + Send), +) -> PyResult<()> { + storage.prepare().map_err(|e| err_to_py(&e))?; + + let pool = rayon::ThreadPoolBuilder::new() + .num_threads(settings.threads.try_into().unwrap()) + .build() + .map_err(|e| err_to_py(&e))?; + + pool.install(|| { + for zoom in settings.min_zoom..=settings.max_zoom { + let counter = + renderer::prepare(renderer, zoom, &tracks, || Ok(())).map_err(|e| err_to_py(&e))?; + + storage.prepare_zoom(zoom).map_err(|e| err_to_py(&e))?; + + renderer::colorize(renderer, counter, |rendered_tile| { + storage.store(zoom, rendered_tile.x, rendered_tile.y, &rendered_tile.data)?; + Ok(()) + }) + .map_err(|e| err_to_py(&e))?; + } + storage.finish().map_err(|e| err_to_py(&e))?; + + Ok(()) + }) +} + +/// Python bindings for the hittekaart heatmap tile generator. +/// +/// hittekaart renders GPS tracks (usually from GPX files) to heatmap tiles for consumption with +/// OpenStreetMap data. +/// +/// You can find more documentation about hittekaart in its README: +/// <https://gitlab.com/dunj3/hittekaart> +/// +/// You can find rendered docs as part of fietsboek's documentation: +/// <https://docs.fietsboek.org/developer/module/hittekaart_py.html> +#[pymodule] +fn hittekaart_py(py: Python<'_>, m: &Bound<'_, PyModule>) -> PyResult<()> { + m.add_class::<Track>()?; + m.add_class::<HeatmapRenderer>()?; + m.add_class::<MarktileRenderer>()?; + m.add_class::<TilehuntRenderer>()?; + m.add_class::<Storage>()?; + m.add_class::<Settings>()?; + m.add_function(wrap_pyfunction!(generate, m)?)?; + m.add("HitteError", py.get_type::<HitteError>())?; + Ok(()) +} diff --git a/hittekaart/Cargo.toml b/hittekaart/Cargo.toml new file mode 100644 index 0000000..62ec6e9 --- /dev/null +++ b/hittekaart/Cargo.toml @@ -0,0 +1,29 @@ +[package] +name = "hittekaart" +version = "0.1.0" +edition = "2021" +description = "Generates OSM heatmap tiles from GPX tracks" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[[bench]] +name = "hittebench" +harness = false + +[dependencies] +brotli = "3.3.4" +colorgrad = "0.6.2" +crossbeam-channel = "0.5.8" +flate2 = "1.0.26" +fnv = "1.0.7" +image = "0.24.6" +imageproc = "0.23.0" +nalgebra = "0.32" +num-traits = "0.2.15" +rayon = "1.7.0" +roxmltree = "0.18.0" +rusqlite = "0.29.0" +thiserror = "2.0.12" + +[dev-dependencies] +criterion = "0.5.0" diff --git a/benches/bench.gpx b/hittekaart/benches/bench.gpx index d5e80f8..d5e80f8 100644 --- a/benches/bench.gpx +++ b/hittekaart/benches/bench.gpx diff --git a/benches/hittebench.rs b/hittekaart/benches/hittebench.rs index 268df8f..268df8f 100644 --- a/benches/hittebench.rs +++ b/hittekaart/benches/hittebench.rs diff --git a/hittekaart/src/error.rs b/hittekaart/src/error.rs new file mode 100644 index 0000000..f5abd1b --- /dev/null +++ b/hittekaart/src/error.rs @@ -0,0 +1,36 @@ +//! Error definitions for hittekaart. +use std::{num::ParseFloatError, path::PathBuf, string::FromUtf8Error}; + +use thiserror::Error; + +use super::renderer::RenderedTile; + +#[derive(Error, Debug)] +pub enum Error { + #[error("crossbeam error")] + Crossbeam(#[from] crossbeam_channel::SendError::<RenderedTile>), + #[error("image processing error")] + Image(#[from] image::ImageError), + #[error("the latitude is invalid")] + InvalidLatitude(#[source] ParseFloatError), + #[error("the longitude is invalid")] + InvalidLongitude(#[source] ParseFloatError), + #[error("the output directory is invalid")] + InvalidOutputDirectory, + #[error("error when {0} because of an underlying I/O error")] + Io(&'static str, #[source] std::io::Error), + #[error("input has no latitude value")] + MissingLatitude, + #[error("input has no longitude value")] + MissingLongitude, + #[error("output file {0} already exists")] + OutputAlreadyExists(PathBuf), + #[error("SQLite error")] + Sqlite(#[from] rusqlite::Error), + #[error("invalid utf8 input data")] + Utf8(#[from] FromUtf8Error), + #[error("XML parse error")] + Xml(#[from] roxmltree::Error), +} + +pub type Result<T, E = Error> = std::result::Result<T, E>; diff --git a/src/gpx.rs b/hittekaart/src/gpx.rs index fb9e00e..68bd6fb 100644 --- a/src/gpx.rs +++ b/hittekaart/src/gpx.rs @@ -14,18 +14,26 @@ use std::{ path::Path, }; -use color_eyre::eyre::{eyre, Result}; use flate2::bufread::GzDecoder; use roxmltree::{Document, Node, NodeType}; +use super::error::{Error, Result}; + /// World coordinates. #[derive(Debug, Copy, Clone, PartialEq)] pub struct Coordinates { - longitude: f64, - latitude: f64, + pub longitude: f64, + pub latitude: f64, } impl Coordinates { + pub fn new(longitude: f64, latitude: f64) -> Self { + Self { + longitude, + latitude, + } + } + /// Calculates the [Web Mercator /// projection](https://en.wikipedia.org/wiki/Web_Mercator_projection) of the coordinates. /// @@ -64,12 +72,12 @@ pub fn extract_from_str(input: &str) -> Result<Vec<Coordinates>> { for point in segment.children().filter(is_track_point) { let latitude = point .attribute("lat") - .and_then(|l| l.parse::<f64>().ok()) - .ok_or_else(|| eyre!("Invalid latitude"))?; + .ok_or(Error::MissingLatitude) + .and_then(|l| l.parse::<f64>().map_err(Error::InvalidLatitude))?; let longitude = point .attribute("lon") - .and_then(|l| l.parse::<f64>().ok()) - .ok_or_else(|| eyre!("Invalid longitude"))?; + .ok_or(Error::MissingLongitude) + .and_then(|l| l.parse::<f64>().map_err(Error::InvalidLongitude))?; result.push(Coordinates { latitude, longitude, @@ -101,7 +109,9 @@ impl Compression { /// If the file does not end with any of the aforementioned extensions, an error is returned /// instead. pub fn suggest_from_path<P: AsRef<Path>>(path: P) -> Option<Compression> { - let Some(ext) = path.as_ref().extension() else { return None }; + let Some(ext) = path.as_ref().extension() else { + return None; + }; if OsStr::new("br") == ext { Some(Compression::Brotli) } else if [OsStr::new("gz"), OsStr::new("gzip")].contains(&ext) { @@ -122,15 +132,23 @@ pub fn extract_from_file<P: AsRef<Path>>( compression: Compression, ) -> Result<Vec<Coordinates>> { let content = match compression { - Compression::None => fs::read_to_string(path)?, + Compression::None => fs::read_to_string(path).map_err(|e| Error::Io("reading file", e))?, Compression::Gzip => { let mut result = String::new(); - GzDecoder::new(BufReader::new(File::open(path)?)).read_to_string(&mut result)?; + GzDecoder::new(BufReader::new( + File::open(path).map_err(|e| Error::Io("opening file", e))?, + )) + .read_to_string(&mut result) + .map_err(|e| Error::Io("reading file", e))?; result } Compression::Brotli => { let mut result = Vec::new(); - brotli::BrotliDecompress(&mut BufReader::new(File::open(path)?), &mut result)?; + brotli::BrotliDecompress( + &mut BufReader::new(File::open(path).map_err(|e| Error::Io("opening file", e))?), + &mut result, + ) + .map_err(|e| Error::Io("decompressing", e))?; String::from_utf8(result)? } }; diff --git a/src/layer.rs b/hittekaart/src/layer.rs index dec2419..03a168b 100644 --- a/src/layer.rs +++ b/hittekaart/src/layer.rs @@ -9,7 +9,6 @@ use std::{ path::Path, }; -use color_eyre::eyre::Result; use fnv::FnvHashMap; use image::{ codecs::png::{CompressionType, FilterType, PngEncoder}, @@ -18,6 +17,8 @@ use image::{ use num_traits::Zero; use rayon::iter::{IntoParallelIterator, ParallelIterator}; +use super::error::{Error, Result}; + /// Height of a single tile. pub const TILE_HEIGHT: u64 = 256; /// Width of a single tile. @@ -140,7 +141,7 @@ where /// Saves the given image buffer to the given path. pub fn compress_png<P: AsRef<Path>>(image: &RgbaImage, path: P) -> Result<()> { - let outstream = BufWriter::new(File::create(path)?); + let outstream = BufWriter::new(File::create(path).map_err(|e| Error::Io("writing PNG", e))?); compress_png_stream(image, outstream) } diff --git a/src/lib.rs b/hittekaart/src/lib.rs index d6a6a46..3a4c7a3 100644 --- a/src/lib.rs +++ b/hittekaart/src/lib.rs @@ -5,6 +5,7 @@ //! //! This library therefore contains an API that is tailored to the use case of the `hittekaart` //! binary. +pub mod error; pub mod gpx; pub mod layer; pub mod renderer; diff --git a/src/renderer/heatmap.rs b/hittekaart/src/renderer/heatmap.rs index 0c4f93f..187c8f3 100644 --- a/src/renderer/heatmap.rs +++ b/hittekaart/src/renderer/heatmap.rs @@ -1,12 +1,11 @@ //! Actual rendering functions for heatmaps. //! -//! We begin the rendering by using [`render_heatcounter`] to turn a list of GPX tracks into a +//! We begin the rendering by having `Renderer::prepare()` to turn a list of GPX tracks into a //! [`HeatCounter`], which is basically a grayscale heatmap, where each pixel represents the number //! of tracks that goes through this pixel. //! -//! We then render the colored heatmap tiles using [`lazy_colorization`], which provides us with +//! We then render the colored heatmap tiles in `Renderer::colorize()`, which provides us with //! colorful PNG data. -use color_eyre::{eyre::Result, Report}; use crossbeam_channel::Sender; use image::{ImageBuffer, Luma, Pixel, RgbaImage}; use nalgebra::{vector, Vector2}; @@ -14,6 +13,7 @@ use rayon::iter::ParallelIterator; use super::{ super::{ + error::{Error, Result}, gpx::Coordinates, layer::{self, TileLayer}, }, @@ -204,7 +204,7 @@ impl super::Renderer for Renderer { y: tile_y, data, })?; - Ok::<(), Report>(()) + Ok::<(), Error>(()) }) } diff --git a/src/renderer/marktile.rs b/hittekaart/src/renderer/marktile.rs index 1e3020f..3523e69 100644 --- a/src/renderer/marktile.rs +++ b/hittekaart/src/renderer/marktile.rs @@ -4,12 +4,12 @@ //! //! Note that is version of "tile hunt" is a bit silly, as the tile size changes with the zoom //! level. For a better version, the "tile hunt size" should be fixed to a given zoom. -use color_eyre::eyre::Result; use crossbeam_channel::Sender; use fnv::FnvHashSet; use super::{ super::{ + error::Result, gpx::Coordinates, layer::{TILE_HEIGHT, TILE_WIDTH}, }, diff --git a/src/renderer/mod.rs b/hittekaart/src/renderer/mod.rs index 73c2e87..40fd5fa 100644 --- a/src/renderer/mod.rs +++ b/hittekaart/src/renderer/mod.rs @@ -1,10 +1,12 @@ //! Generic "tile rendering" methods. use std::thread; -use color_eyre::Result; use crossbeam_channel::Sender; -use super::gpx::Coordinates; +use super::{ + error::Result, + gpx::Coordinates, +}; pub mod heatmap; pub mod marktile; diff --git a/src/renderer/tile-marked.png b/hittekaart/src/renderer/tile-marked.png Binary files differindex 0b05ce2..0b05ce2 100644 --- a/src/renderer/tile-marked.png +++ b/hittekaart/src/renderer/tile-marked.png diff --git a/src/renderer/tilehunt.rs b/hittekaart/src/renderer/tilehunt.rs index 9081523..5329bf2 100644 --- a/src/renderer/tilehunt.rs +++ b/hittekaart/src/renderer/tilehunt.rs @@ -6,7 +6,6 @@ //! level. For a better version, the "tile hunt size" should be fixed to a given zoom. use std::cmp::Ordering; -use color_eyre::eyre::Result; use crossbeam_channel::Sender; use fnv::{FnvHashMap, FnvHashSet}; use image::RgbaImage; @@ -15,6 +14,7 @@ use rayon::iter::{IntoParallelIterator, ParallelIterator}; use super::{ super::{ + error::Result, gpx::Coordinates, layer::{self, TILE_HEIGHT, TILE_WIDTH}, }, diff --git a/src/storage.rs b/hittekaart/src/storage.rs index 9e6b270..c21627f 100644 --- a/src/storage.rs +++ b/hittekaart/src/storage.rs @@ -4,10 +4,6 @@ //! tiles. Usually you want to have a `dyn Storage`, and then instantiate it with a concrete //! implementation (either [`Folder`] or [`Sqlite`]), depending on the command line flags or //! similar. -use color_eyre::{ - eyre::{bail, WrapErr}, - Result, -}; use rusqlite::{params, Connection}; use std::{ fs, @@ -15,6 +11,8 @@ use std::{ path::{Path, PathBuf}, }; +use super::error::{Error, Result}; + /// The trait that provides the interface for storing tiles. pub trait Storage { /// Prepare the storage. @@ -60,13 +58,12 @@ impl Storage for Folder { let metadata = fs::metadata(path); match metadata { Err(e) if e.kind() == ErrorKind::NotFound => { - let parent = path.parent().unwrap_or_else(|| Path::new("/")); fs::create_dir(path) - .context(format!("Could not create output directory at {parent:?}"))? + .map_err(|e| Error::Io("creating the output directory", e))? } - Err(e) => Err(e).context("Error while checking output directory")?, + Err(e) => Err(Error::Io("checking the output direectory", e))?, Ok(m) if m.is_dir() => (), - Ok(_) => bail!("Output directory is not a directory"), + Ok(_) => Err(Error::InvalidOutputDirectory)?, } Ok(()) } @@ -75,7 +72,8 @@ impl Storage for Folder { let target = [&self.base_dir, &zoom.to_string().into()] .iter() .collect::<PathBuf>(); - fs::create_dir(target)?; + fs::create_dir(target) + .map_err(|e| Error::Io("creating the zoom directory", e))?; Ok(()) } @@ -83,12 +81,14 @@ impl Storage for Folder { let folder = self.base_dir.join(zoom.to_string()).join(x.to_string()); let metadata = folder.metadata(); match metadata { - Err(_) => fs::create_dir(&folder)?, - Ok(m) if !m.is_dir() => bail!("Output path is not a directory"), + Err(_) => fs::create_dir(&folder) + .map_err(|e| Error::Io("creating the output directory", e))?, + Ok(m) if !m.is_dir() => Err(Error::InvalidOutputDirectory)?, _ => {} } let file = folder.join(format!("{y}.png")); - fs::write(file, data)?; + fs::write(file, data) + .map_err(|e| Error::Io("writing the output file", e))?; Ok(()) } @@ -123,7 +123,7 @@ impl Sqlite { pub fn connect<P: AsRef<Path>>(file: P) -> Result<Self> { let path = file.as_ref(); if fs::metadata(path).is_ok() { - bail!("Path {path:?} already exists, refusing to open") + return Err(Error::OutputAlreadyExists(path.to_path_buf())); } let connection = Connection::open(path)?; Ok(Sqlite { connection }) |