Satellite tracking TUI using ratatui

'somewhat proud of it' commit

+2
.gitignore
··· 1 + /target 2 + log.log
+2185
Cargo.lock
··· 1 + # This file is automatically @generated by Cargo. 2 + # It is not intended for manual editing. 3 + version = 4 4 + 5 + [[package]] 6 + name = "addr2line" 7 + version = "0.24.2" 8 + source = "registry+https://github.com/rust-lang/crates.io-index" 9 + checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" 10 + dependencies = [ 11 + "gimli", 12 + ] 13 + 14 + [[package]] 15 + name = "adler2" 16 + version = "2.0.0" 17 + source = "registry+https://github.com/rust-lang/crates.io-index" 18 + checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" 19 + 20 + [[package]] 21 + name = "allocator-api2" 22 + version = "0.2.21" 23 + source = "registry+https://github.com/rust-lang/crates.io-index" 24 + checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" 25 + 26 + [[package]] 27 + name = "android-tzdata" 28 + version = "0.1.1" 29 + source = "registry+https://github.com/rust-lang/crates.io-index" 30 + checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" 31 + 32 + [[package]] 33 + name = "android_system_properties" 34 + version = "0.1.5" 35 + source = "registry+https://github.com/rust-lang/crates.io-index" 36 + checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" 37 + dependencies = [ 38 + "libc", 39 + ] 40 + 41 + [[package]] 42 + name = "atomic-waker" 43 + version = "1.1.2" 44 + source = "registry+https://github.com/rust-lang/crates.io-index" 45 + checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" 46 + 47 + [[package]] 48 + name = "autocfg" 49 + version = "1.4.0" 50 + source = "registry+https://github.com/rust-lang/crates.io-index" 51 + checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" 52 + 53 + [[package]] 54 + name = "backtrace" 55 + version = "0.3.74" 56 + source = "registry+https://github.com/rust-lang/crates.io-index" 57 + checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" 58 + dependencies = [ 59 + "addr2line", 60 + "cfg-if", 61 + "libc", 62 + "miniz_oxide", 63 + "object", 64 + "rustc-demangle", 65 + "windows-targets 0.52.6", 66 + ] 67 + 68 + [[package]] 69 + name = "base64" 70 + version = "0.22.1" 71 + source = "registry+https://github.com/rust-lang/crates.io-index" 72 + checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 73 + 74 + [[package]] 75 + name = "bitflags" 76 + version = "2.9.0" 77 + source = "registry+https://github.com/rust-lang/crates.io-index" 78 + checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" 79 + 80 + [[package]] 81 + name = "bumpalo" 82 + version = "3.17.0" 83 + source = "registry+https://github.com/rust-lang/crates.io-index" 84 + checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" 85 + 86 + [[package]] 87 + name = "bytes" 88 + version = "1.10.1" 89 + source = "registry+https://github.com/rust-lang/crates.io-index" 90 + checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" 91 + 92 + [[package]] 93 + name = "cassowary" 94 + version = "0.3.0" 95 + source = "registry+https://github.com/rust-lang/crates.io-index" 96 + checksum = "df8670b8c7b9dae1793364eafadf7239c40d669904660c5960d74cfd80b46a53" 97 + 98 + [[package]] 99 + name = "castaway" 100 + version = "0.2.3" 101 + source = "registry+https://github.com/rust-lang/crates.io-index" 102 + checksum = "0abae9be0aaf9ea96a3b1b8b1b55c602ca751eba1b1500220cea4ecbafe7c0d5" 103 + dependencies = [ 104 + "rustversion", 105 + ] 106 + 107 + [[package]] 108 + name = "cc" 109 + version = "1.2.20" 110 + source = "registry+https://github.com/rust-lang/crates.io-index" 111 + checksum = "04da6a0d40b948dfc4fa8f5bbf402b0fc1a64a28dbf7d12ffd683550f2c1b63a" 112 + dependencies = [ 113 + "shlex", 114 + ] 115 + 116 + [[package]] 117 + name = "cfg-if" 118 + version = "1.0.0" 119 + source = "registry+https://github.com/rust-lang/crates.io-index" 120 + checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 121 + 122 + [[package]] 123 + name = "chrono" 124 + version = "0.4.40" 125 + source = "registry+https://github.com/rust-lang/crates.io-index" 126 + checksum = "1a7964611d71df112cb1730f2ee67324fcf4d0fc6606acbbe9bfe06df124637c" 127 + dependencies = [ 128 + "android-tzdata", 129 + "iana-time-zone", 130 + "js-sys", 131 + "num-traits", 132 + "serde", 133 + "wasm-bindgen", 134 + "windows-link", 135 + ] 136 + 137 + [[package]] 138 + name = "compact_str" 139 + version = "0.8.1" 140 + source = "registry+https://github.com/rust-lang/crates.io-index" 141 + checksum = "3b79c4069c6cad78e2e0cdfcbd26275770669fb39fd308a752dc110e83b9af32" 142 + dependencies = [ 143 + "castaway", 144 + "cfg-if", 145 + "itoa", 146 + "rustversion", 147 + "ryu", 148 + "static_assertions", 149 + ] 150 + 151 + [[package]] 152 + name = "core-foundation" 153 + version = "0.9.4" 154 + source = "registry+https://github.com/rust-lang/crates.io-index" 155 + checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" 156 + dependencies = [ 157 + "core-foundation-sys", 158 + "libc", 159 + ] 160 + 161 + [[package]] 162 + name = "core-foundation-sys" 163 + version = "0.8.7" 164 + source = "registry+https://github.com/rust-lang/crates.io-index" 165 + checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" 166 + 167 + [[package]] 168 + name = "crossterm" 169 + version = "0.28.1" 170 + source = "registry+https://github.com/rust-lang/crates.io-index" 171 + checksum = "829d955a0bb380ef178a640b91779e3987da38c9aea133b20614cfed8cdea9c6" 172 + dependencies = [ 173 + "bitflags", 174 + "crossterm_winapi", 175 + "mio", 176 + "parking_lot", 177 + "rustix 0.38.44", 178 + "signal-hook", 179 + "signal-hook-mio", 180 + "winapi", 181 + ] 182 + 183 + [[package]] 184 + name = "crossterm_winapi" 185 + version = "0.9.1" 186 + source = "registry+https://github.com/rust-lang/crates.io-index" 187 + checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b" 188 + dependencies = [ 189 + "winapi", 190 + ] 191 + 192 + [[package]] 193 + name = "darling" 194 + version = "0.20.11" 195 + source = "registry+https://github.com/rust-lang/crates.io-index" 196 + checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" 197 + dependencies = [ 198 + "darling_core", 199 + "darling_macro", 200 + ] 201 + 202 + [[package]] 203 + name = "darling_core" 204 + version = "0.20.11" 205 + source = "registry+https://github.com/rust-lang/crates.io-index" 206 + checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" 207 + dependencies = [ 208 + "fnv", 209 + "ident_case", 210 + "proc-macro2", 211 + "quote", 212 + "strsim", 213 + "syn", 214 + ] 215 + 216 + [[package]] 217 + name = "darling_macro" 218 + version = "0.20.11" 219 + source = "registry+https://github.com/rust-lang/crates.io-index" 220 + checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" 221 + dependencies = [ 222 + "darling_core", 223 + "quote", 224 + "syn", 225 + ] 226 + 227 + [[package]] 228 + name = "displaydoc" 229 + version = "0.2.5" 230 + source = "registry+https://github.com/rust-lang/crates.io-index" 231 + checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" 232 + dependencies = [ 233 + "proc-macro2", 234 + "quote", 235 + "syn", 236 + ] 237 + 238 + [[package]] 239 + name = "either" 240 + version = "1.15.0" 241 + source = "registry+https://github.com/rust-lang/crates.io-index" 242 + checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" 243 + 244 + [[package]] 245 + name = "encoding_rs" 246 + version = "0.8.35" 247 + source = "registry+https://github.com/rust-lang/crates.io-index" 248 + checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" 249 + dependencies = [ 250 + "cfg-if", 251 + ] 252 + 253 + [[package]] 254 + name = "equivalent" 255 + version = "1.0.2" 256 + source = "registry+https://github.com/rust-lang/crates.io-index" 257 + checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" 258 + 259 + [[package]] 260 + name = "errno" 261 + version = "0.3.11" 262 + source = "registry+https://github.com/rust-lang/crates.io-index" 263 + checksum = "976dd42dc7e85965fe702eb8164f21f450704bdde31faefd6471dba214cb594e" 264 + dependencies = [ 265 + "libc", 266 + "windows-sys 0.59.0", 267 + ] 268 + 269 + [[package]] 270 + name = "fastrand" 271 + version = "2.3.0" 272 + source = "registry+https://github.com/rust-lang/crates.io-index" 273 + checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" 274 + 275 + [[package]] 276 + name = "fnv" 277 + version = "1.0.7" 278 + source = "registry+https://github.com/rust-lang/crates.io-index" 279 + checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" 280 + 281 + [[package]] 282 + name = "foldhash" 283 + version = "0.1.5" 284 + source = "registry+https://github.com/rust-lang/crates.io-index" 285 + checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" 286 + 287 + [[package]] 288 + name = "foreign-types" 289 + version = "0.3.2" 290 + source = "registry+https://github.com/rust-lang/crates.io-index" 291 + checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" 292 + dependencies = [ 293 + "foreign-types-shared", 294 + ] 295 + 296 + [[package]] 297 + name = "foreign-types-shared" 298 + version = "0.1.1" 299 + source = "registry+https://github.com/rust-lang/crates.io-index" 300 + checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" 301 + 302 + [[package]] 303 + name = "form_urlencoded" 304 + version = "1.2.1" 305 + source = "registry+https://github.com/rust-lang/crates.io-index" 306 + checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" 307 + dependencies = [ 308 + "percent-encoding", 309 + ] 310 + 311 + [[package]] 312 + name = "futures-channel" 313 + version = "0.3.31" 314 + source = "registry+https://github.com/rust-lang/crates.io-index" 315 + checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" 316 + dependencies = [ 317 + "futures-core", 318 + ] 319 + 320 + [[package]] 321 + name = "futures-core" 322 + version = "0.3.31" 323 + source = "registry+https://github.com/rust-lang/crates.io-index" 324 + checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" 325 + 326 + [[package]] 327 + name = "futures-sink" 328 + version = "0.3.31" 329 + source = "registry+https://github.com/rust-lang/crates.io-index" 330 + checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" 331 + 332 + [[package]] 333 + name = "futures-task" 334 + version = "0.3.31" 335 + source = "registry+https://github.com/rust-lang/crates.io-index" 336 + checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" 337 + 338 + [[package]] 339 + name = "futures-util" 340 + version = "0.3.31" 341 + source = "registry+https://github.com/rust-lang/crates.io-index" 342 + checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" 343 + dependencies = [ 344 + "futures-core", 345 + "futures-task", 346 + "pin-project-lite", 347 + "pin-utils", 348 + ] 349 + 350 + [[package]] 351 + name = "getrandom" 352 + version = "0.2.16" 353 + source = "registry+https://github.com/rust-lang/crates.io-index" 354 + checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" 355 + dependencies = [ 356 + "cfg-if", 357 + "libc", 358 + "wasi 0.11.0+wasi-snapshot-preview1", 359 + ] 360 + 361 + [[package]] 362 + name = "getrandom" 363 + version = "0.3.2" 364 + source = "registry+https://github.com/rust-lang/crates.io-index" 365 + checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" 366 + dependencies = [ 367 + "cfg-if", 368 + "libc", 369 + "r-efi", 370 + "wasi 0.14.2+wasi-0.2.4", 371 + ] 372 + 373 + [[package]] 374 + name = "gimli" 375 + version = "0.31.1" 376 + source = "registry+https://github.com/rust-lang/crates.io-index" 377 + checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" 378 + 379 + [[package]] 380 + name = "h2" 381 + version = "0.4.9" 382 + source = "registry+https://github.com/rust-lang/crates.io-index" 383 + checksum = "75249d144030531f8dee69fe9cea04d3edf809a017ae445e2abdff6629e86633" 384 + dependencies = [ 385 + "atomic-waker", 386 + "bytes", 387 + "fnv", 388 + "futures-core", 389 + "futures-sink", 390 + "http", 391 + "indexmap", 392 + "slab", 393 + "tokio", 394 + "tokio-util", 395 + "tracing", 396 + ] 397 + 398 + [[package]] 399 + name = "hashbrown" 400 + version = "0.15.2" 401 + source = "registry+https://github.com/rust-lang/crates.io-index" 402 + checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" 403 + dependencies = [ 404 + "allocator-api2", 405 + "equivalent", 406 + "foldhash", 407 + ] 408 + 409 + [[package]] 410 + name = "heck" 411 + version = "0.5.0" 412 + source = "registry+https://github.com/rust-lang/crates.io-index" 413 + checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" 414 + 415 + [[package]] 416 + name = "http" 417 + version = "1.3.1" 418 + source = "registry+https://github.com/rust-lang/crates.io-index" 419 + checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" 420 + dependencies = [ 421 + "bytes", 422 + "fnv", 423 + "itoa", 424 + ] 425 + 426 + [[package]] 427 + name = "http-body" 428 + version = "1.0.1" 429 + source = "registry+https://github.com/rust-lang/crates.io-index" 430 + checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" 431 + dependencies = [ 432 + "bytes", 433 + "http", 434 + ] 435 + 436 + [[package]] 437 + name = "http-body-util" 438 + version = "0.1.3" 439 + source = "registry+https://github.com/rust-lang/crates.io-index" 440 + checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" 441 + dependencies = [ 442 + "bytes", 443 + "futures-core", 444 + "http", 445 + "http-body", 446 + "pin-project-lite", 447 + ] 448 + 449 + [[package]] 450 + name = "httparse" 451 + version = "1.10.1" 452 + source = "registry+https://github.com/rust-lang/crates.io-index" 453 + checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" 454 + 455 + [[package]] 456 + name = "hyper" 457 + version = "1.6.0" 458 + source = "registry+https://github.com/rust-lang/crates.io-index" 459 + checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" 460 + dependencies = [ 461 + "bytes", 462 + "futures-channel", 463 + "futures-util", 464 + "h2", 465 + "http", 466 + "http-body", 467 + "httparse", 468 + "itoa", 469 + "pin-project-lite", 470 + "smallvec", 471 + "tokio", 472 + "want", 473 + ] 474 + 475 + [[package]] 476 + name = "hyper-rustls" 477 + version = "0.27.5" 478 + source = "registry+https://github.com/rust-lang/crates.io-index" 479 + checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" 480 + dependencies = [ 481 + "futures-util", 482 + "http", 483 + "hyper", 484 + "hyper-util", 485 + "rustls", 486 + "rustls-pki-types", 487 + "tokio", 488 + "tokio-rustls", 489 + "tower-service", 490 + ] 491 + 492 + [[package]] 493 + name = "hyper-tls" 494 + version = "0.6.0" 495 + source = "registry+https://github.com/rust-lang/crates.io-index" 496 + checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" 497 + dependencies = [ 498 + "bytes", 499 + "http-body-util", 500 + "hyper", 501 + "hyper-util", 502 + "native-tls", 503 + "tokio", 504 + "tokio-native-tls", 505 + "tower-service", 506 + ] 507 + 508 + [[package]] 509 + name = "hyper-util" 510 + version = "0.1.11" 511 + source = "registry+https://github.com/rust-lang/crates.io-index" 512 + checksum = "497bbc33a26fdd4af9ed9c70d63f61cf56a938375fbb32df34db9b1cd6d643f2" 513 + dependencies = [ 514 + "bytes", 515 + "futures-channel", 516 + "futures-util", 517 + "http", 518 + "http-body", 519 + "hyper", 520 + "libc", 521 + "pin-project-lite", 522 + "socket2", 523 + "tokio", 524 + "tower-service", 525 + "tracing", 526 + ] 527 + 528 + [[package]] 529 + name = "iana-time-zone" 530 + version = "0.1.63" 531 + source = "registry+https://github.com/rust-lang/crates.io-index" 532 + checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" 533 + dependencies = [ 534 + "android_system_properties", 535 + "core-foundation-sys", 536 + "iana-time-zone-haiku", 537 + "js-sys", 538 + "log", 539 + "wasm-bindgen", 540 + "windows-core", 541 + ] 542 + 543 + [[package]] 544 + name = "iana-time-zone-haiku" 545 + version = "0.1.2" 546 + source = "registry+https://github.com/rust-lang/crates.io-index" 547 + checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" 548 + dependencies = [ 549 + "cc", 550 + ] 551 + 552 + [[package]] 553 + name = "icu_collections" 554 + version = "1.5.0" 555 + source = "registry+https://github.com/rust-lang/crates.io-index" 556 + checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" 557 + dependencies = [ 558 + "displaydoc", 559 + "yoke", 560 + "zerofrom", 561 + "zerovec", 562 + ] 563 + 564 + [[package]] 565 + name = "icu_locid" 566 + version = "1.5.0" 567 + source = "registry+https://github.com/rust-lang/crates.io-index" 568 + checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" 569 + dependencies = [ 570 + "displaydoc", 571 + "litemap", 572 + "tinystr", 573 + "writeable", 574 + "zerovec", 575 + ] 576 + 577 + [[package]] 578 + name = "icu_locid_transform" 579 + version = "1.5.0" 580 + source = "registry+https://github.com/rust-lang/crates.io-index" 581 + checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" 582 + dependencies = [ 583 + "displaydoc", 584 + "icu_locid", 585 + "icu_locid_transform_data", 586 + "icu_provider", 587 + "tinystr", 588 + "zerovec", 589 + ] 590 + 591 + [[package]] 592 + name = "icu_locid_transform_data" 593 + version = "1.5.1" 594 + source = "registry+https://github.com/rust-lang/crates.io-index" 595 + checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d" 596 + 597 + [[package]] 598 + name = "icu_normalizer" 599 + version = "1.5.0" 600 + source = "registry+https://github.com/rust-lang/crates.io-index" 601 + checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" 602 + dependencies = [ 603 + "displaydoc", 604 + "icu_collections", 605 + "icu_normalizer_data", 606 + "icu_properties", 607 + "icu_provider", 608 + "smallvec", 609 + "utf16_iter", 610 + "utf8_iter", 611 + "write16", 612 + "zerovec", 613 + ] 614 + 615 + [[package]] 616 + name = "icu_normalizer_data" 617 + version = "1.5.1" 618 + source = "registry+https://github.com/rust-lang/crates.io-index" 619 + checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7" 620 + 621 + [[package]] 622 + name = "icu_properties" 623 + version = "1.5.1" 624 + source = "registry+https://github.com/rust-lang/crates.io-index" 625 + checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" 626 + dependencies = [ 627 + "displaydoc", 628 + "icu_collections", 629 + "icu_locid_transform", 630 + "icu_properties_data", 631 + "icu_provider", 632 + "tinystr", 633 + "zerovec", 634 + ] 635 + 636 + [[package]] 637 + name = "icu_properties_data" 638 + version = "1.5.1" 639 + source = "registry+https://github.com/rust-lang/crates.io-index" 640 + checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2" 641 + 642 + [[package]] 643 + name = "icu_provider" 644 + version = "1.5.0" 645 + source = "registry+https://github.com/rust-lang/crates.io-index" 646 + checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" 647 + dependencies = [ 648 + "displaydoc", 649 + "icu_locid", 650 + "icu_provider_macros", 651 + "stable_deref_trait", 652 + "tinystr", 653 + "writeable", 654 + "yoke", 655 + "zerofrom", 656 + "zerovec", 657 + ] 658 + 659 + [[package]] 660 + name = "icu_provider_macros" 661 + version = "1.5.0" 662 + source = "registry+https://github.com/rust-lang/crates.io-index" 663 + checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" 664 + dependencies = [ 665 + "proc-macro2", 666 + "quote", 667 + "syn", 668 + ] 669 + 670 + [[package]] 671 + name = "ident_case" 672 + version = "1.0.1" 673 + source = "registry+https://github.com/rust-lang/crates.io-index" 674 + checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" 675 + 676 + [[package]] 677 + name = "idna" 678 + version = "1.0.3" 679 + source = "registry+https://github.com/rust-lang/crates.io-index" 680 + checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" 681 + dependencies = [ 682 + "idna_adapter", 683 + "smallvec", 684 + "utf8_iter", 685 + ] 686 + 687 + [[package]] 688 + name = "idna_adapter" 689 + version = "1.2.0" 690 + source = "registry+https://github.com/rust-lang/crates.io-index" 691 + checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" 692 + dependencies = [ 693 + "icu_normalizer", 694 + "icu_properties", 695 + ] 696 + 697 + [[package]] 698 + name = "indexmap" 699 + version = "2.9.0" 700 + source = "registry+https://github.com/rust-lang/crates.io-index" 701 + checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e" 702 + dependencies = [ 703 + "equivalent", 704 + "hashbrown", 705 + ] 706 + 707 + [[package]] 708 + name = "indoc" 709 + version = "2.0.6" 710 + source = "registry+https://github.com/rust-lang/crates.io-index" 711 + checksum = "f4c7245a08504955605670dbf141fceab975f15ca21570696aebe9d2e71576bd" 712 + 713 + [[package]] 714 + name = "instability" 715 + version = "0.3.7" 716 + source = "registry+https://github.com/rust-lang/crates.io-index" 717 + checksum = "0bf9fed6d91cfb734e7476a06bde8300a1b94e217e1b523b6f0cd1a01998c71d" 718 + dependencies = [ 719 + "darling", 720 + "indoc", 721 + "proc-macro2", 722 + "quote", 723 + "syn", 724 + ] 725 + 726 + [[package]] 727 + name = "ipnet" 728 + version = "2.11.0" 729 + source = "registry+https://github.com/rust-lang/crates.io-index" 730 + checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" 731 + 732 + [[package]] 733 + name = "itertools" 734 + version = "0.13.0" 735 + source = "registry+https://github.com/rust-lang/crates.io-index" 736 + checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" 737 + dependencies = [ 738 + "either", 739 + ] 740 + 741 + [[package]] 742 + name = "itoa" 743 + version = "1.0.15" 744 + source = "registry+https://github.com/rust-lang/crates.io-index" 745 + checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" 746 + 747 + [[package]] 748 + name = "js-sys" 749 + version = "0.3.77" 750 + source = "registry+https://github.com/rust-lang/crates.io-index" 751 + checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" 752 + dependencies = [ 753 + "once_cell", 754 + "wasm-bindgen", 755 + ] 756 + 757 + [[package]] 758 + name = "lazy_static" 759 + version = "1.5.0" 760 + source = "registry+https://github.com/rust-lang/crates.io-index" 761 + checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 762 + 763 + [[package]] 764 + name = "libc" 765 + version = "0.2.172" 766 + source = "registry+https://github.com/rust-lang/crates.io-index" 767 + checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" 768 + 769 + [[package]] 770 + name = "linux-raw-sys" 771 + version = "0.4.15" 772 + source = "registry+https://github.com/rust-lang/crates.io-index" 773 + checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" 774 + 775 + [[package]] 776 + name = "linux-raw-sys" 777 + version = "0.9.4" 778 + source = "registry+https://github.com/rust-lang/crates.io-index" 779 + checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" 780 + 781 + [[package]] 782 + name = "litemap" 783 + version = "0.7.5" 784 + source = "registry+https://github.com/rust-lang/crates.io-index" 785 + checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" 786 + 787 + [[package]] 788 + name = "lock_api" 789 + version = "0.4.12" 790 + source = "registry+https://github.com/rust-lang/crates.io-index" 791 + checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" 792 + dependencies = [ 793 + "autocfg", 794 + "scopeguard", 795 + ] 796 + 797 + [[package]] 798 + name = "log" 799 + version = "0.4.27" 800 + source = "registry+https://github.com/rust-lang/crates.io-index" 801 + checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" 802 + 803 + [[package]] 804 + name = "lru" 805 + version = "0.12.5" 806 + source = "registry+https://github.com/rust-lang/crates.io-index" 807 + checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" 808 + dependencies = [ 809 + "hashbrown", 810 + ] 811 + 812 + [[package]] 813 + name = "memchr" 814 + version = "2.7.4" 815 + source = "registry+https://github.com/rust-lang/crates.io-index" 816 + checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" 817 + 818 + [[package]] 819 + name = "mime" 820 + version = "0.3.17" 821 + source = "registry+https://github.com/rust-lang/crates.io-index" 822 + checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" 823 + 824 + [[package]] 825 + name = "miniz_oxide" 826 + version = "0.8.8" 827 + source = "registry+https://github.com/rust-lang/crates.io-index" 828 + checksum = "3be647b768db090acb35d5ec5db2b0e1f1de11133ca123b9eacf5137868f892a" 829 + dependencies = [ 830 + "adler2", 831 + ] 832 + 833 + [[package]] 834 + name = "mio" 835 + version = "1.0.3" 836 + source = "registry+https://github.com/rust-lang/crates.io-index" 837 + checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" 838 + dependencies = [ 839 + "libc", 840 + "log", 841 + "wasi 0.11.0+wasi-snapshot-preview1", 842 + "windows-sys 0.52.0", 843 + ] 844 + 845 + [[package]] 846 + name = "native-tls" 847 + version = "0.2.14" 848 + source = "registry+https://github.com/rust-lang/crates.io-index" 849 + checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" 850 + dependencies = [ 851 + "libc", 852 + "log", 853 + "openssl", 854 + "openssl-probe", 855 + "openssl-sys", 856 + "schannel", 857 + "security-framework", 858 + "security-framework-sys", 859 + "tempfile", 860 + ] 861 + 862 + [[package]] 863 + name = "nu-ansi-term" 864 + version = "0.46.0" 865 + source = "registry+https://github.com/rust-lang/crates.io-index" 866 + checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" 867 + dependencies = [ 868 + "overload", 869 + "winapi", 870 + ] 871 + 872 + [[package]] 873 + name = "num-traits" 874 + version = "0.2.19" 875 + source = "registry+https://github.com/rust-lang/crates.io-index" 876 + checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 877 + dependencies = [ 878 + "autocfg", 879 + ] 880 + 881 + [[package]] 882 + name = "object" 883 + version = "0.36.7" 884 + source = "registry+https://github.com/rust-lang/crates.io-index" 885 + checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" 886 + dependencies = [ 887 + "memchr", 888 + ] 889 + 890 + [[package]] 891 + name = "once_cell" 892 + version = "1.21.3" 893 + source = "registry+https://github.com/rust-lang/crates.io-index" 894 + checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" 895 + 896 + [[package]] 897 + name = "openssl" 898 + version = "0.10.72" 899 + source = "registry+https://github.com/rust-lang/crates.io-index" 900 + checksum = "fedfea7d58a1f73118430a55da6a286e7b044961736ce96a16a17068ea25e5da" 901 + dependencies = [ 902 + "bitflags", 903 + "cfg-if", 904 + "foreign-types", 905 + "libc", 906 + "once_cell", 907 + "openssl-macros", 908 + "openssl-sys", 909 + ] 910 + 911 + [[package]] 912 + name = "openssl-macros" 913 + version = "0.1.1" 914 + source = "registry+https://github.com/rust-lang/crates.io-index" 915 + checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" 916 + dependencies = [ 917 + "proc-macro2", 918 + "quote", 919 + "syn", 920 + ] 921 + 922 + [[package]] 923 + name = "openssl-probe" 924 + version = "0.1.6" 925 + source = "registry+https://github.com/rust-lang/crates.io-index" 926 + checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" 927 + 928 + [[package]] 929 + name = "openssl-sys" 930 + version = "0.9.107" 931 + source = "registry+https://github.com/rust-lang/crates.io-index" 932 + checksum = "8288979acd84749c744a9014b4382d42b8f7b2592847b5afb2ed29e5d16ede07" 933 + dependencies = [ 934 + "cc", 935 + "libc", 936 + "pkg-config", 937 + "vcpkg", 938 + ] 939 + 940 + [[package]] 941 + name = "overload" 942 + version = "0.1.1" 943 + source = "registry+https://github.com/rust-lang/crates.io-index" 944 + checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" 945 + 946 + [[package]] 947 + name = "parking_lot" 948 + version = "0.12.3" 949 + source = "registry+https://github.com/rust-lang/crates.io-index" 950 + checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" 951 + dependencies = [ 952 + "lock_api", 953 + "parking_lot_core", 954 + ] 955 + 956 + [[package]] 957 + name = "parking_lot_core" 958 + version = "0.9.10" 959 + source = "registry+https://github.com/rust-lang/crates.io-index" 960 + checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" 961 + dependencies = [ 962 + "cfg-if", 963 + "libc", 964 + "redox_syscall", 965 + "smallvec", 966 + "windows-targets 0.52.6", 967 + ] 968 + 969 + [[package]] 970 + name = "paste" 971 + version = "1.0.15" 972 + source = "registry+https://github.com/rust-lang/crates.io-index" 973 + checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" 974 + 975 + [[package]] 976 + name = "percent-encoding" 977 + version = "2.3.1" 978 + source = "registry+https://github.com/rust-lang/crates.io-index" 979 + checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" 980 + 981 + [[package]] 982 + name = "pin-project-lite" 983 + version = "0.2.16" 984 + source = "registry+https://github.com/rust-lang/crates.io-index" 985 + checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" 986 + 987 + [[package]] 988 + name = "pin-utils" 989 + version = "0.1.0" 990 + source = "registry+https://github.com/rust-lang/crates.io-index" 991 + checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" 992 + 993 + [[package]] 994 + name = "pkg-config" 995 + version = "0.3.32" 996 + source = "registry+https://github.com/rust-lang/crates.io-index" 997 + checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" 998 + 999 + [[package]] 1000 + name = "proc-macro2" 1001 + version = "1.0.95" 1002 + source = "registry+https://github.com/rust-lang/crates.io-index" 1003 + checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" 1004 + dependencies = [ 1005 + "unicode-ident", 1006 + ] 1007 + 1008 + [[package]] 1009 + name = "quote" 1010 + version = "1.0.40" 1011 + source = "registry+https://github.com/rust-lang/crates.io-index" 1012 + checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" 1013 + dependencies = [ 1014 + "proc-macro2", 1015 + ] 1016 + 1017 + [[package]] 1018 + name = "r-efi" 1019 + version = "5.2.0" 1020 + source = "registry+https://github.com/rust-lang/crates.io-index" 1021 + checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" 1022 + 1023 + [[package]] 1024 + name = "ratatui" 1025 + version = "0.29.0" 1026 + source = "registry+https://github.com/rust-lang/crates.io-index" 1027 + checksum = "eabd94c2f37801c20583fc49dd5cd6b0ba68c716787c2dd6ed18571e1e63117b" 1028 + dependencies = [ 1029 + "bitflags", 1030 + "cassowary", 1031 + "compact_str", 1032 + "crossterm", 1033 + "indoc", 1034 + "instability", 1035 + "itertools", 1036 + "lru", 1037 + "paste", 1038 + "strum", 1039 + "unicode-segmentation", 1040 + "unicode-truncate", 1041 + "unicode-width 0.2.0", 1042 + ] 1043 + 1044 + [[package]] 1045 + name = "redox_syscall" 1046 + version = "0.5.11" 1047 + source = "registry+https://github.com/rust-lang/crates.io-index" 1048 + checksum = "d2f103c6d277498fbceb16e84d317e2a400f160f46904d5f5410848c829511a3" 1049 + dependencies = [ 1050 + "bitflags", 1051 + ] 1052 + 1053 + [[package]] 1054 + name = "reqwest" 1055 + version = "0.12.15" 1056 + source = "registry+https://github.com/rust-lang/crates.io-index" 1057 + checksum = "d19c46a6fdd48bc4dab94b6103fccc55d34c67cc0ad04653aad4ea2a07cd7bbb" 1058 + dependencies = [ 1059 + "base64", 1060 + "bytes", 1061 + "encoding_rs", 1062 + "futures-core", 1063 + "futures-util", 1064 + "h2", 1065 + "http", 1066 + "http-body", 1067 + "http-body-util", 1068 + "hyper", 1069 + "hyper-rustls", 1070 + "hyper-tls", 1071 + "hyper-util", 1072 + "ipnet", 1073 + "js-sys", 1074 + "log", 1075 + "mime", 1076 + "native-tls", 1077 + "once_cell", 1078 + "percent-encoding", 1079 + "pin-project-lite", 1080 + "rustls-pemfile", 1081 + "serde", 1082 + "serde_json", 1083 + "serde_urlencoded", 1084 + "sync_wrapper", 1085 + "system-configuration", 1086 + "tokio", 1087 + "tokio-native-tls", 1088 + "tower", 1089 + "tower-service", 1090 + "url", 1091 + "wasm-bindgen", 1092 + "wasm-bindgen-futures", 1093 + "web-sys", 1094 + "windows-registry", 1095 + ] 1096 + 1097 + [[package]] 1098 + name = "ring" 1099 + version = "0.17.14" 1100 + source = "registry+https://github.com/rust-lang/crates.io-index" 1101 + checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" 1102 + dependencies = [ 1103 + "cc", 1104 + "cfg-if", 1105 + "getrandom 0.2.16", 1106 + "libc", 1107 + "untrusted", 1108 + "windows-sys 0.52.0", 1109 + ] 1110 + 1111 + [[package]] 1112 + name = "rustc-demangle" 1113 + version = "0.1.24" 1114 + source = "registry+https://github.com/rust-lang/crates.io-index" 1115 + checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" 1116 + 1117 + [[package]] 1118 + name = "rustix" 1119 + version = "0.38.44" 1120 + source = "registry+https://github.com/rust-lang/crates.io-index" 1121 + checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" 1122 + dependencies = [ 1123 + "bitflags", 1124 + "errno", 1125 + "libc", 1126 + "linux-raw-sys 0.4.15", 1127 + "windows-sys 0.59.0", 1128 + ] 1129 + 1130 + [[package]] 1131 + name = "rustix" 1132 + version = "1.0.5" 1133 + source = "registry+https://github.com/rust-lang/crates.io-index" 1134 + checksum = "d97817398dd4bb2e6da002002db259209759911da105da92bec29ccb12cf58bf" 1135 + dependencies = [ 1136 + "bitflags", 1137 + "errno", 1138 + "libc", 1139 + "linux-raw-sys 0.9.4", 1140 + "windows-sys 0.59.0", 1141 + ] 1142 + 1143 + [[package]] 1144 + name = "rustls" 1145 + version = "0.23.26" 1146 + source = "registry+https://github.com/rust-lang/crates.io-index" 1147 + checksum = "df51b5869f3a441595eac5e8ff14d486ff285f7b8c0df8770e49c3b56351f0f0" 1148 + dependencies = [ 1149 + "once_cell", 1150 + "rustls-pki-types", 1151 + "rustls-webpki", 1152 + "subtle", 1153 + "zeroize", 1154 + ] 1155 + 1156 + [[package]] 1157 + name = "rustls-pemfile" 1158 + version = "2.2.0" 1159 + source = "registry+https://github.com/rust-lang/crates.io-index" 1160 + checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" 1161 + dependencies = [ 1162 + "rustls-pki-types", 1163 + ] 1164 + 1165 + [[package]] 1166 + name = "rustls-pki-types" 1167 + version = "1.11.0" 1168 + source = "registry+https://github.com/rust-lang/crates.io-index" 1169 + checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" 1170 + 1171 + [[package]] 1172 + name = "rustls-webpki" 1173 + version = "0.103.1" 1174 + source = "registry+https://github.com/rust-lang/crates.io-index" 1175 + checksum = "fef8b8769aaccf73098557a87cd1816b4f9c7c16811c9c77142aa695c16f2c03" 1176 + dependencies = [ 1177 + "ring", 1178 + "rustls-pki-types", 1179 + "untrusted", 1180 + ] 1181 + 1182 + [[package]] 1183 + name = "rustversion" 1184 + version = "1.0.20" 1185 + source = "registry+https://github.com/rust-lang/crates.io-index" 1186 + checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" 1187 + 1188 + [[package]] 1189 + name = "ryu" 1190 + version = "1.0.20" 1191 + source = "registry+https://github.com/rust-lang/crates.io-index" 1192 + checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" 1193 + 1194 + [[package]] 1195 + name = "sattelite_observers" 1196 + version = "0.1.0" 1197 + dependencies = [ 1198 + "chrono", 1199 + "ratatui", 1200 + "reqwest", 1201 + "serde", 1202 + "sgp4", 1203 + "tokio", 1204 + "tracing", 1205 + "tracing-error", 1206 + "tracing-subscriber", 1207 + ] 1208 + 1209 + [[package]] 1210 + name = "schannel" 1211 + version = "0.1.27" 1212 + source = "registry+https://github.com/rust-lang/crates.io-index" 1213 + checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" 1214 + dependencies = [ 1215 + "windows-sys 0.59.0", 1216 + ] 1217 + 1218 + [[package]] 1219 + name = "scopeguard" 1220 + version = "1.2.0" 1221 + source = "registry+https://github.com/rust-lang/crates.io-index" 1222 + checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 1223 + 1224 + [[package]] 1225 + name = "security-framework" 1226 + version = "2.11.1" 1227 + source = "registry+https://github.com/rust-lang/crates.io-index" 1228 + checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" 1229 + dependencies = [ 1230 + "bitflags", 1231 + "core-foundation", 1232 + "core-foundation-sys", 1233 + "libc", 1234 + "security-framework-sys", 1235 + ] 1236 + 1237 + [[package]] 1238 + name = "security-framework-sys" 1239 + version = "2.14.0" 1240 + source = "registry+https://github.com/rust-lang/crates.io-index" 1241 + checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" 1242 + dependencies = [ 1243 + "core-foundation-sys", 1244 + "libc", 1245 + ] 1246 + 1247 + [[package]] 1248 + name = "serde" 1249 + version = "1.0.219" 1250 + source = "registry+https://github.com/rust-lang/crates.io-index" 1251 + checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" 1252 + dependencies = [ 1253 + "serde_derive", 1254 + ] 1255 + 1256 + [[package]] 1257 + name = "serde_derive" 1258 + version = "1.0.219" 1259 + source = "registry+https://github.com/rust-lang/crates.io-index" 1260 + checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" 1261 + dependencies = [ 1262 + "proc-macro2", 1263 + "quote", 1264 + "syn", 1265 + ] 1266 + 1267 + [[package]] 1268 + name = "serde_json" 1269 + version = "1.0.140" 1270 + source = "registry+https://github.com/rust-lang/crates.io-index" 1271 + checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" 1272 + dependencies = [ 1273 + "itoa", 1274 + "memchr", 1275 + "ryu", 1276 + "serde", 1277 + ] 1278 + 1279 + [[package]] 1280 + name = "serde_urlencoded" 1281 + version = "0.7.1" 1282 + source = "registry+https://github.com/rust-lang/crates.io-index" 1283 + checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" 1284 + dependencies = [ 1285 + "form_urlencoded", 1286 + "itoa", 1287 + "ryu", 1288 + "serde", 1289 + ] 1290 + 1291 + [[package]] 1292 + name = "sgp4" 1293 + version = "2.2.0" 1294 + source = "registry+https://github.com/rust-lang/crates.io-index" 1295 + checksum = "1e4b1f4474b6f9c1edcf6c74288127f3d5528d19160b817382e5b7db70637cf1" 1296 + dependencies = [ 1297 + "chrono", 1298 + "serde", 1299 + "serde_json", 1300 + ] 1301 + 1302 + [[package]] 1303 + name = "sharded-slab" 1304 + version = "0.1.7" 1305 + source = "registry+https://github.com/rust-lang/crates.io-index" 1306 + checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" 1307 + dependencies = [ 1308 + "lazy_static", 1309 + ] 1310 + 1311 + [[package]] 1312 + name = "shlex" 1313 + version = "1.3.0" 1314 + source = "registry+https://github.com/rust-lang/crates.io-index" 1315 + checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 1316 + 1317 + [[package]] 1318 + name = "signal-hook" 1319 + version = "0.3.17" 1320 + source = "registry+https://github.com/rust-lang/crates.io-index" 1321 + checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801" 1322 + dependencies = [ 1323 + "libc", 1324 + "signal-hook-registry", 1325 + ] 1326 + 1327 + [[package]] 1328 + name = "signal-hook-mio" 1329 + version = "0.2.4" 1330 + source = "registry+https://github.com/rust-lang/crates.io-index" 1331 + checksum = "34db1a06d485c9142248b7a054f034b349b212551f3dfd19c94d45a754a217cd" 1332 + dependencies = [ 1333 + "libc", 1334 + "mio", 1335 + "signal-hook", 1336 + ] 1337 + 1338 + [[package]] 1339 + name = "signal-hook-registry" 1340 + version = "1.4.5" 1341 + source = "registry+https://github.com/rust-lang/crates.io-index" 1342 + checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410" 1343 + dependencies = [ 1344 + "libc", 1345 + ] 1346 + 1347 + [[package]] 1348 + name = "slab" 1349 + version = "0.4.9" 1350 + source = "registry+https://github.com/rust-lang/crates.io-index" 1351 + checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" 1352 + dependencies = [ 1353 + "autocfg", 1354 + ] 1355 + 1356 + [[package]] 1357 + name = "smallvec" 1358 + version = "1.15.0" 1359 + source = "registry+https://github.com/rust-lang/crates.io-index" 1360 + checksum = "8917285742e9f3e1683f0a9c4e6b57960b7314d0b08d30d1ecd426713ee2eee9" 1361 + 1362 + [[package]] 1363 + name = "socket2" 1364 + version = "0.5.9" 1365 + source = "registry+https://github.com/rust-lang/crates.io-index" 1366 + checksum = "4f5fd57c80058a56cf5c777ab8a126398ece8e442983605d280a44ce79d0edef" 1367 + dependencies = [ 1368 + "libc", 1369 + "windows-sys 0.52.0", 1370 + ] 1371 + 1372 + [[package]] 1373 + name = "stable_deref_trait" 1374 + version = "1.2.0" 1375 + source = "registry+https://github.com/rust-lang/crates.io-index" 1376 + checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" 1377 + 1378 + [[package]] 1379 + name = "static_assertions" 1380 + version = "1.1.0" 1381 + source = "registry+https://github.com/rust-lang/crates.io-index" 1382 + checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" 1383 + 1384 + [[package]] 1385 + name = "strsim" 1386 + version = "0.11.1" 1387 + source = "registry+https://github.com/rust-lang/crates.io-index" 1388 + checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" 1389 + 1390 + [[package]] 1391 + name = "strum" 1392 + version = "0.26.3" 1393 + source = "registry+https://github.com/rust-lang/crates.io-index" 1394 + checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" 1395 + dependencies = [ 1396 + "strum_macros", 1397 + ] 1398 + 1399 + [[package]] 1400 + name = "strum_macros" 1401 + version = "0.26.4" 1402 + source = "registry+https://github.com/rust-lang/crates.io-index" 1403 + checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" 1404 + dependencies = [ 1405 + "heck", 1406 + "proc-macro2", 1407 + "quote", 1408 + "rustversion", 1409 + "syn", 1410 + ] 1411 + 1412 + [[package]] 1413 + name = "subtle" 1414 + version = "2.6.1" 1415 + source = "registry+https://github.com/rust-lang/crates.io-index" 1416 + checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" 1417 + 1418 + [[package]] 1419 + name = "syn" 1420 + version = "2.0.101" 1421 + source = "registry+https://github.com/rust-lang/crates.io-index" 1422 + checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" 1423 + dependencies = [ 1424 + "proc-macro2", 1425 + "quote", 1426 + "unicode-ident", 1427 + ] 1428 + 1429 + [[package]] 1430 + name = "sync_wrapper" 1431 + version = "1.0.2" 1432 + source = "registry+https://github.com/rust-lang/crates.io-index" 1433 + checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" 1434 + dependencies = [ 1435 + "futures-core", 1436 + ] 1437 + 1438 + [[package]] 1439 + name = "synstructure" 1440 + version = "0.13.1" 1441 + source = "registry+https://github.com/rust-lang/crates.io-index" 1442 + checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" 1443 + dependencies = [ 1444 + "proc-macro2", 1445 + "quote", 1446 + "syn", 1447 + ] 1448 + 1449 + [[package]] 1450 + name = "system-configuration" 1451 + version = "0.6.1" 1452 + source = "registry+https://github.com/rust-lang/crates.io-index" 1453 + checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" 1454 + dependencies = [ 1455 + "bitflags", 1456 + "core-foundation", 1457 + "system-configuration-sys", 1458 + ] 1459 + 1460 + [[package]] 1461 + name = "system-configuration-sys" 1462 + version = "0.6.0" 1463 + source = "registry+https://github.com/rust-lang/crates.io-index" 1464 + checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" 1465 + dependencies = [ 1466 + "core-foundation-sys", 1467 + "libc", 1468 + ] 1469 + 1470 + [[package]] 1471 + name = "tempfile" 1472 + version = "3.19.1" 1473 + source = "registry+https://github.com/rust-lang/crates.io-index" 1474 + checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf" 1475 + dependencies = [ 1476 + "fastrand", 1477 + "getrandom 0.3.2", 1478 + "once_cell", 1479 + "rustix 1.0.5", 1480 + "windows-sys 0.59.0", 1481 + ] 1482 + 1483 + [[package]] 1484 + name = "thread_local" 1485 + version = "1.1.8" 1486 + source = "registry+https://github.com/rust-lang/crates.io-index" 1487 + checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" 1488 + dependencies = [ 1489 + "cfg-if", 1490 + "once_cell", 1491 + ] 1492 + 1493 + [[package]] 1494 + name = "tinystr" 1495 + version = "0.7.6" 1496 + source = "registry+https://github.com/rust-lang/crates.io-index" 1497 + checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" 1498 + dependencies = [ 1499 + "displaydoc", 1500 + "zerovec", 1501 + ] 1502 + 1503 + [[package]] 1504 + name = "tokio" 1505 + version = "1.44.2" 1506 + source = "registry+https://github.com/rust-lang/crates.io-index" 1507 + checksum = "e6b88822cbe49de4185e3a4cbf8321dd487cf5fe0c5c65695fef6346371e9c48" 1508 + dependencies = [ 1509 + "backtrace", 1510 + "bytes", 1511 + "libc", 1512 + "mio", 1513 + "parking_lot", 1514 + "pin-project-lite", 1515 + "signal-hook-registry", 1516 + "socket2", 1517 + "tokio-macros", 1518 + "windows-sys 0.52.0", 1519 + ] 1520 + 1521 + [[package]] 1522 + name = "tokio-macros" 1523 + version = "2.5.0" 1524 + source = "registry+https://github.com/rust-lang/crates.io-index" 1525 + checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" 1526 + dependencies = [ 1527 + "proc-macro2", 1528 + "quote", 1529 + "syn", 1530 + ] 1531 + 1532 + [[package]] 1533 + name = "tokio-native-tls" 1534 + version = "0.3.1" 1535 + source = "registry+https://github.com/rust-lang/crates.io-index" 1536 + checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" 1537 + dependencies = [ 1538 + "native-tls", 1539 + "tokio", 1540 + ] 1541 + 1542 + [[package]] 1543 + name = "tokio-rustls" 1544 + version = "0.26.2" 1545 + source = "registry+https://github.com/rust-lang/crates.io-index" 1546 + checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" 1547 + dependencies = [ 1548 + "rustls", 1549 + "tokio", 1550 + ] 1551 + 1552 + [[package]] 1553 + name = "tokio-util" 1554 + version = "0.7.15" 1555 + source = "registry+https://github.com/rust-lang/crates.io-index" 1556 + checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df" 1557 + dependencies = [ 1558 + "bytes", 1559 + "futures-core", 1560 + "futures-sink", 1561 + "pin-project-lite", 1562 + "tokio", 1563 + ] 1564 + 1565 + [[package]] 1566 + name = "tower" 1567 + version = "0.5.2" 1568 + source = "registry+https://github.com/rust-lang/crates.io-index" 1569 + checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" 1570 + dependencies = [ 1571 + "futures-core", 1572 + "futures-util", 1573 + "pin-project-lite", 1574 + "sync_wrapper", 1575 + "tokio", 1576 + "tower-layer", 1577 + "tower-service", 1578 + ] 1579 + 1580 + [[package]] 1581 + name = "tower-layer" 1582 + version = "0.3.3" 1583 + source = "registry+https://github.com/rust-lang/crates.io-index" 1584 + checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" 1585 + 1586 + [[package]] 1587 + name = "tower-service" 1588 + version = "0.3.3" 1589 + source = "registry+https://github.com/rust-lang/crates.io-index" 1590 + checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" 1591 + 1592 + [[package]] 1593 + name = "tracing" 1594 + version = "0.1.41" 1595 + source = "registry+https://github.com/rust-lang/crates.io-index" 1596 + checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" 1597 + dependencies = [ 1598 + "pin-project-lite", 1599 + "tracing-attributes", 1600 + "tracing-core", 1601 + ] 1602 + 1603 + [[package]] 1604 + name = "tracing-attributes" 1605 + version = "0.1.28" 1606 + source = "registry+https://github.com/rust-lang/crates.io-index" 1607 + checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" 1608 + dependencies = [ 1609 + "proc-macro2", 1610 + "quote", 1611 + "syn", 1612 + ] 1613 + 1614 + [[package]] 1615 + name = "tracing-core" 1616 + version = "0.1.33" 1617 + source = "registry+https://github.com/rust-lang/crates.io-index" 1618 + checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" 1619 + dependencies = [ 1620 + "once_cell", 1621 + "valuable", 1622 + ] 1623 + 1624 + [[package]] 1625 + name = "tracing-error" 1626 + version = "0.2.1" 1627 + source = "registry+https://github.com/rust-lang/crates.io-index" 1628 + checksum = "8b1581020d7a273442f5b45074a6a57d5757ad0a47dac0e9f0bd57b81936f3db" 1629 + dependencies = [ 1630 + "tracing", 1631 + "tracing-subscriber", 1632 + ] 1633 + 1634 + [[package]] 1635 + name = "tracing-log" 1636 + version = "0.2.0" 1637 + source = "registry+https://github.com/rust-lang/crates.io-index" 1638 + checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" 1639 + dependencies = [ 1640 + "log", 1641 + "once_cell", 1642 + "tracing-core", 1643 + ] 1644 + 1645 + [[package]] 1646 + name = "tracing-subscriber" 1647 + version = "0.3.19" 1648 + source = "registry+https://github.com/rust-lang/crates.io-index" 1649 + checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" 1650 + dependencies = [ 1651 + "nu-ansi-term", 1652 + "sharded-slab", 1653 + "smallvec", 1654 + "thread_local", 1655 + "tracing-core", 1656 + "tracing-log", 1657 + ] 1658 + 1659 + [[package]] 1660 + name = "try-lock" 1661 + version = "0.2.5" 1662 + source = "registry+https://github.com/rust-lang/crates.io-index" 1663 + checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" 1664 + 1665 + [[package]] 1666 + name = "unicode-ident" 1667 + version = "1.0.18" 1668 + source = "registry+https://github.com/rust-lang/crates.io-index" 1669 + checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" 1670 + 1671 + [[package]] 1672 + name = "unicode-segmentation" 1673 + version = "1.12.0" 1674 + source = "registry+https://github.com/rust-lang/crates.io-index" 1675 + checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" 1676 + 1677 + [[package]] 1678 + name = "unicode-truncate" 1679 + version = "1.1.0" 1680 + source = "registry+https://github.com/rust-lang/crates.io-index" 1681 + checksum = "b3644627a5af5fa321c95b9b235a72fd24cd29c648c2c379431e6628655627bf" 1682 + dependencies = [ 1683 + "itertools", 1684 + "unicode-segmentation", 1685 + "unicode-width 0.1.14", 1686 + ] 1687 + 1688 + [[package]] 1689 + name = "unicode-width" 1690 + version = "0.1.14" 1691 + source = "registry+https://github.com/rust-lang/crates.io-index" 1692 + checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" 1693 + 1694 + [[package]] 1695 + name = "unicode-width" 1696 + version = "0.2.0" 1697 + source = "registry+https://github.com/rust-lang/crates.io-index" 1698 + checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" 1699 + 1700 + [[package]] 1701 + name = "untrusted" 1702 + version = "0.9.0" 1703 + source = "registry+https://github.com/rust-lang/crates.io-index" 1704 + checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" 1705 + 1706 + [[package]] 1707 + name = "url" 1708 + version = "2.5.4" 1709 + source = "registry+https://github.com/rust-lang/crates.io-index" 1710 + checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" 1711 + dependencies = [ 1712 + "form_urlencoded", 1713 + "idna", 1714 + "percent-encoding", 1715 + ] 1716 + 1717 + [[package]] 1718 + name = "utf16_iter" 1719 + version = "1.0.5" 1720 + source = "registry+https://github.com/rust-lang/crates.io-index" 1721 + checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" 1722 + 1723 + [[package]] 1724 + name = "utf8_iter" 1725 + version = "1.0.4" 1726 + source = "registry+https://github.com/rust-lang/crates.io-index" 1727 + checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" 1728 + 1729 + [[package]] 1730 + name = "valuable" 1731 + version = "0.1.1" 1732 + source = "registry+https://github.com/rust-lang/crates.io-index" 1733 + checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" 1734 + 1735 + [[package]] 1736 + name = "vcpkg" 1737 + version = "0.2.15" 1738 + source = "registry+https://github.com/rust-lang/crates.io-index" 1739 + checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" 1740 + 1741 + [[package]] 1742 + name = "want" 1743 + version = "0.3.1" 1744 + source = "registry+https://github.com/rust-lang/crates.io-index" 1745 + checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" 1746 + dependencies = [ 1747 + "try-lock", 1748 + ] 1749 + 1750 + [[package]] 1751 + name = "wasi" 1752 + version = "0.11.0+wasi-snapshot-preview1" 1753 + source = "registry+https://github.com/rust-lang/crates.io-index" 1754 + checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 1755 + 1756 + [[package]] 1757 + name = "wasi" 1758 + version = "0.14.2+wasi-0.2.4" 1759 + source = "registry+https://github.com/rust-lang/crates.io-index" 1760 + checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" 1761 + dependencies = [ 1762 + "wit-bindgen-rt", 1763 + ] 1764 + 1765 + [[package]] 1766 + name = "wasm-bindgen" 1767 + version = "0.2.100" 1768 + source = "registry+https://github.com/rust-lang/crates.io-index" 1769 + checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" 1770 + dependencies = [ 1771 + "cfg-if", 1772 + "once_cell", 1773 + "rustversion", 1774 + "wasm-bindgen-macro", 1775 + ] 1776 + 1777 + [[package]] 1778 + name = "wasm-bindgen-backend" 1779 + version = "0.2.100" 1780 + source = "registry+https://github.com/rust-lang/crates.io-index" 1781 + checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" 1782 + dependencies = [ 1783 + "bumpalo", 1784 + "log", 1785 + "proc-macro2", 1786 + "quote", 1787 + "syn", 1788 + "wasm-bindgen-shared", 1789 + ] 1790 + 1791 + [[package]] 1792 + name = "wasm-bindgen-futures" 1793 + version = "0.4.50" 1794 + source = "registry+https://github.com/rust-lang/crates.io-index" 1795 + checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" 1796 + dependencies = [ 1797 + "cfg-if", 1798 + "js-sys", 1799 + "once_cell", 1800 + "wasm-bindgen", 1801 + "web-sys", 1802 + ] 1803 + 1804 + [[package]] 1805 + name = "wasm-bindgen-macro" 1806 + version = "0.2.100" 1807 + source = "registry+https://github.com/rust-lang/crates.io-index" 1808 + checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" 1809 + dependencies = [ 1810 + "quote", 1811 + "wasm-bindgen-macro-support", 1812 + ] 1813 + 1814 + [[package]] 1815 + name = "wasm-bindgen-macro-support" 1816 + version = "0.2.100" 1817 + source = "registry+https://github.com/rust-lang/crates.io-index" 1818 + checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" 1819 + dependencies = [ 1820 + "proc-macro2", 1821 + "quote", 1822 + "syn", 1823 + "wasm-bindgen-backend", 1824 + "wasm-bindgen-shared", 1825 + ] 1826 + 1827 + [[package]] 1828 + name = "wasm-bindgen-shared" 1829 + version = "0.2.100" 1830 + source = "registry+https://github.com/rust-lang/crates.io-index" 1831 + checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" 1832 + dependencies = [ 1833 + "unicode-ident", 1834 + ] 1835 + 1836 + [[package]] 1837 + name = "web-sys" 1838 + version = "0.3.77" 1839 + source = "registry+https://github.com/rust-lang/crates.io-index" 1840 + checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" 1841 + dependencies = [ 1842 + "js-sys", 1843 + "wasm-bindgen", 1844 + ] 1845 + 1846 + [[package]] 1847 + name = "winapi" 1848 + version = "0.3.9" 1849 + source = "registry+https://github.com/rust-lang/crates.io-index" 1850 + checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 1851 + dependencies = [ 1852 + "winapi-i686-pc-windows-gnu", 1853 + "winapi-x86_64-pc-windows-gnu", 1854 + ] 1855 + 1856 + [[package]] 1857 + name = "winapi-i686-pc-windows-gnu" 1858 + version = "0.4.0" 1859 + source = "registry+https://github.com/rust-lang/crates.io-index" 1860 + checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 1861 + 1862 + [[package]] 1863 + name = "winapi-x86_64-pc-windows-gnu" 1864 + version = "0.4.0" 1865 + source = "registry+https://github.com/rust-lang/crates.io-index" 1866 + checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 1867 + 1868 + [[package]] 1869 + name = "windows-core" 1870 + version = "0.61.0" 1871 + source = "registry+https://github.com/rust-lang/crates.io-index" 1872 + checksum = "4763c1de310c86d75a878046489e2e5ba02c649d185f21c67d4cf8a56d098980" 1873 + dependencies = [ 1874 + "windows-implement", 1875 + "windows-interface", 1876 + "windows-link", 1877 + "windows-result", 1878 + "windows-strings 0.4.0", 1879 + ] 1880 + 1881 + [[package]] 1882 + name = "windows-implement" 1883 + version = "0.60.0" 1884 + source = "registry+https://github.com/rust-lang/crates.io-index" 1885 + checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" 1886 + dependencies = [ 1887 + "proc-macro2", 1888 + "quote", 1889 + "syn", 1890 + ] 1891 + 1892 + [[package]] 1893 + name = "windows-interface" 1894 + version = "0.59.1" 1895 + source = "registry+https://github.com/rust-lang/crates.io-index" 1896 + checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" 1897 + dependencies = [ 1898 + "proc-macro2", 1899 + "quote", 1900 + "syn", 1901 + ] 1902 + 1903 + [[package]] 1904 + name = "windows-link" 1905 + version = "0.1.1" 1906 + source = "registry+https://github.com/rust-lang/crates.io-index" 1907 + checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" 1908 + 1909 + [[package]] 1910 + name = "windows-registry" 1911 + version = "0.4.0" 1912 + source = "registry+https://github.com/rust-lang/crates.io-index" 1913 + checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" 1914 + dependencies = [ 1915 + "windows-result", 1916 + "windows-strings 0.3.1", 1917 + "windows-targets 0.53.0", 1918 + ] 1919 + 1920 + [[package]] 1921 + name = "windows-result" 1922 + version = "0.3.2" 1923 + source = "registry+https://github.com/rust-lang/crates.io-index" 1924 + checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252" 1925 + dependencies = [ 1926 + "windows-link", 1927 + ] 1928 + 1929 + [[package]] 1930 + name = "windows-strings" 1931 + version = "0.3.1" 1932 + source = "registry+https://github.com/rust-lang/crates.io-index" 1933 + checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" 1934 + dependencies = [ 1935 + "windows-link", 1936 + ] 1937 + 1938 + [[package]] 1939 + name = "windows-strings" 1940 + version = "0.4.0" 1941 + source = "registry+https://github.com/rust-lang/crates.io-index" 1942 + checksum = "7a2ba9642430ee452d5a7aa78d72907ebe8cfda358e8cb7918a2050581322f97" 1943 + dependencies = [ 1944 + "windows-link", 1945 + ] 1946 + 1947 + [[package]] 1948 + name = "windows-sys" 1949 + version = "0.52.0" 1950 + source = "registry+https://github.com/rust-lang/crates.io-index" 1951 + checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 1952 + dependencies = [ 1953 + "windows-targets 0.52.6", 1954 + ] 1955 + 1956 + [[package]] 1957 + name = "windows-sys" 1958 + version = "0.59.0" 1959 + source = "registry+https://github.com/rust-lang/crates.io-index" 1960 + checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" 1961 + dependencies = [ 1962 + "windows-targets 0.52.6", 1963 + ] 1964 + 1965 + [[package]] 1966 + name = "windows-targets" 1967 + version = "0.52.6" 1968 + source = "registry+https://github.com/rust-lang/crates.io-index" 1969 + checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 1970 + dependencies = [ 1971 + "windows_aarch64_gnullvm 0.52.6", 1972 + "windows_aarch64_msvc 0.52.6", 1973 + "windows_i686_gnu 0.52.6", 1974 + "windows_i686_gnullvm 0.52.6", 1975 + "windows_i686_msvc 0.52.6", 1976 + "windows_x86_64_gnu 0.52.6", 1977 + "windows_x86_64_gnullvm 0.52.6", 1978 + "windows_x86_64_msvc 0.52.6", 1979 + ] 1980 + 1981 + [[package]] 1982 + name = "windows-targets" 1983 + version = "0.53.0" 1984 + source = "registry+https://github.com/rust-lang/crates.io-index" 1985 + checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" 1986 + dependencies = [ 1987 + "windows_aarch64_gnullvm 0.53.0", 1988 + "windows_aarch64_msvc 0.53.0", 1989 + "windows_i686_gnu 0.53.0", 1990 + "windows_i686_gnullvm 0.53.0", 1991 + "windows_i686_msvc 0.53.0", 1992 + "windows_x86_64_gnu 0.53.0", 1993 + "windows_x86_64_gnullvm 0.53.0", 1994 + "windows_x86_64_msvc 0.53.0", 1995 + ] 1996 + 1997 + [[package]] 1998 + name = "windows_aarch64_gnullvm" 1999 + version = "0.52.6" 2000 + source = "registry+https://github.com/rust-lang/crates.io-index" 2001 + checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 2002 + 2003 + [[package]] 2004 + name = "windows_aarch64_gnullvm" 2005 + version = "0.53.0" 2006 + source = "registry+https://github.com/rust-lang/crates.io-index" 2007 + checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" 2008 + 2009 + [[package]] 2010 + name = "windows_aarch64_msvc" 2011 + version = "0.52.6" 2012 + source = "registry+https://github.com/rust-lang/crates.io-index" 2013 + checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 2014 + 2015 + [[package]] 2016 + name = "windows_aarch64_msvc" 2017 + version = "0.53.0" 2018 + source = "registry+https://github.com/rust-lang/crates.io-index" 2019 + checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" 2020 + 2021 + [[package]] 2022 + name = "windows_i686_gnu" 2023 + version = "0.52.6" 2024 + source = "registry+https://github.com/rust-lang/crates.io-index" 2025 + checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 2026 + 2027 + [[package]] 2028 + name = "windows_i686_gnu" 2029 + version = "0.53.0" 2030 + source = "registry+https://github.com/rust-lang/crates.io-index" 2031 + checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" 2032 + 2033 + [[package]] 2034 + name = "windows_i686_gnullvm" 2035 + version = "0.52.6" 2036 + source = "registry+https://github.com/rust-lang/crates.io-index" 2037 + checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 2038 + 2039 + [[package]] 2040 + name = "windows_i686_gnullvm" 2041 + version = "0.53.0" 2042 + source = "registry+https://github.com/rust-lang/crates.io-index" 2043 + checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" 2044 + 2045 + [[package]] 2046 + name = "windows_i686_msvc" 2047 + version = "0.52.6" 2048 + source = "registry+https://github.com/rust-lang/crates.io-index" 2049 + checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 2050 + 2051 + [[package]] 2052 + name = "windows_i686_msvc" 2053 + version = "0.53.0" 2054 + source = "registry+https://github.com/rust-lang/crates.io-index" 2055 + checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" 2056 + 2057 + [[package]] 2058 + name = "windows_x86_64_gnu" 2059 + version = "0.52.6" 2060 + source = "registry+https://github.com/rust-lang/crates.io-index" 2061 + checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 2062 + 2063 + [[package]] 2064 + name = "windows_x86_64_gnu" 2065 + version = "0.53.0" 2066 + source = "registry+https://github.com/rust-lang/crates.io-index" 2067 + checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" 2068 + 2069 + [[package]] 2070 + name = "windows_x86_64_gnullvm" 2071 + version = "0.52.6" 2072 + source = "registry+https://github.com/rust-lang/crates.io-index" 2073 + checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 2074 + 2075 + [[package]] 2076 + name = "windows_x86_64_gnullvm" 2077 + version = "0.53.0" 2078 + source = "registry+https://github.com/rust-lang/crates.io-index" 2079 + checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" 2080 + 2081 + [[package]] 2082 + name = "windows_x86_64_msvc" 2083 + version = "0.52.6" 2084 + source = "registry+https://github.com/rust-lang/crates.io-index" 2085 + checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 2086 + 2087 + [[package]] 2088 + name = "windows_x86_64_msvc" 2089 + version = "0.53.0" 2090 + source = "registry+https://github.com/rust-lang/crates.io-index" 2091 + checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" 2092 + 2093 + [[package]] 2094 + name = "wit-bindgen-rt" 2095 + version = "0.39.0" 2096 + source = "registry+https://github.com/rust-lang/crates.io-index" 2097 + checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" 2098 + dependencies = [ 2099 + "bitflags", 2100 + ] 2101 + 2102 + [[package]] 2103 + name = "write16" 2104 + version = "1.0.0" 2105 + source = "registry+https://github.com/rust-lang/crates.io-index" 2106 + checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" 2107 + 2108 + [[package]] 2109 + name = "writeable" 2110 + version = "0.5.5" 2111 + source = "registry+https://github.com/rust-lang/crates.io-index" 2112 + checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" 2113 + 2114 + [[package]] 2115 + name = "yoke" 2116 + version = "0.7.5" 2117 + source = "registry+https://github.com/rust-lang/crates.io-index" 2118 + checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" 2119 + dependencies = [ 2120 + "serde", 2121 + "stable_deref_trait", 2122 + "yoke-derive", 2123 + "zerofrom", 2124 + ] 2125 + 2126 + [[package]] 2127 + name = "yoke-derive" 2128 + version = "0.7.5" 2129 + source = "registry+https://github.com/rust-lang/crates.io-index" 2130 + checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" 2131 + dependencies = [ 2132 + "proc-macro2", 2133 + "quote", 2134 + "syn", 2135 + "synstructure", 2136 + ] 2137 + 2138 + [[package]] 2139 + name = "zerofrom" 2140 + version = "0.1.6" 2141 + source = "registry+https://github.com/rust-lang/crates.io-index" 2142 + checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" 2143 + dependencies = [ 2144 + "zerofrom-derive", 2145 + ] 2146 + 2147 + [[package]] 2148 + name = "zerofrom-derive" 2149 + version = "0.1.6" 2150 + source = "registry+https://github.com/rust-lang/crates.io-index" 2151 + checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" 2152 + dependencies = [ 2153 + "proc-macro2", 2154 + "quote", 2155 + "syn", 2156 + "synstructure", 2157 + ] 2158 + 2159 + [[package]] 2160 + name = "zeroize" 2161 + version = "1.8.1" 2162 + source = "registry+https://github.com/rust-lang/crates.io-index" 2163 + checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" 2164 + 2165 + [[package]] 2166 + name = "zerovec" 2167 + version = "0.10.4" 2168 + source = "registry+https://github.com/rust-lang/crates.io-index" 2169 + checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" 2170 + dependencies = [ 2171 + "yoke", 2172 + "zerofrom", 2173 + "zerovec-derive", 2174 + ] 2175 + 2176 + [[package]] 2177 + name = "zerovec-derive" 2178 + version = "0.10.3" 2179 + source = "registry+https://github.com/rust-lang/crates.io-index" 2180 + checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" 2181 + dependencies = [ 2182 + "proc-macro2", 2183 + "quote", 2184 + "syn", 2185 + ]
+19
Cargo.toml
··· 1 + [package] 2 + name = "sattelite_observers" 3 + version = "0.1.0" 4 + edition = "2024" 5 + 6 + [dependencies] 7 + chrono = "0.4.40" 8 + ratatui = "0.29.0" 9 + reqwest = { version = "0.12.15", features = ["json"] } 10 + serde = { version = "1.0.219", features = ["derive"] } 11 + sgp4 = "2.2.0" 12 + tokio = { version = "1.44.2", features = ["full"] } 13 + 14 + tracing = {version = "0.1.41", optional = true} 15 + tracing-error = {version="0.2.1",optional = true} 16 + tracing-subscriber = {version="0.3.19",optional=true} 17 + 18 + [features] 19 + logging = ["dep:tracing","dep:tracing-error","tracing-subscriber"]
+25
README.md
··· 1 + # Satellite observatory 2 + 3 + Inspired by my previous project [iss_locator.rs](https://tangled.sh/@technoduck.me/iss_locator.rs), and the indomitable human spirit, 4 + its an interactive program displaying the current location of the ISS. 5 + 6 + 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). 7 + 8 + 9 + ## Usage 10 + 11 + Can either be compiled normally, or with a `logging` feature, to enable tracing everything into log.log file (horrible alas it works). 12 + 13 + ## Methods 14 + 15 + Location of the ISS is obtained from [celestrak](https://celestrak.org), where the Two Line Element for the ISS's orbit is obtained. 16 + 17 + SGP4 algorithms + Earth Rotation angle are used to calculate the location and velocity at any specific point in time. 18 + 19 + 20 + ## Future? 21 + 22 + 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. 23 + 24 + 25 +
+88
src/app.rs
··· 1 + use chrono::{DateTime, Utc}; 2 + use crate::location::FLocation; 3 + use ratatui::{style::Color, text::Line, widgets::{ListItem, ListState}}; 4 + 5 + #[derive(Clone,Debug)] 6 + pub enum CurrentScreen { 7 + Map, 8 + CityChoice, 9 + Exiting 10 + } 11 + 12 + 13 + #[derive(Debug,Clone,PartialEq)] 14 + pub struct City { 15 + pub name: String, 16 + pub long: f32, 17 + pub lat: f32, 18 + } 19 + 20 + impl From<&City> for ListItem<'_> { 21 + fn from(value: &City) -> Self { 22 + let line = Line::styled( 23 + format!("{} : {} W/E , {} N/S",value.name,value.long,value.lat), 24 + Color::Gray); 25 + ListItem::new(line) 26 + } 27 + 28 + } 29 + 30 + /// uuuhhh future feature. 31 + /// checking if the currently chosen city is within the ISS's visibility (https://tangled.sh/@technoduck.me/iss_locator.rs) 32 + pub const CITIES:[(&str,f32,f32);9] = [ 33 + ("Montreal",-72.2,45.5), 34 + ("Tokyo",139.766,35.66), 35 + ("Delhi",77.216,28.6), 36 + ("Shanghai",121.45,31.22), 37 + ("São Paulo",-46.65,-23.55), 38 + ("Mexico City",-99.12,19.45), 39 + ("Cairo",31.233,30.03), 40 + ("New York",-74.0,40.7), 41 + ("London",0.03,51.55) 42 + ]; 43 + 44 + impl From<&(&str,f32,f32)> for City { 45 + fn from(value: &(&str,f32,f32)) -> Self { 46 + City { name: value.0.to_string(), long: value.1, lat: value.2 } 47 + } 48 + } 49 + 50 + #[derive(Clone,Debug)] 51 + pub struct CityList { 52 + pub cities: Vec<City>, 53 + pub state: ListState 54 + } 55 + 56 + 57 + 58 + 59 + #[derive(Clone,Debug)] 60 + pub struct App { 61 + pub current_screen: CurrentScreen, 62 + pub cities: CityList, 63 + pub iss_location: Option<FLocation>, 64 + pub getting_location: bool, 65 + pub iss_constant: Option<sgp4::Constants>, 66 + pub iss_constant_epoch: Option<DateTime<Utc>> 67 + } 68 + 69 + 70 + impl App { 71 + pub fn new() -> App { 72 + 73 + let cities_vec:Vec<City> = CITIES.iter() 74 + .map(|f| City::from(f)) 75 + .collect(); 76 + let cities:CityList = CityList { cities: cities_vec, state: ListState::default() }; 77 + 78 + App { 79 + current_screen:CurrentScreen::Map, 80 + cities, 81 + iss_location: None, 82 + getting_location: false, 83 + iss_constant: None, 84 + iss_constant_epoch: None 85 + } 86 + } 87 + 88 + }
+72
src/location.rs
··· 1 + use std::f64::consts::PI; 2 + 3 + use chrono::{DateTime,Utc}; 4 + use serde::{Deserialize,Serialize}; 5 + 6 + 7 + pub fn earth_rotation_angle(t_u:f64) -> f64 { 8 + //returns radians 9 + 2.0*PI*(0.7790572732640 + 1.00273781191135448*t_u) % std::f64::consts::TAU 10 + } 11 + 12 + 13 + //to be deleted dont think i need it much longer? 14 + pub async fn get_celerak_data() -> (Option<sgp4::Constants>,Option<DateTime<Utc>>) { 15 + let resp = reqwest::get("https://celestrak.org/NORAD/elements/gp.php?GROUP=stations&FORMAT=json").await.unwrap(); 16 + 17 + let element_vec:Vec<sgp4::Elements> = resp.json().await.unwrap(); 18 + 19 + 20 + let epoch = &element_vec[0].datetime.and_utc(); 21 + 22 + let iss_constant = sgp4::Constants::from_elements(&element_vec[0]).unwrap(); 23 + 24 + (Some(iss_constant),Some(*epoch)) 25 + 26 + } 27 + 28 + 29 + // i should be using the geoid crate but this is good enough for now 30 + pub fn polar_loc_transformer(loc: [f64;3]) -> [f32;2] { 31 + let theta = -((loc[2]/ (loc[0].powi(2) + loc[1].powi(2) + loc[2].powi(2)).powf(0.5)).acos() - PI/2.0); 32 + let phi = loc[1].signum() * (loc[0]/(loc[0].powi(2) + loc[1].powi(2)).powf(0.5)).acos(); 33 + 34 + [(phi*180.0/PI) as f32, (theta*180.0/PI) as f32] 35 + 36 + 37 + } 38 + 39 + 40 + 41 + #[derive(Debug,Clone,PartialEq,Deserialize,Serialize)] 42 + pub struct Location { 43 + pub latitude: String, 44 + pub longitude: String 45 + } 46 + 47 + #[derive(Debug,Clone,Deserialize,Serialize)] 48 + pub struct FLocation { 49 + pub latitude: f32, 50 + pub longitude: f32 51 + } 52 + 53 + 54 + 55 + 56 + impl From<Location> for FLocation { 57 + fn from(value: Location) -> Self { 58 + FLocation { 59 + longitude: value.longitude.parse().unwrap(), 60 + latitude: value.latitude.parse().unwrap() 61 + } 62 + } 63 + 64 + } 65 + 66 + #[derive(Debug,Clone,PartialEq,Deserialize,Serialize)] 67 + pub struct LocationResponse { 68 + pub iss_position: Location, 69 + message: String, 70 + timestamp: i64 71 + } 72 +
+38
src/logging.rs
··· 1 + 2 + use std::io::Error; 3 + 4 + use tracing_error::ErrorLayer; 5 + use tracing_subscriber::{self, layer::SubscriberExt, util::SubscriberInitExt}; 6 + 7 + pub fn initialize_logging() -> Result<(),Error> { 8 + let log_file = std::fs::File::create("log.log")?; 9 + let file_subscriber = tracing_subscriber::fmt::layer() 10 + .with_file(true) 11 + .with_line_number(true) 12 + .with_writer(log_file) 13 + .with_target(false) 14 + .with_ansi(false); 15 + tracing_subscriber::registry().with(file_subscriber).with(ErrorLayer::default()).init(); 16 + Ok(()) 17 + } 18 + 19 + #[macro_export] 20 + macro_rules! trace_dbg { 21 + (target: $target:expr, level: $level:expr, $ex:expr) => {{ 22 + match $ex { 23 + value => { 24 + tracing::event!(target: $target, $level, ?value, stringify!($ex)); 25 + value 26 + } 27 + } 28 + }}; 29 + (level: $level:expr, $ex:expr) => { 30 + trace_dbg!(target: module_path!(), level: $level, $ex) 31 + }; 32 + (target: $target:expr, $ex:expr) => { 33 + trace_dbg!(target: $target, level: tracing::Level::DEBUG, $ex) 34 + }; 35 + ($ex:expr) => { 36 + trace_dbg!(level: tracing::Level::DEBUG, $ex) 37 + }; 38 + }
+184
src/main.rs
··· 1 + use chrono::Utc; 2 + use ratatui::crossterm::event::{self, poll, EnableMouseCapture, Event, KeyCode}; 3 + use ratatui::crossterm::execute; 4 + use ratatui::crossterm::terminal::{enable_raw_mode, EnterAlternateScreen}; 5 + use ratatui::crossterm::event::DisableMouseCapture; 6 + use ratatui::crossterm::terminal::{disable_raw_mode, LeaveAlternateScreen}; 7 + use ratatui::prelude::{Backend, CrosstermBackend}; 8 + use ratatui::Terminal; 9 + use sgp4::{julian_years_since_j2000, MinutesSinceEpoch}; 10 + use std::f32::consts::PI; 11 + use std::io::{self, Result}; 12 + use std::sync::{Arc, Mutex}; 13 + use std::time::Duration; 14 + 15 + mod app; 16 + mod ui; 17 + mod location; 18 + 19 + #[cfg(feature = "logging")] 20 + mod logging; 21 + 22 + use app::*; 23 + 24 + #[tokio::main] 25 + async fn main() -> Result<()> { 26 + #[cfg(feature = "logging")] 27 + let _ = logging::initialize_logging(); 28 + enable_raw_mode()?; 29 + let mut stderr = io::stderr(); // This is a special case. Normally using stdout is fine 30 + execute!(stderr, EnterAlternateScreen, EnableMouseCapture)?; 31 + let backend = CrosstermBackend::new(stderr); 32 + let mut terminal = Terminal::new(backend)?; 33 + 34 + // create app and run it 35 + 36 + let app = Arc::new(Mutex::new(App::new())); 37 + let location_shared_app = Arc::clone(&app); 38 + let location_shared_app2 = Arc::clone(&app); 39 + let mut runtime_shared_app = Arc::clone(&app); 40 + 41 + 42 + let get_constant = tokio::task::spawn(async move { 43 + location_shared_app.lock().unwrap().getting_location = true; 44 + let constant = location::get_celerak_data().await; 45 + if let (Some(cons),Some(epoch)) = constant { 46 + location_shared_app.lock().unwrap().iss_constant = Some(cons); 47 + location_shared_app.lock().unwrap().iss_constant_epoch = Some(epoch); 48 + } 49 + location_shared_app.lock().unwrap().getting_location = false; 50 + }); 51 + 52 + let _ = get_constant; 53 + 54 + 55 + 56 + let forever = tokio::task::spawn(async move { 57 + let mut interval = tokio::time::interval(Duration::from_secs(2)); 58 + 59 + loop { 60 + interval.tick().await; 61 + if location_shared_app2.lock().unwrap().iss_constant.is_some() { 62 + let now = Utc::now(); 63 + let d_since_j2000 = julian_years_since_j2000(&now.naive_utc()) * 365.25; 64 + let rad_diff_earth_rotation = location::earth_rotation_angle(d_since_j2000); 65 + let time_diff = now - location_shared_app2.lock().unwrap().iss_constant_epoch.unwrap(); 66 + let prediction = location_shared_app2.lock().unwrap().iss_constant.as_ref().unwrap() 67 + .propagate(MinutesSinceEpoch(time_diff.num_seconds() as f64 / 60.0)).unwrap(); 68 + 69 + let pred_spherical = location::polar_loc_transformer(prediction.position); 70 + 71 + let long_value = if pred_spherical[0]-(rad_diff_earth_rotation as f32)*180.0/PI < 180.0 72 + { 73 + pred_spherical[0]-(rad_diff_earth_rotation as f32)*180.0/PI + 360.0 74 + } else { 75 + pred_spherical[0]-(rad_diff_earth_rotation as f32)*180.0/PI 76 + }; 77 + location_shared_app2.lock().unwrap().iss_location = Some(location::FLocation { 78 + 79 + latitude: pred_spherical[1], 80 + longitude: long_value 81 + }); 82 + 83 + } 84 + } ; 85 + }); 86 + 87 + 88 + 89 + let _ = forever; 90 + 91 + let _res = run_app(&mut terminal, &mut runtime_shared_app).await; 92 + // restore terminal 93 + disable_raw_mode()?; 94 + execute!( 95 + terminal.backend_mut(), 96 + LeaveAlternateScreen, 97 + DisableMouseCapture 98 + )?; 99 + terminal.show_cursor()?; 100 + 101 + 102 + Ok(()) 103 + } 104 + 105 + 106 + async fn run_app<B:Backend> (terminal: &mut Terminal<B>, mut app: &mut Arc<Mutex<App>>) -> Result<bool> { 107 + loop { 108 + 109 + 110 + let _ = terminal.draw(|f| ui::ui(f, &mut app)); 111 + 112 + 113 + 114 + if poll(Duration::from_millis(15))? { 115 + 116 + 117 + if let Event::Key(key) = event::read()? { 118 + let app_shared = Arc::new(&app); 119 + let mut app_shared = app_shared.lock().unwrap(); 120 + if key.kind == event::KeyEventKind::Release { 121 + continue; 122 + } 123 + match app_shared.current_screen { 124 + app::CurrentScreen::Map => match key.code { 125 + KeyCode::Char('c') => { 126 + app_shared.current_screen = CurrentScreen::CityChoice; 127 + } 128 + KeyCode::Char('q') => { 129 + app_shared.current_screen = CurrentScreen::Exiting; 130 + } 131 + _ => {} 132 + 133 + } 134 + app::CurrentScreen::Exiting => match key.code { 135 + KeyCode::Char('n') | KeyCode::Esc => { 136 + app_shared.current_screen = CurrentScreen::Map 137 + } 138 + KeyCode::Char('y') | KeyCode::Char('q') => { 139 + return Ok(false) 140 + } 141 + _ => {} 142 + } 143 + 144 + //weird behaviour with the ListState being 1 longer then the list, resulting in 145 + //index overflow for the cities list. do not know why. yes even after rendering 146 + //when the ListState was supposed to update 147 + app::CurrentScreen::CityChoice => match key.code { 148 + KeyCode::Up => { 149 + 150 + if app_shared.cities.state.selected() == Some(0) { 151 + app_shared.cities.state.select(Some(CITIES.len()-1)); 152 + } else { 153 + app_shared.cities.state.scroll_up_by(1); 154 + } 155 + 156 + }, 157 + KeyCode::Down => { 158 + if app_shared.cities.state.selected() == Some(app_shared.cities.cities.len()-1) { 159 + app_shared.cities.state.select(Some(0)); 160 + } else { 161 + 162 + app_shared.cities.state.scroll_down_by(1); 163 + } 164 + } 165 + KeyCode::Enter => app_shared.current_screen = CurrentScreen::Map, 166 + KeyCode::Esc => app_shared.current_screen = CurrentScreen::Map, 167 + KeyCode::Char('q') => app_shared.current_screen = CurrentScreen::Map, 168 + _ => {} 169 + } 170 + 171 + } 172 + } 173 + 174 + 175 + } 176 + } 177 + } 178 + 179 + 180 + 181 + 182 + 183 + 184 +
+236
src/ui.rs
··· 1 + 2 + use std::sync::{Arc, Mutex}; 3 + 4 + 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}; 5 + use ratatui::prelude::Stylize; 6 + 7 + use crate::{App, CurrentScreen}; 8 + 9 + const SELECTED_STYLE: Style = Style::new().bg(SLATE.c800).add_modifier(Modifier::BOLD); 10 + 11 + pub fn ui(frame: &mut Frame, app: &mut Arc<Mutex<App>>) { 12 + let app_shared = Arc::clone(&app); 13 + let mut app_shared = app_shared.lock().unwrap(); 14 + let chunks = Layout::default() 15 + .direction(Direction::Vertical) 16 + .constraints([ 17 + Constraint::Length(3), 18 + Constraint::Min(1), 19 + Constraint::Length(3), 20 + ]) 21 + .split(frame.area()); 22 + 23 + let title_block = Block::default() 24 + .borders(Borders::ALL) 25 + .style(Style::default()); 26 + 27 + let title = Paragraph::new(Text::styled( 28 + "ISS Locator", 29 + Style::default().fg(ratatui::style::Color::Green), 30 + )) 31 + .block(title_block); 32 + 33 + 34 + frame.render_widget(title, chunks[0]); 35 + 36 + // MAP 37 + 38 + let map = Canvas::default() 39 + .block(Block::bordered().title("World Map")) 40 + .marker(ratatui::symbols::Marker::Braille) 41 + .paint(|ctx| { 42 + ctx.draw(&Map { 43 + color: Color::Green, 44 + resolution: MapResolution::High, 45 + }); 46 + 47 + if let Some(loc) = &app_shared.iss_location { 48 + //allegedly the area visible from the ISS but we all know its not, there is a way 49 + //to create a new widget that, depending on input location would give the 50 + //appropriate shape, I however didn't care enough yet to do so. 51 + ctx.draw(&Circle { 52 + color: Color::Blue, 53 + radius: 13.0, 54 + x: loc.longitude.into(), 55 + y: loc.latitude.into() 56 + }); 57 + } 58 + 59 + 60 + for (i,city) in app_shared.cities.cities.iter().enumerate() { 61 + 62 + ctx.draw(&Points { 63 + coords: &[(city.long.into(),city.lat.into())], 64 + color: Color::Red 65 + 66 + }); 67 + 68 + if let Some(j) = app_shared.cities.state.selected(){ 69 + if i == j { 70 + // ctx.draw(&Points { 71 + // coords: &[(city.long.into(),city.lat.into())], 72 + // color: Color::Blue 73 + // }); 74 + 75 + ctx.draw(&Circle { 76 + color: Color::Yellow, 77 + radius: 0.7, 78 + x: city.long.into(), 79 + y: city.lat.into() 80 + }); 81 + 82 + }} 83 + } 84 + 85 + }) 86 + .x_bounds([-180.0, 180.0]) 87 + .y_bounds([-90.0, 90.0]); 88 + 89 + 90 + frame.render_widget(map, chunks[1]); 91 + 92 + 93 + // text on the bottom 94 + // 95 + 96 + let nav_text = vec![ 97 + match app_shared.current_screen { 98 + CurrentScreen::Map => Span::styled("Map", Style::default().fg(Color::Green)), 99 + CurrentScreen::CityChoice => Span::styled("Location Choice", Style::default().fg(Color::Green)), 100 + CurrentScreen::Exiting => Span::styled("Exiting", Style::default().fg(Color::Green)) 101 + }.to_owned(), 102 + 103 + Span::styled(" | ", Style::default().fg(Color::White)), 104 + 105 + Span::styled(format!("Current location: {}",{ 106 + if let Some(i) = app_shared.cities.state.selected() { 107 + &app_shared.cities.cities[i].name 108 + } else { 109 + "Not selected" 110 + } 111 + }), Style::default().fg(Color::Green)), 112 + 113 + 114 + Span::styled(" | ", Style::default().fg(Color::White)), 115 + 116 + Span::styled(format!("iss location: {} {} ",{ 117 + if let Some(i) = &app_shared.iss_location { 118 + i.latitude.clone().to_string() 119 + } else { 120 + "?".to_string() 121 + }}, 122 + { 123 + if let Some(i) = &app_shared.iss_location { 124 + i.longitude.clone().to_string() 125 + } else { 126 + "?".to_string() 127 + } 128 + } 129 + ), Style::default().fg(Color::Green)), 130 + Span::styled(" | ", Style::default().fg(Color::White)), 131 + Span::styled(format!(" {}",{ 132 + if app_shared.iss_constant.is_some() { 133 + "Y" 134 + } else { 135 + "N" 136 + } 137 + }), Style::default().fg(Color::Green)) 138 + ]; 139 + 140 + let mode_footer = Paragraph::new(Line::from(nav_text)) 141 + .block(Block::default().borders(Borders::ALL)); 142 + 143 + 144 + let curr_key_hint = { 145 + match app_shared.current_screen { 146 + CurrentScreen::Map => Span::styled( 147 + "(q) to quit / (c) to change the location", Style::default().fg(Color::Red)), 148 + CurrentScreen::CityChoice => Span::styled( 149 + "(ESC) to cancel / (Enter) to confirm choive", Style::default().fg(Color::Red)), 150 + CurrentScreen::Exiting => Span::styled( 151 + "(y) to quit / (ESC) to cancel" ,Style::default().fg(Color::Red)), 152 + } 153 + }; 154 + 155 + let hint_footer = Paragraph::new(Line::from(curr_key_hint)).block(Block::default().borders(Borders::ALL)); 156 + 157 + 158 + let footer_chunks = Layout::default() 159 + .direction(Direction::Horizontal) 160 + .constraints([Constraint::Percentage(50),Constraint::Percentage(50)]) 161 + .split(chunks[2]); 162 + 163 + frame.render_widget(mode_footer, footer_chunks[0]); 164 + frame.render_widget(hint_footer, footer_chunks[1]); 165 + 166 + 167 + // probably better to rewrite as a match statement 168 + if let CurrentScreen::CityChoice = app_shared.current_screen { 169 + let popup_block = Block::new() 170 + .title(Line::raw("Cities Option").centered()) 171 + .borders(Borders::ALL); 172 + 173 + 174 + let items: Vec<ListItem> = app_shared.cities.cities.iter() 175 + .map(|item| { 176 + ListItem::from(item) 177 + }) 178 + .collect(); 179 + 180 + let list = List::new(items) 181 + .block(popup_block) 182 + .style(SELECTED_STYLE) 183 + .highlight_symbol(">") 184 + .highlight_spacing(ratatui::widgets::HighlightSpacing::Always); 185 + 186 + let area = centered_rect(40, 40, frame.area()); 187 + 188 + frame.render_stateful_widget(list, area,&mut app_shared.cities.state); 189 + 190 + } 191 + 192 + 193 + if let CurrentScreen::Exiting = app_shared.current_screen { 194 + 195 + let exit_popup = Block::new() 196 + .title(Line::raw("Quit?").centered()) 197 + .bg(Color::Gray) 198 + .borders(Borders::ALL); 199 + 200 + let exit_text = Text::styled( 201 + "Would you like to leave?", Style::default().fg(Color::Red)); 202 + 203 + let exit_widget = Paragraph::new(exit_text).centered() 204 + .block(exit_popup); 205 + 206 + 207 + let area = centered_rect(30, 20, frame.area()); 208 + frame.render_widget(exit_widget, area); 209 + } 210 + 211 + } 212 + 213 + 214 + 215 + 216 + fn centered_rect(percent_x: u16, percent_y: u16, r: Rect) -> Rect { 217 + // Cut the given rectangle into three vertical pieces 218 + let popup_layout = Layout::default() 219 + .direction(Direction::Vertical) 220 + .constraints([ 221 + Constraint::Percentage((100 - percent_y) / 2), 222 + Constraint::Percentage(percent_y), 223 + Constraint::Percentage((100 - percent_y) / 2), 224 + ]) 225 + .split(r); 226 + 227 + // Then cut the middle vertical piece into three width-wise pieces 228 + Layout::default() 229 + .direction(Direction::Horizontal) 230 + .constraints([ 231 + Constraint::Percentage((100 - percent_x) / 2), 232 + Constraint::Percentage(percent_x), 233 + Constraint::Percentage((100 - percent_x) / 2), 234 + ]) 235 + .split(popup_layout[1])[1] // Return the middle chunk 236 + }