From a10f466538aa78ee9fbe6b03b173a7df75e76d72 Mon Sep 17 00:00:00 2001 From: Oliver Walter Date: Mon, 1 Sep 2025 00:47:38 +0200 Subject: [PATCH] inital working setup --- .gitignore | 1 + .vscode/settings.json | 6 + Cargo.lock | 2999 ++++++++++++++++++++++++++++++++++++ Cargo.toml | 12 + killmails_display.png | Bin 0 -> 3297 bytes output.png | Bin 0 -> 54522 bytes src/display.rs | 116 ++ src/killinfo.rs | 138 ++ src/lib.rs | 3 + src/main.rs | 122 ++ src/model/alliance.rs | 9 + src/model/character.rs | 8 + src/model/corporation.rs | 9 + src/model/killmail.rs | 31 + src/model/mod.rs | 5 + src/model/ship.rs | 8 + src/services/esi_static.rs | 256 +++ src/services/mod.rs | 2 + src/services/zkill.rs | 214 +++ 19 files changed, 3939 insertions(+) create mode 100644 .gitignore create mode 100644 .vscode/settings.json create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 killmails_display.png create mode 100644 output.png create mode 100644 src/display.rs create mode 100644 src/killinfo.rs create mode 100644 src/lib.rs create mode 100644 src/main.rs create mode 100644 src/model/alliance.rs create mode 100644 src/model/character.rs create mode 100644 src/model/corporation.rs create mode 100644 src/model/killmail.rs create mode 100644 src/model/mod.rs create mode 100644 src/model/ship.rs create mode 100644 src/services/esi_static.rs create mode 100644 src/services/mod.rs create mode 100644 src/services/zkill.rs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/target diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..94f1b80 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "cSpell.words": [ + "Killmail", + "killpaper" + ] +} \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..78dab3f --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,2999 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "addr2line" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +dependencies = [ + "alloc-no-stdlib", +] + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "ansi_term" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" +dependencies = [ + "winapi 0.3.9", +] + +[[package]] +name = "async-compression" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bee399cc3a623ec5a2db2c5b90ee0190a2260241fbe0c023ac8f7bab426aaf8" +dependencies = [ + "brotli", + "compression-codecs", + "compression-core", + "flate2", + "futures-core", + "memchr", + "pin-project-lite", + "tokio 1.47.1", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +dependencies = [ + "hermit-abi 0.1.19", + "libc", + "winapi 0.3.9", +] + +[[package]] +name = "autocfg" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dde43e75fd43e8a1bf86103336bc699aa8d17ad1be60c76c0bdfd4828e19b78" +dependencies = [ + "autocfg 1.5.0", +] + +[[package]] +name = "autocfg" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" + +[[package]] +name = "az" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b7e4c2464d97fe331d41de9d5db0def0a96f4d823b8b32a2efd503578988973" + +[[package]] +name = "backtrace" +version = "0.3.75" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" +dependencies = [ + "addr2line", + "cfg-if 1.0.3", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-targets 0.52.6", +] + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34efbcccd345379ca2868b2b2c9d3782e9cc58ba87bc7d79d5b53d9c9ae6f25d" + +[[package]] +name = "brotli" +version = "8.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bd8b9603c7aa97359dbd97ecf258968c95f3adddd6db2f7e7a5bef101c84560" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bumpalo" +version = "3.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" + +[[package]] +name = "bytemuck" +version = "1.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3995eaeebcdf32f91f980d360f78732ddc061097ab4e39991ae7a6ace9194677" + +[[package]] +name = "byteorder" +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 = "bytes" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "206fdffcfa2df7cbe15601ef46c813fce0965eb3286db6b56c583b814b51c81c" +dependencies = [ + "byteorder", + "either", + "iovec", +] + +[[package]] +name = "bytes" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" + +[[package]] +name = "cc" +version = "1.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42bc4aea80032b7bf409b0bc7ccad88853858911b7713a8062fdc0623867bedc" +dependencies = [ + "shlex", +] + +[[package]] +name = "cfg-if" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" + +[[package]] +name = "cfg-if" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" + +[[package]] +name = "chrono" +version = "0.4.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "wasm-bindgen", + "windows-link", +] + +[[package]] +name = "clap" +version = "2.34.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" +dependencies = [ + "ansi_term", + "atty", + "bitflags 1.3.2", + "strsim", + "textwrap", + "unicode-width", + "vec_map", +] + +[[package]] +name = "cloudabi" +version = "0.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "compression-codecs" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7eea68f0e02c2b0aa8856e9a9478444206d4b6828728e7b0697c0f8cca265cb" +dependencies = [ + "brotli", + "compression-core", + "flate2", + "futures-core", + "memchr", + "pin-project-lite", +] + +[[package]] +name = "compression-core" +version = "0.4.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e47641d3deaf41fb1538ac1f54735925e275eaf3bf4d55c81b137fba797e5cbb" + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "crc32fast" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +dependencies = [ + "cfg-if 1.0.3", +] + +[[package]] +name = "crossbeam-deque" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c20ff29ded3204c5106278a81a38f4b482636ed4fa1e6cfbeef193291beb29ed" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", + "maybe-uninit", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "058ed274caafc1f60c4997b5fc07bf7dc7cca454af7c6e81edffe5f33f70dace" +dependencies = [ + "autocfg 1.5.0", + "cfg-if 0.1.10", + "crossbeam-utils", + "lazy_static", + "maybe-uninit", + "memoffset", + "scopeguard", +] + +[[package]] +name = "crossbeam-queue" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "774ba60a54c213d409d5353bda12d49cd68d14e45036a285234c8d6f91f92570" +dependencies = [ + "cfg-if 0.1.10", + "crossbeam-utils", + "maybe-uninit", +] + +[[package]] +name = "crossbeam-utils" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8" +dependencies = [ + "autocfg 1.5.0", + "cfg-if 0.1.10", + "lazy_static", +] + +[[package]] +name = "d" +version = "0.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5d098a39024957345cff847d6196b8252500ed26251934f0b26f58e76f1d041" +dependencies = [ + "clap", + "failure", + "futures", + "futures-fs", + "hyper 0.12.36", + "log 0.4.27", + "mime_guess", + "percent-encoding 1.0.1", + "pretty_env_logger", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "embedded-graphics" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0649998afacf6d575d126d83e68b78c0ab0e00ca2ac7e9b3db11b4cbe8274ef0" +dependencies = [ + "az", + "byteorder", + "embedded-graphics-core", + "float-cmp", + "micromath", +] + +[[package]] +name = "embedded-graphics-core" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba9ecd261f991856250d2207f6d8376946cd9f412a2165d3b75bc87a0bc7a044" +dependencies = [ + "az", + "byteorder", +] + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if 1.0.3", +] + +[[package]] +name = "env_logger" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aafcde04e90a5226a6443b7aabdb016ba2f8307c847d524724bd9b346dd1a2d3" +dependencies = [ + "atty", + "humantime", + "log 0.4.27", + "regex", + "termcolor", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" +dependencies = [ + "libc", + "windows-sys 0.60.2", +] + +[[package]] +name = "failure" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d32e9bd16cc02eae7db7ef620b392808b89f6a5e16bb3497d159c6b92a0f4f86" +dependencies = [ + "backtrace", + "failure_derive", +] + +[[package]] +name = "failure_derive" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa4da3c766cd7a0db8242e326e9e4e081edd567072893ed320008189715366a4" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "synstructure 0.12.6", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "fdeflate" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "flate2" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "float-cmp" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" +dependencies = [ + "num-traits", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding 2.3.2", +] + +[[package]] +name = "fuchsia-cprng" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" + +[[package]] +name = "fuchsia-zircon" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" +dependencies = [ + "bitflags 1.3.2", + "fuchsia-zircon-sys", +] + +[[package]] +name = "fuchsia-zircon-sys" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" + +[[package]] +name = "futures" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a471a38ef8ed83cd6e40aa59c1ffe17db6855c18e3604d9c4ed8c08ebc28678" + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-cpupool" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4" +dependencies = [ + "futures", + "num_cpus", +] + +[[package]] +name = "futures-fs" +version = "0.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b9f2aeb603383051bab2898cb253a0efed9b590582d0b7baaa0b25de2a536d5" +dependencies = [ + "bytes 0.4.12", + "futures", + "futures-cpupool", +] + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-core", + "futures-io", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "getrandom" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" +dependencies = [ + "cfg-if 1.0.3", + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +dependencies = [ + "cfg-if 1.0.3", + "libc", + "r-efi", + "wasi 0.14.3+wasi-0.2.4", +] + +[[package]] +name = "gimli" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" + +[[package]] +name = "h2" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5b34c246847f938a410a03c5458c7fee2274436675e76d8b903c08efc29c462" +dependencies = [ + "byteorder", + "bytes 0.4.12", + "fnv", + "futures", + "http 0.1.21", + "indexmap 1.9.3", + "log 0.4.27", + "slab", + "string", + "tokio-io", +] + +[[package]] +name = "h2" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" +dependencies = [ + "atomic-waker", + "bytes 1.10.1", + "fnv", + "futures-core", + "futures-sink", + "http 1.3.1", + "indexmap 2.11.0", + "slab", + "tokio 1.47.1", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" + +[[package]] +name = "hermit-abi" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" +dependencies = [ + "libc", +] + +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + +[[package]] +name = "http" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6ccf5ede3a895d8856620237b2f02972c1bbc78d2965ad7fe8838d4a0ed41f0" +dependencies = [ + "bytes 0.4.12", + "fnv", + "itoa 0.4.8", +] + +[[package]] +name = "http" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +dependencies = [ + "bytes 1.10.1", + "fnv", + "itoa 1.0.15", +] + +[[package]] +name = "http-body" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6741c859c1b2463a423a1dbce98d418e6c3c3fc720fb0d45528657320920292d" +dependencies = [ + "bytes 0.4.12", + "futures", + "http 0.1.21", + "tokio-buf", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes 1.10.1", + "http 1.3.1", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes 1.10.1", + "futures-core", + "http 1.3.1", + "http-body 1.0.1", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "humantime" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df004cfca50ef23c36850aaaa59ad52cc70d0e90243c3c7737a4dd32dc7a3c4f" +dependencies = [ + "quick-error", +] + +[[package]] +name = "hyper" +version = "0.12.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c843caf6296fc1f93444735205af9ed4e109a539005abb2564ae1d6fad34c52" +dependencies = [ + "bytes 0.4.12", + "futures", + "futures-cpupool", + "h2 0.1.26", + "http 0.1.21", + "http-body 0.1.0", + "httparse", + "iovec", + "itoa 0.4.8", + "log 0.4.27", + "net2", + "rustc_version", + "time", + "tokio 0.1.22", + "tokio-buf", + "tokio-executor", + "tokio-io", + "tokio-reactor", + "tokio-tcp", + "tokio-threadpool", + "tokio-timer", + "want 0.2.0", +] + +[[package]] +name = "hyper" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" +dependencies = [ + "atomic-waker", + "bytes 1.10.1", + "futures-channel", + "futures-core", + "h2 0.4.12", + "http 1.3.1", + "http-body 1.0.1", + "httparse", + "itoa 1.0.15", + "pin-project-lite", + "pin-utils", + "smallvec 1.15.1", + "tokio 1.47.1", + "want 0.3.1", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" +dependencies = [ + "http 1.3.1", + "hyper 1.7.0", + "hyper-util", + "rustls", + "rustls-pki-types", + "tokio 1.47.1", + "tokio-rustls", + "tower-service", +] + +[[package]] +name = "hyper-tls" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" +dependencies = [ + "bytes 1.10.1", + "http-body-util", + "hyper 1.7.0", + "hyper-util", + "native-tls", + "tokio 1.47.1", + "tokio-native-tls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d9b05277c7e8da2c93a568989bb6207bef0112e8d17df7a6eda4a3cf143bc5e" +dependencies = [ + "base64", + "bytes 1.10.1", + "futures-channel", + "futures-core", + "futures-util", + "http 1.3.1", + "http-body 1.0.1", + "hyper 1.7.0", + "ipnet", + "libc", + "percent-encoding 2.3.2", + "pin-project-lite", + "socket2", + "system-configuration", + "tokio 1.47.1", + "tower-service", + "tracing", + "windows-registry", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log 0.4.27", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "icu_collections" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "200072f5d0e3614556f94a9930d5dc3e0662a652823904c3a75dc3b0af7fee47" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde2700ccaed3872079a65fb1a78f6c0a36c91570f28755dda67bc8f7d9f00a" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436880e8e18df4d7bbc06d58432329d6458cc84531f7ac5f024e93deadb37979" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec 1.15.1", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00210d6893afc98edb752b664b8890f0ef174c8adbb8d0be9710fa66fbbf72d3" + +[[package]] +name = "icu_properties" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "016c619c1eeb94efb86809b015c58f479963de65bdb6253345c1a1276f22e32b" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "potential_utf", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "298459143998310acd25ffe6810ed544932242d3f07083eee1084d83a71bd632" + +[[package]] +name = "icu_provider" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03c80da27b5f4187909049ee2d72f276f0d9f99a42c306bd0131ecfe04d8e5af" +dependencies = [ + "displaydoc", + "icu_locale_core", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec 1.15.1", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "image" +version = "0.25.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db35664ce6b9810857a38a906215e75a9c879f0696556a39f59c62829710251a" +dependencies = [ + "bytemuck", + "byteorder-lite", + "num-traits", + "png", + "zune-core", + "zune-jpeg", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg 1.5.0", + "hashbrown 0.12.3", +] + +[[package]] +name = "indexmap" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2481980430f9f78649238835720ddccc57e52df14ffce1c6f37391d61b563e9" +dependencies = [ + "equivalent", + "hashbrown 0.15.5", +] + +[[package]] +name = "io-uring" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" +dependencies = [ + "bitflags 2.9.3", + "cfg-if 1.0.3", + "libc", +] + +[[package]] +name = "iovec" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2b3ea6ff95e175473f8ffe6a7eb7c00d054240321b84c57051175fe3c1e075e" +dependencies = [ + "libc", +] + +[[package]] +name = "ipnet" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" + +[[package]] +name = "iri-string" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbc5ebe9c3a1a7a5127f920a418f7585e9e758e911d0466ed004f393b0e380b2" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "itoa" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "kernel32-sys" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" +dependencies = [ + "winapi 0.2.8", + "winapi-build", +] + +[[package]] +name = "killpaper" +version = "0.1.0" +dependencies = [ + "d", + "embedded-graphics", + "image", + "reqwest", + "serde", + "serde_json", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libc" +version = "0.2.175" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" + +[[package]] +name = "linux-raw-sys" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" + +[[package]] +name = "litemap" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" + +[[package]] +name = "lock_api" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4da24a77a3d8a6d4862d95f72e6fdb9c09a643ecdb402d754004a557f2bec75" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b" +dependencies = [ + "log 0.4.27", +] + +[[package]] +name = "log" +version = "0.4.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" + +[[package]] +name = "maybe-uninit" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" + +[[package]] +name = "memchr" +version = "2.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" + +[[package]] +name = "memoffset" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "043175f069eda7b85febe4a74abbaeff828d9f8b448515d3151a14a3542811aa" +dependencies = [ + "autocfg 1.5.0", +] + +[[package]] +name = "micromath" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3c8dda44ff03a2f238717214da50f65d5a53b45cd213a7370424ffdb6fae815" + +[[package]] +name = "mime" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba626b8a6de5da682e1caa06bdb42a335aee5a84db8e5046a3e8ab17ba0a3ae0" +dependencies = [ + "log 0.3.9", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "mime_guess" +version = "1.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "216929a5ee4dd316b1702eedf5e74548c123d370f47841ceaac38ca154690ca3" +dependencies = [ + "mime 0.2.6", + "phf", + "phf_codegen", + "unicase", +] + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "0.6.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4afd66f5b91bf2a3bc13fad0e21caedac168ca4c707504e75585648ae80e4cc4" +dependencies = [ + "cfg-if 0.1.10", + "fuchsia-zircon", + "fuchsia-zircon-sys", + "iovec", + "kernel32-sys", + "libc", + "log 0.4.27", + "miow", + "net2", + "slab", + "winapi 0.2.8", +] + +[[package]] +name = "mio" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" +dependencies = [ + "libc", + "wasi 0.11.1+wasi-snapshot-preview1", + "windows-sys 0.59.0", +] + +[[package]] +name = "miow" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebd808424166322d4a38da87083bfddd3ac4c131334ed55856112eb06d46944d" +dependencies = [ + "kernel32-sys", + "net2", + "winapi 0.2.8", + "ws2_32-sys", +] + +[[package]] +name = "native-tls" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" +dependencies = [ + "libc", + "log 0.4.27", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "net2" +version = "0.2.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b13b648036a2339d06de780866fbdfda0dde886de7b3af2ddeba8b14f4ee34ac" +dependencies = [ + "cfg-if 0.1.10", + "libc", + "winapi 0.3.9", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg 1.5.0", +] + +[[package]] +name = "num_cpus" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" +dependencies = [ + "hermit-abi 0.5.2", + "libc", +] + +[[package]] +name = "object" +version = "0.36.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" + +[[package]] +name = "openssl" +version = "0.10.73" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" +dependencies = [ + "bitflags 2.9.3", + "cfg-if 1.0.3", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", +] + +[[package]] +name = "openssl-macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "openssl-probe" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" + +[[package]] +name = "openssl-sys" +version = "0.9.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "parking_lot" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f842b1982eb6c2fe34036a4fbfb06dd185a3f5c8edfaacdf7d1ea10b07de6252" +dependencies = [ + "lock_api", + "parking_lot_core", + "rustc_version", +] + +[[package]] +name = "parking_lot_core" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda66b810a62be75176a80873726630147a5ca780cd33921e0b5709033e66b0a" +dependencies = [ + "cfg-if 0.1.10", + "cloudabi", + "libc", + "redox_syscall", + "rustc_version", + "smallvec 0.6.14", + "winapi 0.3.9", +] + +[[package]] +name = "percent-encoding" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "phf" +version = "0.7.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3da44b85f8e8dfaec21adae67f95d93244b2ecf6ad2a692320598dcc8e6dd18" +dependencies = [ + "phf_shared", +] + +[[package]] +name = "phf_codegen" +version = "0.7.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b03e85129e324ad4166b06b2c7491ae27fe3ec353af72e72cd1654c7225d517e" +dependencies = [ + "phf_generator", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.7.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09364cc93c159b8b06b1f4dd8a4398984503483891b0c26b867cf431fb132662" +dependencies = [ + "phf_shared", + "rand", +] + +[[package]] +name = "phf_shared" +version = "0.7.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "234f71a15de2288bcb7e3b6515828d22af7ec8598ee6d24c3b526fa0a80b67a0" +dependencies = [ + "siphasher", + "unicase", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "png" +version = "0.17.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "potential_utf" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" +dependencies = [ + "zerovec", +] + +[[package]] +name = "pretty_env_logger" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "717ee476b1690853d222af4634056d830b5197ffd747726a9a1eee6da9f49074" +dependencies = [ + "chrono", + "env_logger", + "log 0.4.27", +] + +[[package]] +name = "proc-macro2" +version = "1.0.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + +[[package]] +name = "quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "rand" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca" +dependencies = [ + "autocfg 0.1.8", + "libc", + "rand_chacha", + "rand_core 0.4.2", + "rand_hc", + "rand_isaac", + "rand_jitter", + "rand_os", + "rand_pcg", + "rand_xorshift", + "winapi 0.3.9", +] + +[[package]] +name = "rand_chacha" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef" +dependencies = [ + "autocfg 0.1.8", + "rand_core 0.3.1", +] + +[[package]] +name = "rand_core" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" +dependencies = [ + "rand_core 0.4.2", +] + +[[package]] +name = "rand_core" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" + +[[package]] +name = "rand_hc" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" +dependencies = [ + "rand_core 0.3.1", +] + +[[package]] +name = "rand_isaac" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" +dependencies = [ + "rand_core 0.3.1", +] + +[[package]] +name = "rand_jitter" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b" +dependencies = [ + "libc", + "rand_core 0.4.2", + "winapi 0.3.9", +] + +[[package]] +name = "rand_os" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071" +dependencies = [ + "cloudabi", + "fuchsia-cprng", + "libc", + "rand_core 0.4.2", + "rdrand", + "winapi 0.3.9", +] + +[[package]] +name = "rand_pcg" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44" +dependencies = [ + "autocfg 0.1.8", + "rand_core 0.4.2", +] + +[[package]] +name = "rand_xorshift" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c" +dependencies = [ + "rand_core 0.3.1", +] + +[[package]] +name = "rdrand" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" +dependencies = [ + "rand_core 0.3.1", +] + +[[package]] +name = "redox_syscall" +version = "0.1.57" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" + +[[package]] +name = "regex" +version = "1.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23d7fd106d8c02486a8d64e778353d1cffe08ce79ac2e82f540c86d0facf6912" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b9458fa0bfeeac22b5ca447c63aaf45f28439a709ccd244698632f9aa6394d6" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001" + +[[package]] +name = "reqwest" +version = "0.12.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d429f34c8092b2d42c7c93cec323bb4adeb7c67698f70839adec842ec10c7ceb" +dependencies = [ + "async-compression", + "base64", + "bytes 1.10.1", + "encoding_rs", + "futures-channel", + "futures-core", + "futures-util", + "h2 0.4.12", + "http 1.3.1", + "http-body 1.0.1", + "http-body-util", + "hyper 1.7.0", + "hyper-rustls", + "hyper-tls", + "hyper-util", + "js-sys", + "log 0.4.27", + "mime 0.3.17", + "native-tls", + "percent-encoding 2.3.2", + "pin-project-lite", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio 1.47.1", + "tokio-native-tls", + "tokio-util", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if 1.0.3", + "getrandom 0.2.16", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" + +[[package]] +name = "rustc_version" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8" +dependencies = [ + "bitflags 2.9.3", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.60.2", +] + +[[package]] +name = "rustls" +version = "0.23.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ebcbd2f03de0fc1122ad9bb24b127a5a6cd51d72604a3f3c50ac459762b6cc" +dependencies = [ + "once_cell", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pki-types" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "229a4a4c221013e7e1f1a043678c5cc39fe5171437c88fb47151a21e6f5b5c79" +dependencies = [ + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a17884ae0c1b773f1ccd2bd4a8c72f16da897310a98b0e84bf349ad5ead92fc" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "schannel" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "security-framework" +version = "2.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" +dependencies = [ + "bitflags 2.9.3", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" +dependencies = [ + "semver-parser", +] + +[[package]] +name = "semver-parser" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" + +[[package]] +name = "serde" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "serde_json" +version = "1.0.143" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d401abef1d108fbd9cbaebc3e46611f4b1021f714a0597a71f41ee463f5f4a5a" +dependencies = [ + "itoa 1.0.15", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa 1.0.15", + "ryu", + "serde", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" + +[[package]] +name = "siphasher" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b8de496cf83d4ed58b6be86c3a275b8602f6ffe98d3024a869e124147a9a3ac" + +[[package]] +name = "slab" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" + +[[package]] +name = "smallvec" +version = "0.6.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97fcaeba89edba30f044a10c6a3cc39df9c3f17d7cd829dd1446cab35f890e0" +dependencies = [ + "maybe-uninit", +] + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" + +[[package]] +name = "socket2" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "string" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d24114bfcceb867ca7f71a0d3fe45d45619ec47a6fbfa98cb14e14250bfa5d6d" +dependencies = [ + "bytes 0.4.12", +] + +[[package]] +name = "strsim" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "unicode-xid", +] + +[[package]] +name = "synstructure" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "system-configuration" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" +dependencies = [ + "bitflags 2.9.3", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "tempfile" +version = "3.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15b61f8f20e3a6f7e0649d825294eaf317edce30f82cf6026e7e4cb9222a7d1e" +dependencies = [ + "fastrand", + "getrandom 0.3.3", + "once_cell", + "rustix", + "windows-sys 0.60.2", +] + +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "textwrap" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" +dependencies = [ + "unicode-width", +] + +[[package]] +name = "time" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a" +dependencies = [ + "libc", + "wasi 0.10.0+wasi-snapshot-preview1", + "winapi 0.3.9", +] + +[[package]] +name = "tinystr" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d4f6d1145dcb577acf783d4e601bc1d76a13337bb54e6233add580b07344c8b" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tokio" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a09c0b5bb588872ab2f09afa13ee6e9dac11e10a0ec9e8e3ba39a5a5d530af6" +dependencies = [ + "bytes 0.4.12", + "futures", + "mio 0.6.23", + "num_cpus", + "tokio-current-thread", + "tokio-executor", + "tokio-io", + "tokio-reactor", + "tokio-threadpool", + "tokio-timer", +] + +[[package]] +name = "tokio" +version = "1.47.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" +dependencies = [ + "backtrace", + "bytes 1.10.1", + "io-uring", + "libc", + "mio 1.0.4", + "pin-project-lite", + "slab", + "socket2", + "windows-sys 0.59.0", +] + +[[package]] +name = "tokio-buf" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fb220f46c53859a4b7ec083e41dec9778ff0b1851c0942b211edb89e0ccdc46" +dependencies = [ + "bytes 0.4.12", + "either", + "futures", +] + +[[package]] +name = "tokio-current-thread" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1de0e32a83f131e002238d7ccde18211c0a5397f60cbfffcb112868c2e0e20e" +dependencies = [ + "futures", + "tokio-executor", +] + +[[package]] +name = "tokio-executor" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb2d1b8f4548dbf5e1f7818512e9c406860678f29c300cdf0ebac72d1a3a1671" +dependencies = [ + "crossbeam-utils", + "futures", +] + +[[package]] +name = "tokio-io" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57fc868aae093479e3131e3d165c93b1c7474109d13c90ec0dda2a1bbfff0674" +dependencies = [ + "bytes 0.4.12", + "futures", + "log 0.4.27", +] + +[[package]] +name = "tokio-native-tls" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" +dependencies = [ + "native-tls", + "tokio 1.47.1", +] + +[[package]] +name = "tokio-reactor" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09bc590ec4ba8ba87652da2068d150dcada2cfa2e07faae270a5e0409aa51351" +dependencies = [ + "crossbeam-utils", + "futures", + "lazy_static", + "log 0.4.27", + "mio 0.6.23", + "num_cpus", + "parking_lot", + "slab", + "tokio-executor", + "tokio-io", + "tokio-sync", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" +dependencies = [ + "rustls", + "tokio 1.47.1", +] + +[[package]] +name = "tokio-sync" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edfe50152bc8164fcc456dab7891fa9bf8beaf01c5ee7e1dd43a397c3cf87dee" +dependencies = [ + "fnv", + "futures", +] + +[[package]] +name = "tokio-tcp" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98df18ed66e3b72e742f185882a9e201892407957e45fbff8da17ae7a7c51f72" +dependencies = [ + "bytes 0.4.12", + "futures", + "iovec", + "mio 0.6.23", + "tokio-io", + "tokio-reactor", +] + +[[package]] +name = "tokio-threadpool" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df720b6581784c118f0eb4310796b12b1d242a7eb95f716a8367855325c25f89" +dependencies = [ + "crossbeam-deque", + "crossbeam-queue", + "crossbeam-utils", + "futures", + "lazy_static", + "log 0.4.27", + "num_cpus", + "slab", + "tokio-executor", +] + +[[package]] +name = "tokio-timer" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93044f2d313c95ff1cb7809ce9a7a05735b012288a888b62d4434fd58c94f296" +dependencies = [ + "crossbeam-utils", + "futures", + "slab", + "tokio-executor", +] + +[[package]] +name = "tokio-util" +version = "0.7.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14307c986784f72ef81c89db7d9e28d6ac26d16213b109ea501696195e6e3ce5" +dependencies = [ + "bytes 1.10.1", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio 1.47.1", +] + +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio 1.47.1", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-http" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" +dependencies = [ + "bitflags 2.9.3", + "bytes 1.10.1", + "futures-util", + "http 1.3.1", + "http-body 1.0.1", + "iri-string", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d12581f227e93f094d3af2ae690a574abb8a2b9b7a96e7cfe9647b2b617678" +dependencies = [ + "once_cell", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "unicase" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4765f83163b74f957c797ad9253caf97f103fb064d3999aea9568d09fc8a33" +dependencies = [ + "version_check", +] + +[[package]] +name = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" + +[[package]] +name = "unicode-width" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding 2.3.2", + "serde", +] + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + +[[package]] +name = "vec_map" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" + +[[package]] +name = "version_check" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" + +[[package]] +name = "want" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6395efa4784b027708f7451087e647ec73cc74f5d9bc2e418404248d679a230" +dependencies = [ + "futures", + "log 0.4.27", + "try-lock", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.10.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasi" +version = "0.14.3+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a51ae83037bdd272a9e28ce236db8c07016dd0d50c27038b3f407533c030c95" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +dependencies = [ + "cfg-if 1.0.3", + "once_cell", + "rustversion", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +dependencies = [ + "bumpalo", + "log 0.4.27", + "proc-macro2", + "quote", + "syn 2.0.106", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +dependencies = [ + "cfg-if 1.0.3", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "web-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "winapi" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-build" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0978bf7171b3d90bac376700cb56d606feb40f251a475a5d6634613564460b22" +dependencies = [ + "windows-sys 0.60.2", +] + +[[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-core" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "windows-interface" +version = "0.59.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[package]] +name = "windows-registry" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" +dependencies = [ + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" +dependencies = [ + "windows-targets 0.53.3", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" +dependencies = [ + "windows-link", + "windows_aarch64_gnullvm 0.53.0", + "windows_aarch64_msvc 0.53.0", + "windows_i686_gnu 0.53.0", + "windows_i686_gnullvm 0.53.0", + "windows_i686_msvc 0.53.0", + "windows_x86_64_gnu 0.53.0", + "windows_x86_64_gnullvm 0.53.0", + "windows_x86_64_msvc 0.53.0", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" + +[[package]] +name = "wit-bindgen" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "052283831dbae3d879dc7f51f3d92703a316ca49f91540417d38591826127814" + +[[package]] +name = "writeable" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" + +[[package]] +name = "ws2_32-sys" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" +dependencies = [ + "winapi 0.2.8", + "winapi-build", +] + +[[package]] +name = "yoke" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f41bb01b8226ef4bfd589436a297c53d118f65921786300e427be8d487695cc" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", + "synstructure 0.13.2", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", + "synstructure 0.13.2", +] + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" + +[[package]] +name = "zerotrie" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36f0bbd478583f79edad978b407914f61b2972f5af6fa089686016be8f9af595" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "zune-core" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" + +[[package]] +name = "zune-jpeg" +version = "0.4.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc1f7e205ce79eb2da3cd71c5f55f3589785cb7c79f6a03d1c8d1491bda5d089" +dependencies = [ + "zune-core", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..3ad685e --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "killpaper" +version = "0.1.0" +edition = "2024" + +[dependencies] +d = "0.0.1" +embedded-graphics = "0.8.1" +image = { version = "0.25.6", default-features = false, features = ["jpeg", "png"] } +reqwest = { version = "0.12", features = ["json", "blocking", "gzip", "brotli"] } +serde = { version = "1.0.219", features = ["derive"] } +serde_json = "1.0.143" diff --git a/killmails_display.png b/killmails_display.png new file mode 100644 index 0000000000000000000000000000000000000000..5a29405f88b937de3f2f65f76047ce777c6a83f4 GIT binary patch literal 3297 zcmeAS@N?(olHy`uVBq!ia0y~yU{+vYV0^#<6kw>x3Daa?;9246;uuoF`1Szv0+q;V z$3Ffqf7g5B%<>}d6&%9|~>*pC6E4}+!wmqwAS-W-i)%8VJL&Ntfgsj{3 zYL$4)snGD)uT23vU#(glC!iG`TY8n->FKJ~>#7`A#FSnQ)#sSH8mN$U;i#t3fEY~? zqgi9Lj2JB}M{AAI>T|S7Fxoa6Z6uDimhpER9?CPmS;yXJ8r8ED)OYc8^>bP0l+XkK D=can+ literal 0 HcmV?d00001 diff --git a/output.png b/output.png new file mode 100644 index 0000000000000000000000000000000000000000..8491aaffc36304e4d55d562d4582303865319607 GIT binary patch literal 54522 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 M6{E|A7wsPXU(~eu, +} + +impl Display { + pub fn new() -> Self { + Self { + width : WIDTH, + height : HEIGHT, + buffer: + Framebuffer::::new(), + } + } + + pub fn draw_rect(&mut self, x: i32, y: i32, w: u32, h: u32, color: u8) { + let rect = Rectangle::new(Point::new(x, y), Size::new(w, h)); + let style = PrimitiveStyle::with_fill(Gray8::new(color)); + rect.draw_styled(&style, &mut self.buffer).ok(); + } + + pub fn draw_text(&mut self, x: i32, y: i32, text: &str, color: u8) { + let style = MonoTextStyle::new(&FONT_8X13, Gray8::new(color)); + Text::new(text, Point::new(x, y), style) + .draw(&mut self.buffer) + .ok(); + } + + + pub fn draw_kill_info(&mut self, kill: &KillInfo, x: i32, y: i32) { + let mut current_y = y; + + // Draw Alliance logo (64x64) if present + if let Some(alliance) = &kill.victim.alliance { + let gray_vec = rgb_to_gray_vec(&alliance.logo); + let logo_raw = ImageRaw::::new(&gray_vec, alliance.logo.width() as u32); + Image::new(&logo_raw, Point::new(x, y)).draw(&mut self.buffer).ok(); + } + + // Draw Ship icon (64x64) if present + if let Some(ship) = &kill.victim.ship { + + let gray_vec = rgb_to_gray_vec(&ship.icon); + let logo_raw = ImageRaw::::new(&gray_vec, ship.icon.width() as u32); + Image::new(&logo_raw, Point::new(x + 64 + 4, current_y)).draw(&mut self.buffer).ok(); + } + + let text_x = x + 64 + 64 + 8; + let style = MonoTextStyle::new(&FONT_8X13, Gray8::new(255)); + current_y += 8; + + // Character name + Alliance short + let alliance_short = kill + .victim + .alliance + .as_ref() + .map(|a| a.short.as_str()) + .unwrap_or(""); + let char_line = format!("{} [{}]", kill.victim.character.name, alliance_short); + Text::new(&char_line, Point::new(text_x, current_y), style).draw(&mut self.buffer).ok(); + current_y += 16; + + // Ship name + total value + let ship_name = kill.victim.ship.as_ref().map(|s| s.name.as_str()).unwrap_or("Unknown"); + let value_line = format!("{} - {:.2}M ISK", ship_name, kill.total_value / 1_000_000f64); + Text::new(&value_line, Point::new(text_x, current_y), style).draw(&mut self.buffer).ok(); + current_y += 16; + + // System name + Text::new(&kill.system_name, Point::new(text_x, current_y), style).draw(&mut self.buffer).ok(); + } + + + pub fn flush(&self) { + + let buf = self.buffer.data(); + let img = GrayImage::from_raw(self.width as u32, self.height as u32, buf.iter().map(|p| *p).collect()).unwrap(); + img.save("output.png").unwrap(); + println!("Saved framebuffer to {:?}", "output.png"); + } +} + + + + +fn rgb_to_gray_vec(rgb: &RgbImage) -> Vec { + rgb.pixels() + .map(|p| { + let [r, g, b] = p.0; + (0.299 * r as f32 + 0.587 * g as f32 + 0.114 * b as f32) as u8 + }) + .collect() +} \ No newline at end of file diff --git a/src/killinfo.rs b/src/killinfo.rs new file mode 100644 index 0000000..ef083f8 --- /dev/null +++ b/src/killinfo.rs @@ -0,0 +1,138 @@ +use crate::model::alliance::Alliance; +use crate::model::character::Character; +use crate::model::corporation::Corporation; +use crate::model::killmail::{KillmailAttacker, KillmailRequest}; +use crate::model::ship::Ship; +use crate::services::esi_static::{EsiClient, EsiError}; +use crate::services::zkill::{ZkillClient, ZkillError}; + +pub struct Individual { + pub character: Character, + pub alliance: Option, + pub corporation: Corporation, + pub ship: Option, +} + +pub struct KillInfo { + pub victim: Individual, + pub main_attacker: Option, + pub system_name: String, + pub total_value: f64, +} + +pub struct KillInfoBuilder { + corporation_id: u32, +} + +impl KillInfoBuilder { + pub fn new() -> KillInfoBuilder { + KillInfoBuilder { corporation_id: 0 } + } + + // used to prioritize attacker with this id + pub fn set_corporation_id(&mut self, id: u32) { + self.corporation_id = id; + } + + pub fn make_kill_info( + &self, + client: &ZkillClient, + esi: &EsiClient, + request: &KillmailRequest, + ) -> Result { + let total_value = request.value; + let details = client.fetch_killmail_details(request)?; + let attacker_list = details.attacker; + let main_attacker: Option = + self.find_main_attacker(&attacker_list).and_then(|a| { + // Try to build the Individual. If it fails, return None + match Individual::build_with_esi( + esi, + a.character_id, + a.corporation_id, + a.alliance_id, + a.ship_id, + ) { + Ok(ind) => Some(ind), + Err(_) => None, // ignore errors here + } + }); + + let victim = Individual::build_with_esi( + esi, + details.victim.character_id, + details.victim.corporation_id, + details.victim.alliance_id, + details.victim.ship_id, + ) + .unwrap(); + + let system_name = esi + .get_system(details.system_id) + .unwrap_or("error".to_string()); + + Ok(KillInfo { + victim, + main_attacker, + system_name, + total_value, + }) + } + + pub fn find_main_attacker( + &self, + attacker_list: &Vec, + ) -> Option { + if attacker_list.is_empty() { + return None; + } + + // Try to find attackers from our corporation + let mut filtered: Vec<&KillmailAttacker> = attacker_list + .iter() + .filter(|a| a.corporation_id == self.corporation_id) + .collect(); + + // If none, fallback to all attackers + if filtered.is_empty() { + filtered = attacker_list.iter().collect(); + } + + // Find attacker with max damage + filtered.into_iter().max_by_key(|a| a.damage_done).copied() // copy the KillmailAttacker out of reference + } +} + +impl Individual { + pub fn build_with_esi( + client: &EsiClient, + char_id: u32, + corp_id: u32, + alli_id: u32, + ship_id: u32, + ) -> Result { + let character = client.get_character(char_id)?; + let corporation = client.get_corporation(corp_id)?; + + // Only try fetching alliance if alli_id != 0, else None + let alliance = if alli_id != 0 { + client.get_alliance(alli_id).ok() + } else { + None + }; + + // Only try fetching ship if ship_id != 0, else None + let ship = if ship_id != 0 { + client.get_ship(ship_id).ok() + } else { + None + }; + + Ok(Individual { + character, + alliance, + corporation, + ship, + }) + } +} diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..01f303b --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,3 @@ +pub mod killinfo; +pub mod model; +pub mod services; diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..6ad138f --- /dev/null +++ b/src/main.rs @@ -0,0 +1,122 @@ +use embedded_graphics::{ + mono_font::{MonoTextStyle, ascii::FONT_6X10}, + pixelcolor::Gray8, +}; +use image::{GrayImage, Pixel, RgbImage}; + +pub mod display; +pub mod killinfo; +pub mod model; +pub mod services; +use crate::killinfo::KillInfo; +use crate::services::esi_static::EsiClient; +use crate::services::zkill::ZkillClient; + +fn rgb_to_gray8(img: &RgbImage) -> GrayImage { + let mut gray = GrayImage::new(img.width(), img.height()); + for (x, y, pixel) in img.enumerate_pixels() { + let luma = pixel.to_luma()[0]; // simple conversion + gray.put_pixel(x, y, image::Luma([luma])); + } + gray +} + +// Example function to render kill info on a display buffer +fn render_killmails(killmails: &[KillInfo], buffer: &mut GrayImage, x_off: i64) { + let mut y_offset = 0; + + for k in killmails { + // Draw victim portrait + + if let Some(alli) = &k.victim.alliance { + let logo = &alli.logo; + let gray_logo = rgb_to_gray8(logo); + // copy portrait into buffer at (0, y_offset) + image::imageops::overlay(buffer, &gray_logo, x_off + 0, y_offset as i64); + } + + if let Some(ship) = &k.victim.ship { + let icon = &ship.icon; + let gray_icon = rgb_to_gray8(icon); + // copy portrait into buffer at (0, y_offset) + image::imageops::overlay(buffer, &gray_icon, x_off + 64, y_offset as i64); + } + + // Draw victim name + //let text_style = MonoTextStyle::new(&FONT_6X10, Gray8::new(255)); + // You can use embedded_graphics Text or a real framebuffer draw function + // Example with embedded_graphics (requires DrawTarget) + // Text::new(&k.victim.character.name, Point::new(50, y_offset as i32), text_style) + // .draw(display)?; + + // Draw system name and value + println!( + "{} {:.2}M ISK in {}", + k.victim.character.name, + k.total_value / 1_000_000.0, + k.system_name + ); + + // Advance y offset + y_offset += 60; // adjust spacing + if y_offset >= buffer.height() as usize { + break; + } + } +} + +fn main() { + // Simulated 800x480 grayscale display buffer + let mut buffer = GrayImage::new(800, 480); + + let esi = EsiClient::new(); + let zkill = ZkillClient::new(); + + let past_seconds = 60 * 60 * 24; + let my_corp_id = 98685373; + + let mut display = display::Display::new(); + + let response = zkill + .get_corporation_kills(my_corp_id, past_seconds) + .unwrap(); + let mut builder = killinfo::KillInfoBuilder::new(); + builder.set_corporation_id(my_corp_id); + + let killmails: Vec = response + .iter() + .map(|r| builder.make_kill_info(&zkill, &esi, r).unwrap()) + .collect(); + + + + for (i,k) in killmails.iter().enumerate() { + let ii = i as i32; + let y : i32 = ii * 60; + + display.draw_kill_info(k, 0, y); + } + + let response = zkill + .get_corporation_losses(my_corp_id, past_seconds) + .unwrap(); + let mut builder = killinfo::KillInfoBuilder::new(); + builder.set_corporation_id(my_corp_id); + + let killmails: Vec = response + .iter() + .map(|r| builder.make_kill_info(&zkill, &esi, r).unwrap()) + .collect(); + + for (i,k) in killmails.iter().enumerate() { + let ii = i as i32; + let y : i32 = ii * 60; + + display.draw_kill_info(k, 400, y); + } + + display.flush();; + + // Save buffer for debugging + buffer.save("killmails_display.png").unwrap(); +} diff --git a/src/model/alliance.rs b/src/model/alliance.rs new file mode 100644 index 0000000..578f894 --- /dev/null +++ b/src/model/alliance.rs @@ -0,0 +1,9 @@ +use image::RgbImage; + +#[derive(Debug, Clone)] +pub struct Alliance { + pub alliance_id: u32, + pub name: String, + pub short: String, + pub logo: RgbImage, +} diff --git a/src/model/character.rs b/src/model/character.rs new file mode 100644 index 0000000..f57d1ca --- /dev/null +++ b/src/model/character.rs @@ -0,0 +1,8 @@ +use image::RgbImage; + +#[derive(Debug, Clone)] +pub struct Character { + pub character_id: u32, + pub name: String, + pub portrait: RgbImage, +} diff --git a/src/model/corporation.rs b/src/model/corporation.rs new file mode 100644 index 0000000..ac14dfc --- /dev/null +++ b/src/model/corporation.rs @@ -0,0 +1,9 @@ +use image::RgbImage; + +#[derive(Debug, Clone)] +pub struct Corporation { + pub corporation_id: u32, + pub name: String, + pub short: String, + pub logo: RgbImage, +} diff --git a/src/model/killmail.rs b/src/model/killmail.rs new file mode 100644 index 0000000..2d4dd39 --- /dev/null +++ b/src/model/killmail.rs @@ -0,0 +1,31 @@ +#[derive(Debug, Clone)] +pub struct KillmailRequest { + pub id: u32, + pub hash: String, + pub value: f64, +} + +#[derive(Debug, Clone, Copy)] +pub struct KillmailAttacker { + pub character_id: u32, + pub corporation_id: u32, + pub alliance_id: u32, + pub ship_id: u32, + pub damage_done: u32, + pub final_blow: bool, +} + +#[derive(Debug, Clone, Copy)] +pub struct KillmailVictim { + pub character_id: u32, + pub corporation_id: u32, + pub alliance_id: u32, + pub ship_id: u32, +} + +#[derive(Debug, Clone)] +pub struct Killmail { + pub system_id: u32, + pub victim: KillmailVictim, + pub attacker: Vec, +} diff --git a/src/model/mod.rs b/src/model/mod.rs new file mode 100644 index 0000000..1ebc8c0 --- /dev/null +++ b/src/model/mod.rs @@ -0,0 +1,5 @@ +pub mod alliance; +pub mod character; +pub mod corporation; +pub mod killmail; +pub mod ship; diff --git a/src/model/ship.rs b/src/model/ship.rs new file mode 100644 index 0000000..ae92bd2 --- /dev/null +++ b/src/model/ship.rs @@ -0,0 +1,8 @@ +use image::RgbImage; + +#[derive(Debug, Clone)] +pub struct Ship { + pub ship_id: u32, + pub name: String, + pub icon: RgbImage, +} diff --git a/src/services/esi_static.rs b/src/services/esi_static.rs new file mode 100644 index 0000000..0154065 --- /dev/null +++ b/src/services/esi_static.rs @@ -0,0 +1,256 @@ +use image::load_from_memory; +use reqwest::blocking::Client; +use serde::Deserialize; +use std::fmt; + +use crate::model::alliance::Alliance; +use crate::model::character::Character; +use crate::model::corporation::Corporation; +use crate::model::ship::Ship; + +impl EsiClient { + pub fn new() -> Self { + let client = Client::builder() + .user_agent("killpaper-hw,oli1111@web.de") + .gzip(true) + .brotli(true) + .build() + .unwrap(); + + Self { + reqwest_client: client, + } + } + + pub fn get_alliance(&self, id: u32) -> Result { + #[derive(Deserialize)] + struct AllianceInfo { + name: String, + ticker: String, + } + + let info_url = format!("https://esi.evetech.net/latest/alliances/{id}/"); + println!("REQ ESI{}", info_url); + let info: AllianceInfo = self.reqwest_client.get(&info_url).send()?.json()?; + + let logo_url = format!("https://images.evetech.net/alliances/{id}/logo?size=64"); + println!("REQ ESI{}", logo_url); + + let bytes = self.reqwest_client.get(&logo_url).send()?.bytes()?; + let img = load_from_memory(&bytes)?.to_rgb8(); + + Ok(Alliance { + alliance_id: id, + name: info.name, + short: info.ticker, + logo: img, + }) + } + + pub fn get_corporation(&self, id: u32) -> Result { + #[derive(Deserialize)] + struct CorporationInfo { + name: String, + ticker: String, + } + + let info_url = format!("https://esi.evetech.net/latest/corporations/{id}/"); + println!("REQ ESI{}", info_url); + let info: CorporationInfo = self.reqwest_client.get(&info_url).send()?.json()?; + + let logo_url = format!("https://images.evetech.net/corporations/{id}/logo?size=64"); + println!("REQ ESI{}", logo_url); + let bytes = self.reqwest_client.get(&logo_url).send()?.bytes()?; + let img = load_from_memory(&bytes)?.to_rgb8(); + + Ok(Corporation { + corporation_id: id, + name: info.name, + short: info.ticker, + logo: img, + }) + } + + pub fn get_character(&self, id: u32) -> Result { + #[derive(Deserialize)] + struct CharacterInfo { + name: String, + } + + let info_url = format!("https://esi.evetech.net/latest/characters/{id}/"); + println!("REQ ESI{}", info_url); + + let info: CharacterInfo = self.reqwest_client.get(&info_url).send()?.json()?; + + let portrait_url = format!("https://images.evetech.net/characters/{id}/portrait?size=64"); + println!("REQ ESI{}", portrait_url); + + let bytes = self.reqwest_client.get(&portrait_url).send()?.bytes()?; + let img = load_from_memory(&bytes)?.to_rgb8(); + + Ok(Character { + character_id: id, + name: info.name, + portrait: img, + }) + } + + pub fn get_ship(&self, id: u32) -> Result { + #[derive(Deserialize)] + struct ShipInfo { + name: String, + } + + let info_url = format!("https://esi.evetech.net/latest/universe/types/{id}/"); + println!("REQ ESI{}", info_url); + + let info: ShipInfo = self.reqwest_client.get(&info_url).send()?.json()?; + + let icon_url = format!("https://images.evetech.net/types/{id}/icon?size=64"); + println!("REQ ESI{}", icon_url); + + let bytes = self.reqwest_client.get(&icon_url).send()?.bytes()?; + let img = load_from_memory(&bytes)?.to_rgb8(); + + Ok(Ship { + ship_id: id, + name: info.name, + icon: img, + }) + } + + pub fn get_system(&self, id: u32) -> Result { + #[derive(Deserialize)] + struct SystemInfo { + name: String, + } + + let url = format!("https://esi.evetech.net/latest/universe/systems/{id}/"); + println!("REQ ESI{}", url); + let info: SystemInfo = self.reqwest_client.get(&url).send()?.json()?; + + Ok(info.name) + } +} + +#[derive(Debug)] +pub enum EsiError { + Http(reqwest::Error), + Image(image::ImageError), + Json(serde_json::Error), +} + +impl fmt::Display for EsiError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + EsiError::Http(e) => write!(f, "HTTP request error: {}", e), + EsiError::Image(e) => write!(f, "Image decoding error: {}", e), + EsiError::Json(e) => write!(f, "JSON parsing error: {}", e), + } + } +} + +// Conversions so we can use `?` +impl From for EsiError { + fn from(e: reqwest::Error) -> Self { + EsiError::Http(e) + } +} +impl From for EsiError { + fn from(e: image::ImageError) -> Self { + EsiError::Image(e) + } +} +impl From for EsiError { + fn from(e: serde_json::Error) -> Self { + EsiError::Json(e) + } +} + +impl std::error::Error for EsiError {} +pub struct EsiClient { + pub(crate) reqwest_client: Client, +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_get_alliance() -> Result<(), EsiError> { + let esi = EsiClient::new(); + let alliance = esi.get_alliance(99002685)?; + assert_eq!(alliance.alliance_id, 99002685); + + println!("Alliance name: {:?}", alliance.name); + println!("Alliance ticker: {:?}", alliance.short); + println!("image {} {}", alliance.logo.width(), alliance.logo.height()); + + assert!(alliance.logo.width() > 0); + assert!(alliance.logo.height() > 0); + + Ok(()) + } + + #[test] + fn test_get_corporation() -> Result<(), EsiError> { + let esi = EsiClient::new(); + let corp = esi.get_corporation(98330748)?; + assert_eq!(corp.corporation_id, 98330748); + + println!("Corporation name: {:?}", corp.name); + println!("Corporation ticker: {:?}", corp.short); + println!("image {} {}", corp.logo.width(), corp.logo.height()); + + assert!(corp.logo.width() > 0); + assert!(corp.logo.height() > 0); + + Ok(()) + } + + #[test] + fn test_get_character() -> Result<(), EsiError> { + let esi = EsiClient::new(); + let character = esi.get_character(90951867)?; + + assert_eq!(character.character_id, 90951867); + + println!("Character name: {:?}", character.name); + println!( + "image {} {}", + character.portrait.width(), + character.portrait.height() + ); + + assert!(character.portrait.width() > 0); + assert!(character.portrait.height() > 0); + + Ok(()) + } + + #[test] + fn test_get_ship() -> Result<(), EsiError> { + let esi = EsiClient::new(); + let ship = esi.get_ship(587)?; // Rifter + + assert_eq!(ship.ship_id, 587); + println!("Ship: {}", ship.name); + println!("image {} {}", ship.icon.width(), ship.icon.height()); + + assert!(ship.icon.width() > 0); + assert!(ship.icon.height() > 0); + + Ok(()) + } + + #[test] + fn test_get_system() -> Result<(), EsiError> { + let esi = EsiClient::new(); + let system_name = esi.get_system(30000142)?; // Jita + + assert_eq!(system_name, "Jita"); + println!("System name: {}", system_name); + + Ok(()) + } +} diff --git a/src/services/mod.rs b/src/services/mod.rs new file mode 100644 index 0000000..653d645 --- /dev/null +++ b/src/services/mod.rs @@ -0,0 +1,2 @@ +pub mod esi_static; +pub mod zkill; diff --git a/src/services/zkill.rs b/src/services/zkill.rs new file mode 100644 index 0000000..f712d07 --- /dev/null +++ b/src/services/zkill.rs @@ -0,0 +1,214 @@ +use reqwest::blocking::Client; +use serde::Deserialize; +use std::fmt; + +use crate::model::killmail::*; + +#[derive(Debug, Deserialize)] +struct ZkbKill { + killmail_id: u32, + zkb: ZkbInfo, +} + +#[derive(Debug, Deserialize)] +struct ZkbInfo { + hash: String, + totalValue: f64, +} + +pub struct ZkillClient { + client: Client, +} + +// ESI API deserialization structs +#[derive(Deserialize)] +struct EsiAttacker { + character_id: Option, + corporation_id: Option, + alliance_id: Option, + ship_type_id: Option, + damage_done: Option, + final_blow: Option, +} + +#[derive(Deserialize)] +struct EsiVictim { + character_id: Option, + corporation_id: Option, + alliance_id: Option, + ship_type_id: Option, +} + +#[derive(Deserialize)] +struct EsiKillmail { + solar_system_id: u32, + attackers: Vec, + victim: EsiVictim, +} + +// Custom error type +#[derive(Debug)] +pub enum ZkillError { + Reqwest(reqwest::Error), + Json(serde_json::Error), + NotFound(String), +} + +impl fmt::Display for ZkillError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + ZkillError::Reqwest(e) => write!(f, "Request failed: {}", e), + ZkillError::Json(e) => write!(f, "JSON parsing failed: {}", e), + ZkillError::NotFound(msg) => write!(f, "Not found: {}", msg), + } + } +} + +impl std::error::Error for ZkillError {} + +impl From for ZkillError { + fn from(err: reqwest::Error) -> Self { + ZkillError::Reqwest(err) + } +} + +impl From for ZkillError { + fn from(err: serde_json::Error) -> Self { + ZkillError::Json(err) + } +} + +impl ZkillClient { + pub fn new() -> Self { + let client = Client::builder() + .user_agent("killpaper-hw,oli1111@web.de") + .gzip(true) + .brotli(true) + .build() + .unwrap(); + + ZkillClient { client } + } + + pub fn get_corporation_kills( + &self, + corp_id: u32, + past_seconds: u32, + ) -> Result, ZkillError> { + let url = format!( + "https://zkillboard.com/api/kills/corporationID/{}/pastSeconds/{}/", + corp_id, past_seconds + ); + println!("REQ ZKILL {url}"); + let response = self.client.get(&url).send()?.text()?; + let kills: Vec = serde_json::from_str(&response)?; + + let result = kills + .into_iter() + .map(|k| KillmailRequest { + id: k.killmail_id, + hash: k.zkb.hash, + value: k.zkb.totalValue, + }) + .collect(); + + Ok(result) + } + + pub fn get_corporation_losses( + &self, + corp_id: u32, + past_seconds: u32, + ) -> Result, ZkillError> { + let url = format!( + "https://zkillboard.com/api/losses/corporationID/{}/pastSeconds/{}/", + corp_id, past_seconds + ); + println!("REQ ZKILL {url}"); + let response = self.client.get(&url).send()?.text()?; + let kills: Vec = serde_json::from_str(&response)?; + + let result = kills + .into_iter() + .map(|k| KillmailRequest { + id: k.killmail_id, + hash: k.zkb.hash, + value: k.zkb.totalValue, + }) + .collect(); + + Ok(result) + } + + pub fn fetch_killmail_details(&self, req: &KillmailRequest) -> Result { + let url = format!( + "https://esi.evetech.net/latest/killmails/{}/{}/", + req.id, req.hash + ); + println!("REQ ZKILL {url}"); + let esi_killmail: EsiKillmail = self.client.get(&url).send()?.json()?; + + let attackers = esi_killmail + .attackers + .into_iter() + .map(|a| KillmailAttacker { + character_id: a.character_id.unwrap_or(0), + corporation_id: a.corporation_id.unwrap_or(0), + alliance_id: a.alliance_id.unwrap_or(0), + ship_id: a.ship_type_id.unwrap_or(0), + damage_done: a.damage_done.unwrap_or(0), + final_blow: a.final_blow.unwrap_or(false), + }) + .collect(); + + let victim = KillmailVictim { + character_id: esi_killmail.victim.character_id.unwrap_or(0), + corporation_id: esi_killmail.victim.corporation_id.unwrap_or(0), + alliance_id: esi_killmail.victim.alliance_id.unwrap_or(0), + ship_id: esi_killmail.victim.ship_type_id.unwrap_or(0), + }; + + Ok(Killmail { + system_id: esi_killmail.solar_system_id, + victim, + attacker: attackers, + }) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_get_corporation_kills() { + let zkill = ZkillClient::new(); + let kills = zkill.get_corporation_kills(98330748, 86400).unwrap(); + + println!("Found {} kills", kills.len()); + for k in kills.iter().take(5) { + println!("Kill ID: {}, Hash: {}, Value: {}", k.id, k.hash, k.value); + assert!(k.value > 0.0); + assert!(!k.hash.is_empty()); + } + } + + #[test] + fn test_fetch_killmail_details() { + let zkill = ZkillClient::new(); + // Replace with a valid killmail ID & hash for testing + let req = KillmailRequest { + id: 129572369, + hash: "5c95b74245f3fa762dcad7f2dee73581ba885195".to_string(), + value: 52895174.48, + }; + let result = zkill.fetch_killmail_details(&req); + match result { + Ok(kill) => { + println!("Kill system ID: {}", kill.system_id); + assert!(kill.attacker.len() > 0 || kill.victim.ship_id > 0); + } + Err(e) => println!("Error fetching killmail: {}", e), + } + } +}