Satellite tracking TUI using ratatui

'somewhat proud of it' commit

+2
.gitignore
···
+
/target
+
log.log
+2185
Cargo.lock
···
+
# 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.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627"
+
+
[[package]]
+
name = "allocator-api2"
+
version = "0.2.21"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923"
+
+
[[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 = "atomic-waker"
+
version = "1.1.2"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
+
+
[[package]]
+
name = "autocfg"
+
version = "1.4.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26"
+
+
[[package]]
+
name = "backtrace"
+
version = "0.3.74"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a"
+
dependencies = [
+
"addr2line",
+
"cfg-if",
+
"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 = "2.9.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd"
+
+
[[package]]
+
name = "bumpalo"
+
version = "3.17.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf"
+
+
[[package]]
+
name = "bytes"
+
version = "1.10.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a"
+
+
[[package]]
+
name = "cassowary"
+
version = "0.3.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "df8670b8c7b9dae1793364eafadf7239c40d669904660c5960d74cfd80b46a53"
+
+
[[package]]
+
name = "castaway"
+
version = "0.2.3"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "0abae9be0aaf9ea96a3b1b8b1b55c602ca751eba1b1500220cea4ecbafe7c0d5"
+
dependencies = [
+
"rustversion",
+
]
+
+
[[package]]
+
name = "cc"
+
version = "1.2.20"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "04da6a0d40b948dfc4fa8f5bbf402b0fc1a64a28dbf7d12ffd683550f2c1b63a"
+
dependencies = [
+
"shlex",
+
]
+
+
[[package]]
+
name = "cfg-if"
+
version = "1.0.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+
+
[[package]]
+
name = "chrono"
+
version = "0.4.40"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "1a7964611d71df112cb1730f2ee67324fcf4d0fc6606acbbe9bfe06df124637c"
+
dependencies = [
+
"android-tzdata",
+
"iana-time-zone",
+
"js-sys",
+
"num-traits",
+
"serde",
+
"wasm-bindgen",
+
"windows-link",
+
]
+
+
[[package]]
+
name = "compact_str"
+
version = "0.8.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "3b79c4069c6cad78e2e0cdfcbd26275770669fb39fd308a752dc110e83b9af32"
+
dependencies = [
+
"castaway",
+
"cfg-if",
+
"itoa",
+
"rustversion",
+
"ryu",
+
"static_assertions",
+
]
+
+
[[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 = "crossterm"
+
version = "0.28.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "829d955a0bb380ef178a640b91779e3987da38c9aea133b20614cfed8cdea9c6"
+
dependencies = [
+
"bitflags",
+
"crossterm_winapi",
+
"mio",
+
"parking_lot",
+
"rustix 0.38.44",
+
"signal-hook",
+
"signal-hook-mio",
+
"winapi",
+
]
+
+
[[package]]
+
name = "crossterm_winapi"
+
version = "0.9.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b"
+
dependencies = [
+
"winapi",
+
]
+
+
[[package]]
+
name = "darling"
+
version = "0.20.11"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee"
+
dependencies = [
+
"darling_core",
+
"darling_macro",
+
]
+
+
[[package]]
+
name = "darling_core"
+
version = "0.20.11"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e"
+
dependencies = [
+
"fnv",
+
"ident_case",
+
"proc-macro2",
+
"quote",
+
"strsim",
+
"syn",
+
]
+
+
[[package]]
+
name = "darling_macro"
+
version = "0.20.11"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead"
+
dependencies = [
+
"darling_core",
+
"quote",
+
"syn",
+
]
+
+
[[package]]
+
name = "displaydoc"
+
version = "0.2.5"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
+
dependencies = [
+
"proc-macro2",
+
"quote",
+
"syn",
+
]
+
+
[[package]]
+
name = "either"
+
version = "1.15.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719"
+
+
[[package]]
+
name = "encoding_rs"
+
version = "0.8.35"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3"
+
dependencies = [
+
"cfg-if",
+
]
+
+
[[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.11"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e"
+
dependencies = [
+
"libc",
+
"windows-sys 0.59.0",
+
]
+
+
[[package]]
+
name = "fastrand"
+
version = "2.3.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be"
+
+
[[package]]
+
name = "fnv"
+
version = "1.0.7"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
+
+
[[package]]
+
name = "foldhash"
+
version = "0.1.5"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2"
+
+
[[package]]
+
name = "foreign-types"
+
version = "0.3.2"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1"
+
dependencies = [
+
"foreign-types-shared",
+
]
+
+
[[package]]
+
name = "foreign-types-shared"
+
version = "0.1.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
+
+
[[package]]
+
name = "form_urlencoded"
+
version = "1.2.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456"
+
dependencies = [
+
"percent-encoding",
+
]
+
+
[[package]]
+
name = "futures-channel"
+
version = "0.3.31"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10"
+
dependencies = [
+
"futures-core",
+
]
+
+
[[package]]
+
name = "futures-core"
+
version = "0.3.31"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e"
+
+
[[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-task",
+
"pin-project-lite",
+
"pin-utils",
+
]
+
+
[[package]]
+
name = "getrandom"
+
version = "0.2.16"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592"
+
dependencies = [
+
"cfg-if",
+
"libc",
+
"wasi 0.11.0+wasi-snapshot-preview1",
+
]
+
+
[[package]]
+
name = "getrandom"
+
version = "0.3.2"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0"
+
dependencies = [
+
"cfg-if",
+
"libc",
+
"r-efi",
+
"wasi 0.14.2+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.4.9"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "75249d144030531f8dee69fe9cea04d3edf809a017ae445e2abdff6629e86633"
+
dependencies = [
+
"atomic-waker",
+
"bytes",
+
"fnv",
+
"futures-core",
+
"futures-sink",
+
"http",
+
"indexmap",
+
"slab",
+
"tokio",
+
"tokio-util",
+
"tracing",
+
]
+
+
[[package]]
+
name = "hashbrown"
+
version = "0.15.2"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289"
+
dependencies = [
+
"allocator-api2",
+
"equivalent",
+
"foldhash",
+
]
+
+
[[package]]
+
name = "heck"
+
version = "0.5.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
+
+
[[package]]
+
name = "http"
+
version = "1.3.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565"
+
dependencies = [
+
"bytes",
+
"fnv",
+
"itoa",
+
]
+
+
[[package]]
+
name = "http-body"
+
version = "1.0.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184"
+
dependencies = [
+
"bytes",
+
"http",
+
]
+
+
[[package]]
+
name = "http-body-util"
+
version = "0.1.3"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a"
+
dependencies = [
+
"bytes",
+
"futures-core",
+
"http",
+
"http-body",
+
"pin-project-lite",
+
]
+
+
[[package]]
+
name = "httparse"
+
version = "1.10.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87"
+
+
[[package]]
+
name = "hyper"
+
version = "1.6.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80"
+
dependencies = [
+
"bytes",
+
"futures-channel",
+
"futures-util",
+
"h2",
+
"http",
+
"http-body",
+
"httparse",
+
"itoa",
+
"pin-project-lite",
+
"smallvec",
+
"tokio",
+
"want",
+
]
+
+
[[package]]
+
name = "hyper-rustls"
+
version = "0.27.5"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2"
+
dependencies = [
+
"futures-util",
+
"http",
+
"hyper",
+
"hyper-util",
+
"rustls",
+
"rustls-pki-types",
+
"tokio",
+
"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",
+
"http-body-util",
+
"hyper",
+
"hyper-util",
+
"native-tls",
+
"tokio",
+
"tokio-native-tls",
+
"tower-service",
+
]
+
+
[[package]]
+
name = "hyper-util"
+
version = "0.1.11"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "497bbc33a26fdd4af9ed9c70d63f61cf56a938375fbb32df34db9b1cd6d643f2"
+
dependencies = [
+
"bytes",
+
"futures-channel",
+
"futures-util",
+
"http",
+
"http-body",
+
"hyper",
+
"libc",
+
"pin-project-lite",
+
"socket2",
+
"tokio",
+
"tower-service",
+
"tracing",
+
]
+
+
[[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",
+
"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 = "1.5.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526"
+
dependencies = [
+
"displaydoc",
+
"yoke",
+
"zerofrom",
+
"zerovec",
+
]
+
+
[[package]]
+
name = "icu_locid"
+
version = "1.5.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637"
+
dependencies = [
+
"displaydoc",
+
"litemap",
+
"tinystr",
+
"writeable",
+
"zerovec",
+
]
+
+
[[package]]
+
name = "icu_locid_transform"
+
version = "1.5.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e"
+
dependencies = [
+
"displaydoc",
+
"icu_locid",
+
"icu_locid_transform_data",
+
"icu_provider",
+
"tinystr",
+
"zerovec",
+
]
+
+
[[package]]
+
name = "icu_locid_transform_data"
+
version = "1.5.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d"
+
+
[[package]]
+
name = "icu_normalizer"
+
version = "1.5.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f"
+
dependencies = [
+
"displaydoc",
+
"icu_collections",
+
"icu_normalizer_data",
+
"icu_properties",
+
"icu_provider",
+
"smallvec",
+
"utf16_iter",
+
"utf8_iter",
+
"write16",
+
"zerovec",
+
]
+
+
[[package]]
+
name = "icu_normalizer_data"
+
version = "1.5.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7"
+
+
[[package]]
+
name = "icu_properties"
+
version = "1.5.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5"
+
dependencies = [
+
"displaydoc",
+
"icu_collections",
+
"icu_locid_transform",
+
"icu_properties_data",
+
"icu_provider",
+
"tinystr",
+
"zerovec",
+
]
+
+
[[package]]
+
name = "icu_properties_data"
+
version = "1.5.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2"
+
+
[[package]]
+
name = "icu_provider"
+
version = "1.5.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9"
+
dependencies = [
+
"displaydoc",
+
"icu_locid",
+
"icu_provider_macros",
+
"stable_deref_trait",
+
"tinystr",
+
"writeable",
+
"yoke",
+
"zerofrom",
+
"zerovec",
+
]
+
+
[[package]]
+
name = "icu_provider_macros"
+
version = "1.5.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6"
+
dependencies = [
+
"proc-macro2",
+
"quote",
+
"syn",
+
]
+
+
[[package]]
+
name = "ident_case"
+
version = "1.0.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
+
+
[[package]]
+
name = "idna"
+
version = "1.0.3"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e"
+
dependencies = [
+
"idna_adapter",
+
"smallvec",
+
"utf8_iter",
+
]
+
+
[[package]]
+
name = "idna_adapter"
+
version = "1.2.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71"
+
dependencies = [
+
"icu_normalizer",
+
"icu_properties",
+
]
+
+
[[package]]
+
name = "indexmap"
+
version = "2.9.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e"
+
dependencies = [
+
"equivalent",
+
"hashbrown",
+
]
+
+
[[package]]
+
name = "indoc"
+
version = "2.0.6"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "f4c7245a08504955605670dbf141fceab975f15ca21570696aebe9d2e71576bd"
+
+
[[package]]
+
name = "instability"
+
version = "0.3.7"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "0bf9fed6d91cfb734e7476a06bde8300a1b94e217e1b523b6f0cd1a01998c71d"
+
dependencies = [
+
"darling",
+
"indoc",
+
"proc-macro2",
+
"quote",
+
"syn",
+
]
+
+
[[package]]
+
name = "ipnet"
+
version = "2.11.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130"
+
+
[[package]]
+
name = "itertools"
+
version = "0.13.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186"
+
dependencies = [
+
"either",
+
]
+
+
[[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 = "lazy_static"
+
version = "1.5.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
+
+
[[package]]
+
name = "libc"
+
version = "0.2.172"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa"
+
+
[[package]]
+
name = "linux-raw-sys"
+
version = "0.4.15"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab"
+
+
[[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.7.5"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856"
+
+
[[package]]
+
name = "lock_api"
+
version = "0.4.12"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17"
+
dependencies = [
+
"autocfg",
+
"scopeguard",
+
]
+
+
[[package]]
+
name = "log"
+
version = "0.4.27"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94"
+
+
[[package]]
+
name = "lru"
+
version = "0.12.5"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38"
+
dependencies = [
+
"hashbrown",
+
]
+
+
[[package]]
+
name = "memchr"
+
version = "2.7.4"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
+
+
[[package]]
+
name = "mime"
+
version = "0.3.17"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
+
+
[[package]]
+
name = "miniz_oxide"
+
version = "0.8.8"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a"
+
dependencies = [
+
"adler2",
+
]
+
+
[[package]]
+
name = "mio"
+
version = "1.0.3"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd"
+
dependencies = [
+
"libc",
+
"log",
+
"wasi 0.11.0+wasi-snapshot-preview1",
+
"windows-sys 0.52.0",
+
]
+
+
[[package]]
+
name = "native-tls"
+
version = "0.2.14"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e"
+
dependencies = [
+
"libc",
+
"log",
+
"openssl",
+
"openssl-probe",
+
"openssl-sys",
+
"schannel",
+
"security-framework",
+
"security-framework-sys",
+
"tempfile",
+
]
+
+
[[package]]
+
name = "nu-ansi-term"
+
version = "0.46.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84"
+
dependencies = [
+
"overload",
+
"winapi",
+
]
+
+
[[package]]
+
name = "num-traits"
+
version = "0.2.19"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
+
dependencies = [
+
"autocfg",
+
]
+
+
[[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.72"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "fedfea7d58a1f73118430a55da6a286e7b044961736ce96a16a17068ea25e5da"
+
dependencies = [
+
"bitflags",
+
"cfg-if",
+
"foreign-types",
+
"libc",
+
"once_cell",
+
"openssl-macros",
+
"openssl-sys",
+
]
+
+
[[package]]
+
name = "openssl-macros"
+
version = "0.1.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
+
dependencies = [
+
"proc-macro2",
+
"quote",
+
"syn",
+
]
+
+
[[package]]
+
name = "openssl-probe"
+
version = "0.1.6"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e"
+
+
[[package]]
+
name = "openssl-sys"
+
version = "0.9.107"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "8288979acd84749c744a9014b4382d42b8f7b2592847b5afb2ed29e5d16ede07"
+
dependencies = [
+
"cc",
+
"libc",
+
"pkg-config",
+
"vcpkg",
+
]
+
+
[[package]]
+
name = "overload"
+
version = "0.1.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
+
+
[[package]]
+
name = "parking_lot"
+
version = "0.12.3"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27"
+
dependencies = [
+
"lock_api",
+
"parking_lot_core",
+
]
+
+
[[package]]
+
name = "parking_lot_core"
+
version = "0.9.10"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8"
+
dependencies = [
+
"cfg-if",
+
"libc",
+
"redox_syscall",
+
"smallvec",
+
"windows-targets 0.52.6",
+
]
+
+
[[package]]
+
name = "paste"
+
version = "1.0.15"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
+
+
[[package]]
+
name = "percent-encoding"
+
version = "2.3.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
+
+
[[package]]
+
name = "pin-project-lite"
+
version = "0.2.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 = "proc-macro2"
+
version = "1.0.95"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778"
+
dependencies = [
+
"unicode-ident",
+
]
+
+
[[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.2.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5"
+
+
[[package]]
+
name = "ratatui"
+
version = "0.29.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "eabd94c2f37801c20583fc49dd5cd6b0ba68c716787c2dd6ed18571e1e63117b"
+
dependencies = [
+
"bitflags",
+
"cassowary",
+
"compact_str",
+
"crossterm",
+
"indoc",
+
"instability",
+
"itertools",
+
"lru",
+
"paste",
+
"strum",
+
"unicode-segmentation",
+
"unicode-truncate",
+
"unicode-width 0.2.0",
+
]
+
+
[[package]]
+
name = "redox_syscall"
+
version = "0.5.11"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "d2f103c6d277498fbceb16e84d317e2a400f160f46904d5f5410848c829511a3"
+
dependencies = [
+
"bitflags",
+
]
+
+
[[package]]
+
name = "reqwest"
+
version = "0.12.15"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "d19c46a6fdd48bc4dab94b6103fccc55d34c67cc0ad04653aad4ea2a07cd7bbb"
+
dependencies = [
+
"base64",
+
"bytes",
+
"encoding_rs",
+
"futures-core",
+
"futures-util",
+
"h2",
+
"http",
+
"http-body",
+
"http-body-util",
+
"hyper",
+
"hyper-rustls",
+
"hyper-tls",
+
"hyper-util",
+
"ipnet",
+
"js-sys",
+
"log",
+
"mime",
+
"native-tls",
+
"once_cell",
+
"percent-encoding",
+
"pin-project-lite",
+
"rustls-pemfile",
+
"serde",
+
"serde_json",
+
"serde_urlencoded",
+
"sync_wrapper",
+
"system-configuration",
+
"tokio",
+
"tokio-native-tls",
+
"tower",
+
"tower-service",
+
"url",
+
"wasm-bindgen",
+
"wasm-bindgen-futures",
+
"web-sys",
+
"windows-registry",
+
]
+
+
[[package]]
+
name = "ring"
+
version = "0.17.14"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7"
+
dependencies = [
+
"cc",
+
"cfg-if",
+
"getrandom 0.2.16",
+
"libc",
+
"untrusted",
+
"windows-sys 0.52.0",
+
]
+
+
[[package]]
+
name = "rustc-demangle"
+
version = "0.1.24"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f"
+
+
[[package]]
+
name = "rustix"
+
version = "0.38.44"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154"
+
dependencies = [
+
"bitflags",
+
"errno",
+
"libc",
+
"linux-raw-sys 0.4.15",
+
"windows-sys 0.59.0",
+
]
+
+
[[package]]
+
name = "rustix"
+
version = "1.0.5"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "d97817398dd4bb2e6da002002db259209759911da105da92bec29ccb12cf58bf"
+
dependencies = [
+
"bitflags",
+
"errno",
+
"libc",
+
"linux-raw-sys 0.9.4",
+
"windows-sys 0.59.0",
+
]
+
+
[[package]]
+
name = "rustls"
+
version = "0.23.26"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "df51b5869f3a441595eac5e8ff14d486ff285f7b8c0df8770e49c3b56351f0f0"
+
dependencies = [
+
"once_cell",
+
"rustls-pki-types",
+
"rustls-webpki",
+
"subtle",
+
"zeroize",
+
]
+
+
[[package]]
+
name = "rustls-pemfile"
+
version = "2.2.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50"
+
dependencies = [
+
"rustls-pki-types",
+
]
+
+
[[package]]
+
name = "rustls-pki-types"
+
version = "1.11.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c"
+
+
[[package]]
+
name = "rustls-webpki"
+
version = "0.103.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "fef8b8769aaccf73098557a87cd1816b4f9c7c16811c9c77142aa695c16f2c03"
+
dependencies = [
+
"ring",
+
"rustls-pki-types",
+
"untrusted",
+
]
+
+
[[package]]
+
name = "rustversion"
+
version = "1.0.20"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2"
+
+
[[package]]
+
name = "ryu"
+
version = "1.0.20"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f"
+
+
[[package]]
+
name = "sattelite_observers"
+
version = "0.1.0"
+
dependencies = [
+
"chrono",
+
"ratatui",
+
"reqwest",
+
"serde",
+
"sgp4",
+
"tokio",
+
"tracing",
+
"tracing-error",
+
"tracing-subscriber",
+
]
+
+
[[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",
+
"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 = "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",
+
]
+
+
[[package]]
+
name = "serde_json"
+
version = "1.0.140"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373"
+
dependencies = [
+
"itoa",
+
"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",
+
"ryu",
+
"serde",
+
]
+
+
[[package]]
+
name = "sgp4"
+
version = "2.2.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "1e4b1f4474b6f9c1edcf6c74288127f3d5528d19160b817382e5b7db70637cf1"
+
dependencies = [
+
"chrono",
+
"serde",
+
"serde_json",
+
]
+
+
[[package]]
+
name = "sharded-slab"
+
version = "0.1.7"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6"
+
dependencies = [
+
"lazy_static",
+
]
+
+
[[package]]
+
name = "shlex"
+
version = "1.3.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
+
+
[[package]]
+
name = "signal-hook"
+
version = "0.3.17"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801"
+
dependencies = [
+
"libc",
+
"signal-hook-registry",
+
]
+
+
[[package]]
+
name = "signal-hook-mio"
+
version = "0.2.4"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "34db1a06d485c9142248b7a054f034b349b212551f3dfd19c94d45a754a217cd"
+
dependencies = [
+
"libc",
+
"mio",
+
"signal-hook",
+
]
+
+
[[package]]
+
name = "signal-hook-registry"
+
version = "1.4.5"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410"
+
dependencies = [
+
"libc",
+
]
+
+
[[package]]
+
name = "slab"
+
version = "0.4.9"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67"
+
dependencies = [
+
"autocfg",
+
]
+
+
[[package]]
+
name = "smallvec"
+
version = "1.15.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9"
+
+
[[package]]
+
name = "socket2"
+
version = "0.5.9"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef"
+
dependencies = [
+
"libc",
+
"windows-sys 0.52.0",
+
]
+
+
[[package]]
+
name = "stable_deref_trait"
+
version = "1.2.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"
+
+
[[package]]
+
name = "static_assertions"
+
version = "1.1.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
+
+
[[package]]
+
name = "strsim"
+
version = "0.11.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
+
+
[[package]]
+
name = "strum"
+
version = "0.26.3"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06"
+
dependencies = [
+
"strum_macros",
+
]
+
+
[[package]]
+
name = "strum_macros"
+
version = "0.26.4"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be"
+
dependencies = [
+
"heck",
+
"proc-macro2",
+
"quote",
+
"rustversion",
+
"syn",
+
]
+
+
[[package]]
+
name = "subtle"
+
version = "2.6.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
+
+
[[package]]
+
name = "syn"
+
version = "2.0.101"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf"
+
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.13.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971"
+
dependencies = [
+
"proc-macro2",
+
"quote",
+
"syn",
+
]
+
+
[[package]]
+
name = "system-configuration"
+
version = "0.6.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b"
+
dependencies = [
+
"bitflags",
+
"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.19.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf"
+
dependencies = [
+
"fastrand",
+
"getrandom 0.3.2",
+
"once_cell",
+
"rustix 1.0.5",
+
"windows-sys 0.59.0",
+
]
+
+
[[package]]
+
name = "thread_local"
+
version = "1.1.8"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c"
+
dependencies = [
+
"cfg-if",
+
"once_cell",
+
]
+
+
[[package]]
+
name = "tinystr"
+
version = "0.7.6"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f"
+
dependencies = [
+
"displaydoc",
+
"zerovec",
+
]
+
+
[[package]]
+
name = "tokio"
+
version = "1.44.2"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "e6b88822cbe49de4185e3a4cbf8321dd487cf5fe0c5c65695fef6346371e9c48"
+
dependencies = [
+
"backtrace",
+
"bytes",
+
"libc",
+
"mio",
+
"parking_lot",
+
"pin-project-lite",
+
"signal-hook-registry",
+
"socket2",
+
"tokio-macros",
+
"windows-sys 0.52.0",
+
]
+
+
[[package]]
+
name = "tokio-macros"
+
version = "2.5.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8"
+
dependencies = [
+
"proc-macro2",
+
"quote",
+
"syn",
+
]
+
+
[[package]]
+
name = "tokio-native-tls"
+
version = "0.3.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2"
+
dependencies = [
+
"native-tls",
+
"tokio",
+
]
+
+
[[package]]
+
name = "tokio-rustls"
+
version = "0.26.2"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b"
+
dependencies = [
+
"rustls",
+
"tokio",
+
]
+
+
[[package]]
+
name = "tokio-util"
+
version = "0.7.15"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df"
+
dependencies = [
+
"bytes",
+
"futures-core",
+
"futures-sink",
+
"pin-project-lite",
+
"tokio",
+
]
+
+
[[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",
+
"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-attributes",
+
"tracing-core",
+
]
+
+
[[package]]
+
name = "tracing-attributes"
+
version = "0.1.28"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d"
+
dependencies = [
+
"proc-macro2",
+
"quote",
+
"syn",
+
]
+
+
[[package]]
+
name = "tracing-core"
+
version = "0.1.33"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c"
+
dependencies = [
+
"once_cell",
+
"valuable",
+
]
+
+
[[package]]
+
name = "tracing-error"
+
version = "0.2.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "8b1581020d7a273442f5b45074a6a57d5757ad0a47dac0e9f0bd57b81936f3db"
+
dependencies = [
+
"tracing",
+
"tracing-subscriber",
+
]
+
+
[[package]]
+
name = "tracing-log"
+
version = "0.2.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3"
+
dependencies = [
+
"log",
+
"once_cell",
+
"tracing-core",
+
]
+
+
[[package]]
+
name = "tracing-subscriber"
+
version = "0.3.19"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008"
+
dependencies = [
+
"nu-ansi-term",
+
"sharded-slab",
+
"smallvec",
+
"thread_local",
+
"tracing-core",
+
"tracing-log",
+
]
+
+
[[package]]
+
name = "try-lock"
+
version = "0.2.5"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
+
+
[[package]]
+
name = "unicode-ident"
+
version = "1.0.18"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512"
+
+
[[package]]
+
name = "unicode-segmentation"
+
version = "1.12.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493"
+
+
[[package]]
+
name = "unicode-truncate"
+
version = "1.1.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "b3644627a5af5fa321c95b9b235a72fd24cd29c648c2c379431e6628655627bf"
+
dependencies = [
+
"itertools",
+
"unicode-segmentation",
+
"unicode-width 0.1.14",
+
]
+
+
[[package]]
+
name = "unicode-width"
+
version = "0.1.14"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af"
+
+
[[package]]
+
name = "unicode-width"
+
version = "0.2.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd"
+
+
[[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.4"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60"
+
dependencies = [
+
"form_urlencoded",
+
"idna",
+
"percent-encoding",
+
]
+
+
[[package]]
+
name = "utf16_iter"
+
version = "1.0.5"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246"
+
+
[[package]]
+
name = "utf8_iter"
+
version = "1.0.4"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
+
+
[[package]]
+
name = "valuable"
+
version = "0.1.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65"
+
+
[[package]]
+
name = "vcpkg"
+
version = "0.2.15"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
+
+
[[package]]
+
name = "want"
+
version = "0.3.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e"
+
dependencies = [
+
"try-lock",
+
]
+
+
[[package]]
+
name = "wasi"
+
version = "0.11.0+wasi-snapshot-preview1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
+
+
[[package]]
+
name = "wasi"
+
version = "0.14.2+wasi-0.2.4"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3"
+
dependencies = [
+
"wit-bindgen-rt",
+
]
+
+
[[package]]
+
name = "wasm-bindgen"
+
version = "0.2.100"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5"
+
dependencies = [
+
"cfg-if",
+
"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",
+
"proc-macro2",
+
"quote",
+
"syn",
+
"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",
+
"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",
+
"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.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-i686-pc-windows-gnu"
+
version = "0.4.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+
+
[[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.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "4763c1de310c86d75a878046489e2e5ba02c649d185f21c67d4cf8a56d098980"
+
dependencies = [
+
"windows-implement",
+
"windows-interface",
+
"windows-link",
+
"windows-result",
+
"windows-strings 0.4.0",
+
]
+
+
[[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",
+
]
+
+
[[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",
+
]
+
+
[[package]]
+
name = "windows-link"
+
version = "0.1.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38"
+
+
[[package]]
+
name = "windows-registry"
+
version = "0.4.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3"
+
dependencies = [
+
"windows-result",
+
"windows-strings 0.3.1",
+
"windows-targets 0.53.0",
+
]
+
+
[[package]]
+
name = "windows-result"
+
version = "0.3.2"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252"
+
dependencies = [
+
"windows-link",
+
]
+
+
[[package]]
+
name = "windows-strings"
+
version = "0.3.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319"
+
dependencies = [
+
"windows-link",
+
]
+
+
[[package]]
+
name = "windows-strings"
+
version = "0.4.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "7a2ba9642430ee452d5a7aa78d72907ebe8cfda358e8cb7918a2050581322f97"
+
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-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.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b"
+
dependencies = [
+
"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-rt"
+
version = "0.39.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1"
+
dependencies = [
+
"bitflags",
+
]
+
+
[[package]]
+
name = "write16"
+
version = "1.0.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936"
+
+
[[package]]
+
name = "writeable"
+
version = "0.5.5"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51"
+
+
[[package]]
+
name = "yoke"
+
version = "0.7.5"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40"
+
dependencies = [
+
"serde",
+
"stable_deref_trait",
+
"yoke-derive",
+
"zerofrom",
+
]
+
+
[[package]]
+
name = "yoke-derive"
+
version = "0.7.5"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154"
+
dependencies = [
+
"proc-macro2",
+
"quote",
+
"syn",
+
"synstructure",
+
]
+
+
[[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",
+
"synstructure",
+
]
+
+
[[package]]
+
name = "zeroize"
+
version = "1.8.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde"
+
+
[[package]]
+
name = "zerovec"
+
version = "0.10.4"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079"
+
dependencies = [
+
"yoke",
+
"zerofrom",
+
"zerovec-derive",
+
]
+
+
[[package]]
+
name = "zerovec-derive"
+
version = "0.10.3"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6"
+
dependencies = [
+
"proc-macro2",
+
"quote",
+
"syn",
+
]
+19
Cargo.toml
···
+
[package]
+
name = "sattelite_observers"
+
version = "0.1.0"
+
edition = "2024"
+
+
[dependencies]
+
chrono = "0.4.40"
+
ratatui = "0.29.0"
+
reqwest = { version = "0.12.15", features = ["json"] }
+
serde = { version = "1.0.219", features = ["derive"] }
+
sgp4 = "2.2.0"
+
tokio = { version = "1.44.2", features = ["full"] }
+
+
tracing = {version = "0.1.41", optional = true}
+
tracing-error = {version="0.2.1",optional = true}
+
tracing-subscriber = {version="0.3.19",optional=true}
+
+
[features]
+
logging = ["dep:tracing","dep:tracing-error","tracing-subscriber"]
+25
README.md
···
+
# Satellite observatory
+
+
Inspired by my previous project [iss_locator.rs](https://tangled.sh/@technoduck.me/iss_locator.rs), and the indomitable human spirit,
+
its an interactive program displaying the current location of the ISS.
+
+
The UI is made using [ratatui.rs](https://ratatui.rs/), which I hopefully will be able to then also port to [ratzilla](https://github.com/orhun/ratzilla).
+
+
+
## Usage
+
+
Can either be compiled normally, or with a `logging` feature, to enable tracing everything into log.log file (horrible alas it works).
+
+
## Methods
+
+
Location of the ISS is obtained from [celestrak](https://celestrak.org), where the Two Line Element for the ISS's orbit is obtained.
+
+
SGP4 algorithms + Earth Rotation angle are used to calculate the location and velocity at any specific point in time.
+
+
+
## Future?
+
+
While the code for now is a bit ISS specific other satellites can be easily added, by fetching their TLE and doing the same calculations.
+
+
+
+88
src/app.rs
···
+
use chrono::{DateTime, Utc};
+
use crate::location::FLocation;
+
use ratatui::{style::Color, text::Line, widgets::{ListItem, ListState}};
+
+
#[derive(Clone,Debug)]
+
pub enum CurrentScreen {
+
Map,
+
CityChoice,
+
Exiting
+
}
+
+
+
#[derive(Debug,Clone,PartialEq)]
+
pub struct City {
+
pub name: String,
+
pub long: f32,
+
pub lat: f32,
+
}
+
+
impl From<&City> for ListItem<'_> {
+
fn from(value: &City) -> Self {
+
let line = Line::styled(
+
format!("{} : {} W/E , {} N/S",value.name,value.long,value.lat),
+
Color::Gray);
+
ListItem::new(line)
+
}
+
+
}
+
+
/// uuuhhh future feature.
+
/// checking if the currently chosen city is within the ISS's visibility (https://tangled.sh/@technoduck.me/iss_locator.rs)
+
pub const CITIES:[(&str,f32,f32);9] = [
+
("Montreal",-72.2,45.5),
+
("Tokyo",139.766,35.66),
+
("Delhi",77.216,28.6),
+
("Shanghai",121.45,31.22),
+
("São Paulo",-46.65,-23.55),
+
("Mexico City",-99.12,19.45),
+
("Cairo",31.233,30.03),
+
("New York",-74.0,40.7),
+
("London",0.03,51.55)
+
];
+
+
impl From<&(&str,f32,f32)> for City {
+
fn from(value: &(&str,f32,f32)) -> Self {
+
City { name: value.0.to_string(), long: value.1, lat: value.2 }
+
}
+
}
+
+
#[derive(Clone,Debug)]
+
pub struct CityList {
+
pub cities: Vec<City>,
+
pub state: ListState
+
}
+
+
+
+
+
#[derive(Clone,Debug)]
+
pub struct App {
+
pub current_screen: CurrentScreen,
+
pub cities: CityList,
+
pub iss_location: Option<FLocation>,
+
pub getting_location: bool,
+
pub iss_constant: Option<sgp4::Constants>,
+
pub iss_constant_epoch: Option<DateTime<Utc>>
+
}
+
+
+
impl App {
+
pub fn new() -> App {
+
+
let cities_vec:Vec<City> = CITIES.iter()
+
.map(|f| City::from(f))
+
.collect();
+
let cities:CityList = CityList { cities: cities_vec, state: ListState::default() };
+
+
App {
+
current_screen:CurrentScreen::Map,
+
cities,
+
iss_location: None,
+
getting_location: false,
+
iss_constant: None,
+
iss_constant_epoch: None
+
}
+
}
+
+
}
+72
src/location.rs
···
+
use std::f64::consts::PI;
+
+
use chrono::{DateTime,Utc};
+
use serde::{Deserialize,Serialize};
+
+
+
pub fn earth_rotation_angle(t_u:f64) -> f64 {
+
//returns radians
+
2.0*PI*(0.7790572732640 + 1.00273781191135448*t_u) % std::f64::consts::TAU
+
}
+
+
+
//to be deleted dont think i need it much longer?
+
pub async fn get_celerak_data() -> (Option<sgp4::Constants>,Option<DateTime<Utc>>) {
+
let resp = reqwest::get("https://celestrak.org/NORAD/elements/gp.php?GROUP=stations&FORMAT=json").await.unwrap();
+
+
let element_vec:Vec<sgp4::Elements> = resp.json().await.unwrap();
+
+
+
let epoch = &element_vec[0].datetime.and_utc();
+
+
let iss_constant = sgp4::Constants::from_elements(&element_vec[0]).unwrap();
+
+
(Some(iss_constant),Some(*epoch))
+
+
}
+
+
+
// i should be using the geoid crate but this is good enough for now
+
pub fn polar_loc_transformer(loc: [f64;3]) -> [f32;2] {
+
let theta = -((loc[2]/ (loc[0].powi(2) + loc[1].powi(2) + loc[2].powi(2)).powf(0.5)).acos() - PI/2.0);
+
let phi = loc[1].signum() * (loc[0]/(loc[0].powi(2) + loc[1].powi(2)).powf(0.5)).acos();
+
+
[(phi*180.0/PI) as f32, (theta*180.0/PI) as f32]
+
+
+
}
+
+
+
+
#[derive(Debug,Clone,PartialEq,Deserialize,Serialize)]
+
pub struct Location {
+
pub latitude: String,
+
pub longitude: String
+
}
+
+
#[derive(Debug,Clone,Deserialize,Serialize)]
+
pub struct FLocation {
+
pub latitude: f32,
+
pub longitude: f32
+
}
+
+
+
+
+
impl From<Location> for FLocation {
+
fn from(value: Location) -> Self {
+
FLocation {
+
longitude: value.longitude.parse().unwrap(),
+
latitude: value.latitude.parse().unwrap()
+
}
+
}
+
+
}
+
+
#[derive(Debug,Clone,PartialEq,Deserialize,Serialize)]
+
pub struct LocationResponse {
+
pub iss_position: Location,
+
message: String,
+
timestamp: i64
+
}
+
+38
src/logging.rs
···
+
+
use std::io::Error;
+
+
use tracing_error::ErrorLayer;
+
use tracing_subscriber::{self, layer::SubscriberExt, util::SubscriberInitExt};
+
+
pub fn initialize_logging() -> Result<(),Error> {
+
let log_file = std::fs::File::create("log.log")?;
+
let file_subscriber = tracing_subscriber::fmt::layer()
+
.with_file(true)
+
.with_line_number(true)
+
.with_writer(log_file)
+
.with_target(false)
+
.with_ansi(false);
+
tracing_subscriber::registry().with(file_subscriber).with(ErrorLayer::default()).init();
+
Ok(())
+
}
+
+
#[macro_export]
+
macro_rules! trace_dbg {
+
(target: $target:expr, level: $level:expr, $ex:expr) => {{
+
match $ex {
+
value => {
+
tracing::event!(target: $target, $level, ?value, stringify!($ex));
+
value
+
}
+
}
+
}};
+
(level: $level:expr, $ex:expr) => {
+
trace_dbg!(target: module_path!(), level: $level, $ex)
+
};
+
(target: $target:expr, $ex:expr) => {
+
trace_dbg!(target: $target, level: tracing::Level::DEBUG, $ex)
+
};
+
($ex:expr) => {
+
trace_dbg!(level: tracing::Level::DEBUG, $ex)
+
};
+
}
+184
src/main.rs
···
+
use chrono::Utc;
+
use ratatui::crossterm::event::{self, poll, EnableMouseCapture, Event, KeyCode};
+
use ratatui::crossterm::execute;
+
use ratatui::crossterm::terminal::{enable_raw_mode, EnterAlternateScreen};
+
use ratatui::crossterm::event::DisableMouseCapture;
+
use ratatui::crossterm::terminal::{disable_raw_mode, LeaveAlternateScreen};
+
use ratatui::prelude::{Backend, CrosstermBackend};
+
use ratatui::Terminal;
+
use sgp4::{julian_years_since_j2000, MinutesSinceEpoch};
+
use std::f32::consts::PI;
+
use std::io::{self, Result};
+
use std::sync::{Arc, Mutex};
+
use std::time::Duration;
+
+
mod app;
+
mod ui;
+
mod location;
+
+
#[cfg(feature = "logging")]
+
mod logging;
+
+
use app::*;
+
+
#[tokio::main]
+
async fn main() -> Result<()> {
+
#[cfg(feature = "logging")]
+
let _ = logging::initialize_logging();
+
enable_raw_mode()?;
+
let mut stderr = io::stderr(); // This is a special case. Normally using stdout is fine
+
execute!(stderr, EnterAlternateScreen, EnableMouseCapture)?;
+
let backend = CrosstermBackend::new(stderr);
+
let mut terminal = Terminal::new(backend)?;
+
+
// create app and run it
+
+
let app = Arc::new(Mutex::new(App::new()));
+
let location_shared_app = Arc::clone(&app);
+
let location_shared_app2 = Arc::clone(&app);
+
let mut runtime_shared_app = Arc::clone(&app);
+
+
+
let get_constant = tokio::task::spawn(async move {
+
location_shared_app.lock().unwrap().getting_location = true;
+
let constant = location::get_celerak_data().await;
+
if let (Some(cons),Some(epoch)) = constant {
+
location_shared_app.lock().unwrap().iss_constant = Some(cons);
+
location_shared_app.lock().unwrap().iss_constant_epoch = Some(epoch);
+
}
+
location_shared_app.lock().unwrap().getting_location = false;
+
});
+
+
let _ = get_constant;
+
+
+
+
let forever = tokio::task::spawn(async move {
+
let mut interval = tokio::time::interval(Duration::from_secs(2));
+
+
loop {
+
interval.tick().await;
+
if location_shared_app2.lock().unwrap().iss_constant.is_some() {
+
let now = Utc::now();
+
let d_since_j2000 = julian_years_since_j2000(&now.naive_utc()) * 365.25;
+
let rad_diff_earth_rotation = location::earth_rotation_angle(d_since_j2000);
+
let time_diff = now - location_shared_app2.lock().unwrap().iss_constant_epoch.unwrap();
+
let prediction = location_shared_app2.lock().unwrap().iss_constant.as_ref().unwrap()
+
.propagate(MinutesSinceEpoch(time_diff.num_seconds() as f64 / 60.0)).unwrap();
+
+
let pred_spherical = location::polar_loc_transformer(prediction.position);
+
+
let long_value = if pred_spherical[0]-(rad_diff_earth_rotation as f32)*180.0/PI < 180.0
+
{
+
pred_spherical[0]-(rad_diff_earth_rotation as f32)*180.0/PI + 360.0
+
} else {
+
pred_spherical[0]-(rad_diff_earth_rotation as f32)*180.0/PI
+
};
+
location_shared_app2.lock().unwrap().iss_location = Some(location::FLocation {
+
+
latitude: pred_spherical[1],
+
longitude: long_value
+
});
+
+
}
+
} ;
+
});
+
+
+
+
let _ = forever;
+
+
let _res = run_app(&mut terminal, &mut runtime_shared_app).await;
+
// restore terminal
+
disable_raw_mode()?;
+
execute!(
+
terminal.backend_mut(),
+
LeaveAlternateScreen,
+
DisableMouseCapture
+
)?;
+
terminal.show_cursor()?;
+
+
+
Ok(())
+
}
+
+
+
async fn run_app<B:Backend> (terminal: &mut Terminal<B>, mut app: &mut Arc<Mutex<App>>) -> Result<bool> {
+
loop {
+
+
+
let _ = terminal.draw(|f| ui::ui(f, &mut app));
+
+
+
+
if poll(Duration::from_millis(15))? {
+
+
+
if let Event::Key(key) = event::read()? {
+
let app_shared = Arc::new(&app);
+
let mut app_shared = app_shared.lock().unwrap();
+
if key.kind == event::KeyEventKind::Release {
+
continue;
+
}
+
match app_shared.current_screen {
+
app::CurrentScreen::Map => match key.code {
+
KeyCode::Char('c') => {
+
app_shared.current_screen = CurrentScreen::CityChoice;
+
}
+
KeyCode::Char('q') => {
+
app_shared.current_screen = CurrentScreen::Exiting;
+
}
+
_ => {}
+
+
}
+
app::CurrentScreen::Exiting => match key.code {
+
KeyCode::Char('n') | KeyCode::Esc => {
+
app_shared.current_screen = CurrentScreen::Map
+
}
+
KeyCode::Char('y') | KeyCode::Char('q') => {
+
return Ok(false)
+
}
+
_ => {}
+
}
+
+
//weird behaviour with the ListState being 1 longer then the list, resulting in
+
//index overflow for the cities list. do not know why. yes even after rendering
+
//when the ListState was supposed to update
+
app::CurrentScreen::CityChoice => match key.code {
+
KeyCode::Up => {
+
+
if app_shared.cities.state.selected() == Some(0) {
+
app_shared.cities.state.select(Some(CITIES.len()-1));
+
} else {
+
app_shared.cities.state.scroll_up_by(1);
+
}
+
+
},
+
KeyCode::Down => {
+
if app_shared.cities.state.selected() == Some(app_shared.cities.cities.len()-1) {
+
app_shared.cities.state.select(Some(0));
+
} else {
+
+
app_shared.cities.state.scroll_down_by(1);
+
}
+
}
+
KeyCode::Enter => app_shared.current_screen = CurrentScreen::Map,
+
KeyCode::Esc => app_shared.current_screen = CurrentScreen::Map,
+
KeyCode::Char('q') => app_shared.current_screen = CurrentScreen::Map,
+
_ => {}
+
}
+
+
}
+
}
+
+
+
}
+
}
+
}
+
+
+
+
+
+
+
+236
src/ui.rs
···
+
+
use std::sync::{Arc, Mutex};
+
+
use ratatui::{layout::{Constraint, Direction, Layout, Rect}, style::{palette::tailwind::SLATE, Color, Modifier, Style}, text::{Line, Span, Text}, widgets::{canvas::{Canvas, Circle, Map, MapResolution, Points}, Block, Borders, List, ListItem, Paragraph}, Frame};
+
use ratatui::prelude::Stylize;
+
+
use crate::{App, CurrentScreen};
+
+
const SELECTED_STYLE: Style = Style::new().bg(SLATE.c800).add_modifier(Modifier::BOLD);
+
+
pub fn ui(frame: &mut Frame, app: &mut Arc<Mutex<App>>) {
+
let app_shared = Arc::clone(&app);
+
let mut app_shared = app_shared.lock().unwrap();
+
let chunks = Layout::default()
+
.direction(Direction::Vertical)
+
.constraints([
+
Constraint::Length(3),
+
Constraint::Min(1),
+
Constraint::Length(3),
+
])
+
.split(frame.area());
+
+
let title_block = Block::default()
+
.borders(Borders::ALL)
+
.style(Style::default());
+
+
let title = Paragraph::new(Text::styled(
+
"ISS Locator",
+
Style::default().fg(ratatui::style::Color::Green),
+
))
+
.block(title_block);
+
+
+
frame.render_widget(title, chunks[0]);
+
+
// MAP
+
+
let map = Canvas::default()
+
.block(Block::bordered().title("World Map"))
+
.marker(ratatui::symbols::Marker::Braille)
+
.paint(|ctx| {
+
ctx.draw(&Map {
+
color: Color::Green,
+
resolution: MapResolution::High,
+
});
+
+
if let Some(loc) = &app_shared.iss_location {
+
//allegedly the area visible from the ISS but we all know its not, there is a way
+
//to create a new widget that, depending on input location would give the
+
//appropriate shape, I however didn't care enough yet to do so.
+
ctx.draw(&Circle {
+
color: Color::Blue,
+
radius: 13.0,
+
x: loc.longitude.into(),
+
y: loc.latitude.into()
+
});
+
}
+
+
+
for (i,city) in app_shared.cities.cities.iter().enumerate() {
+
+
ctx.draw(&Points {
+
coords: &[(city.long.into(),city.lat.into())],
+
color: Color::Red
+
+
});
+
+
if let Some(j) = app_shared.cities.state.selected(){
+
if i == j {
+
// ctx.draw(&Points {
+
// coords: &[(city.long.into(),city.lat.into())],
+
// color: Color::Blue
+
// });
+
+
ctx.draw(&Circle {
+
color: Color::Yellow,
+
radius: 0.7,
+
x: city.long.into(),
+
y: city.lat.into()
+
});
+
+
}}
+
}
+
+
})
+
.x_bounds([-180.0, 180.0])
+
.y_bounds([-90.0, 90.0]);
+
+
+
frame.render_widget(map, chunks[1]);
+
+
+
// text on the bottom
+
//
+
+
let nav_text = vec![
+
match app_shared.current_screen {
+
CurrentScreen::Map => Span::styled("Map", Style::default().fg(Color::Green)),
+
CurrentScreen::CityChoice => Span::styled("Location Choice", Style::default().fg(Color::Green)),
+
CurrentScreen::Exiting => Span::styled("Exiting", Style::default().fg(Color::Green))
+
}.to_owned(),
+
+
Span::styled(" | ", Style::default().fg(Color::White)),
+
+
Span::styled(format!("Current location: {}",{
+
if let Some(i) = app_shared.cities.state.selected() {
+
&app_shared.cities.cities[i].name
+
} else {
+
"Not selected"
+
}
+
}), Style::default().fg(Color::Green)),
+
+
+
Span::styled(" | ", Style::default().fg(Color::White)),
+
+
Span::styled(format!("iss location: {} {} ",{
+
if let Some(i) = &app_shared.iss_location {
+
i.latitude.clone().to_string()
+
} else {
+
"?".to_string()
+
}},
+
{
+
if let Some(i) = &app_shared.iss_location {
+
i.longitude.clone().to_string()
+
} else {
+
"?".to_string()
+
}
+
}
+
), Style::default().fg(Color::Green)),
+
Span::styled(" | ", Style::default().fg(Color::White)),
+
Span::styled(format!(" {}",{
+
if app_shared.iss_constant.is_some() {
+
"Y"
+
} else {
+
"N"
+
}
+
}), Style::default().fg(Color::Green))
+
];
+
+
let mode_footer = Paragraph::new(Line::from(nav_text))
+
.block(Block::default().borders(Borders::ALL));
+
+
+
let curr_key_hint = {
+
match app_shared.current_screen {
+
CurrentScreen::Map => Span::styled(
+
"(q) to quit / (c) to change the location", Style::default().fg(Color::Red)),
+
CurrentScreen::CityChoice => Span::styled(
+
"(ESC) to cancel / (Enter) to confirm choive", Style::default().fg(Color::Red)),
+
CurrentScreen::Exiting => Span::styled(
+
"(y) to quit / (ESC) to cancel" ,Style::default().fg(Color::Red)),
+
}
+
};
+
+
let hint_footer = Paragraph::new(Line::from(curr_key_hint)).block(Block::default().borders(Borders::ALL));
+
+
+
let footer_chunks = Layout::default()
+
.direction(Direction::Horizontal)
+
.constraints([Constraint::Percentage(50),Constraint::Percentage(50)])
+
.split(chunks[2]);
+
+
frame.render_widget(mode_footer, footer_chunks[0]);
+
frame.render_widget(hint_footer, footer_chunks[1]);
+
+
+
// probably better to rewrite as a match statement
+
if let CurrentScreen::CityChoice = app_shared.current_screen {
+
let popup_block = Block::new()
+
.title(Line::raw("Cities Option").centered())
+
.borders(Borders::ALL);
+
+
+
let items: Vec<ListItem> = app_shared.cities.cities.iter()
+
.map(|item| {
+
ListItem::from(item)
+
})
+
.collect();
+
+
let list = List::new(items)
+
.block(popup_block)
+
.style(SELECTED_STYLE)
+
.highlight_symbol(">")
+
.highlight_spacing(ratatui::widgets::HighlightSpacing::Always);
+
+
let area = centered_rect(40, 40, frame.area());
+
+
frame.render_stateful_widget(list, area,&mut app_shared.cities.state);
+
+
}
+
+
+
if let CurrentScreen::Exiting = app_shared.current_screen {
+
+
let exit_popup = Block::new()
+
.title(Line::raw("Quit?").centered())
+
.bg(Color::Gray)
+
.borders(Borders::ALL);
+
+
let exit_text = Text::styled(
+
"Would you like to leave?", Style::default().fg(Color::Red));
+
+
let exit_widget = Paragraph::new(exit_text).centered()
+
.block(exit_popup);
+
+
+
let area = centered_rect(30, 20, frame.area());
+
frame.render_widget(exit_widget, area);
+
}
+
+
}
+
+
+
+
+
fn centered_rect(percent_x: u16, percent_y: u16, r: Rect) -> Rect {
+
// Cut the given rectangle into three vertical pieces
+
let popup_layout = Layout::default()
+
.direction(Direction::Vertical)
+
.constraints([
+
Constraint::Percentage((100 - percent_y) / 2),
+
Constraint::Percentage(percent_y),
+
Constraint::Percentage((100 - percent_y) / 2),
+
])
+
.split(r);
+
+
// Then cut the middle vertical piece into three width-wise pieces
+
Layout::default()
+
.direction(Direction::Horizontal)
+
.constraints([
+
Constraint::Percentage((100 - percent_x) / 2),
+
Constraint::Percentage(percent_x),
+
Constraint::Percentage((100 - percent_x) / 2),
+
])
+
.split(popup_layout[1])[1] // Return the middle chunk
+
}