commit 56d058c2fd96f33b9d26d0f73fdff7f7d491db15 Author: Kai Vogelgesang Date: Sun Apr 16 02:42:41 2023 +0200 Init diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0b745e2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/target +.env \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..1c07ef7 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,1190 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "base64" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bumpalo" +version = "3.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" + +[[package]] +name = "bytes" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" + +[[package]] +name = "cc" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "core-foundation" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" + +[[package]] +name = "dotenv" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" + +[[package]] +name = "encoding_rs" +version = "0.8.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "errno" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a" +dependencies = [ + "errno-dragonfly", + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "errno-dragonfly" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "fastrand" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" +dependencies = [ + "instant", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures-channel" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" +dependencies = [ + "futures-core", +] + +[[package]] +name = "futures-core" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" + +[[package]] +name = "futures-sink" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e" + +[[package]] +name = "futures-task" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" + +[[package]] +name = "futures-util" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" +dependencies = [ + "futures-core", + "futures-task", + "pin-project-lite", + "pin-utils", +] + +[[package]] +name = "h2" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66b91535aa35fea1523ad1b86cb6b53c28e0ae566ba4a460f4457e936cad7c6f" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hermit-abi" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" +dependencies = [ + "libc", +] + +[[package]] +name = "hermit-abi" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" + +[[package]] +name = "http" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" +dependencies = [ + "bytes", + "http", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" + +[[package]] +name = "httpdate" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" + +[[package]] +name = "hyper" +version = "0.14.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab302d72a6f11a3b910431ff93aae7e773078c769f0a3ef15fb9ec692ed147d4" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper-tls" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" +dependencies = [ + "bytes", + "hyper", + "native-tls", + "tokio", + "tokio-native-tls", +] + +[[package]] +name = "idna" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown", +] + +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "io-lifetimes" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c66c74d2ae7e79a5a8f7ac924adbe38ee42a859c6539ad869eb51f0b52dc220" +dependencies = [ + "hermit-abi 0.3.1", + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "ipnet" +version = "2.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12b6ee2129af8d4fb011108c73d99a1b83a85977f23b82460c0ae2e25bb4b57f" + +[[package]] +name = "itoa" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" + +[[package]] +name = "js-sys" +version = "0.3.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +version = "0.2.141" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3304a64d199bb964be99741b7a14d26972741915b3649639149b2479bb46f4b5" + +[[package]] +name = "linux-raw-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d59d8c75012853d2e872fb56bc8a2e53718e2cafe1a4c823143141c6d90c322f" + +[[package]] +name = "lock_api" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "mio" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9" +dependencies = [ + "libc", + "log", + "wasi", + "windows-sys 0.45.0", +] + +[[package]] +name = "native-tls" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" +dependencies = [ + "lazy_static", + "libc", + "log", + "openssl", + "openssl-probe", + "openssl-sys", + "schannel", + "security-framework", + "security-framework-sys", + "tempfile", +] + +[[package]] +name = "num_cpus" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" +dependencies = [ + "hermit-abi 0.2.6", + "libc", +] + +[[package]] +name = "once_cell" +version = "1.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" + +[[package]] +name = "openssl" +version = "0.10.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e30d8bc91859781f0a943411186324d580f2bbeb71b452fe91ae344806af3f1" +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 2.0.15", +] + +[[package]] +name = "openssl-probe" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" + +[[package]] +name = "openssl-sys" +version = "0.9.85" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d3d193fb1488ad46ffe3aaabc912cc931d02ee8518fe2959aea8ef52718b0c0" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9069cbb9f99e3a5083476ccb29ceb1de18b9118cafa53e90c9551235de2b9521" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.2.16", + "smallvec", + "windows-sys 0.45.0", +] + +[[package]] +name = "percent-encoding" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" + +[[package]] +name = "pin-project-lite" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" + +[[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.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" + +[[package]] +name = "proc-macro2" +version = "1.0.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "redox_syscall" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +dependencies = [ + "bitflags", +] + +[[package]] +name = "redox_syscall" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +dependencies = [ + "bitflags", +] + +[[package]] +name = "reqwest" +version = "0.11.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b71749df584b7f4cac2c426c127a7c785a5106cc98f7a8feb044115f0fa254" +dependencies = [ + "base64", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "hyper", + "hyper-tls", + "ipnet", + "js-sys", + "log", + "mime", + "native-tls", + "once_cell", + "percent-encoding", + "pin-project-lite", + "serde", + "serde_json", + "serde_urlencoded", + "tokio", + "tokio-native-tls", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "winreg", +] + +[[package]] +name = "rustix" +version = "0.37.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85597d61f83914ddeba6a47b3b8ffe7365107221c2e557ed94426489fefb5f77" +dependencies = [ + "bitflags", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys", + "windows-sys 0.48.0", +] + +[[package]] +name = "ryu" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" + +[[package]] +name = "satellit-ansage" +version = "0.1.0" +dependencies = [ + "dotenv", + "reqwest", + "serde", + "serde_json", + "tokio", +] + +[[package]] +name = "schannel" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "713cfb06c7059f3588fb8044c0fad1d09e3c01d225e25b9220dbfdcf16dbb1b3" +dependencies = [ + "windows-sys 0.42.0", +] + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "security-framework" +version = "2.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a332be01508d814fed64bf28f798a146d73792121129962fdf335bb3c49a4254" +dependencies = [ + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31c9bb296072e961fcbd8853511dd39c2d8be2deb1e17c6860b1d30732b323b4" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "serde" +version = "1.0.160" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb2f3770c8bce3bcda7e149193a069a0f4365bda1fa5cd88e03bca26afc1216c" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.160" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291a097c63d8497e00160b166a967a4a79c64f3facdd01cbd7502231688d77df" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.15", +] + +[[package]] +name = "serde_json" +version = "1.0.96" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" +dependencies = [ + "itoa", + "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 = "signal-hook-registry" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +dependencies = [ + "libc", +] + +[[package]] +name = "slab" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" + +[[package]] +name = "socket2" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a34fcf3e8b60f57e6a14301a2e916d323af98b0ea63c599441eec8558660c822" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tempfile" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9fbec84f381d5795b08656e4912bec604d162bff9291d6189a78f4c8ab87998" +dependencies = [ + "cfg-if", + "fastrand", + "redox_syscall 0.3.5", + "rustix", + "windows-sys 0.45.0", +] + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0de47a4eecbe11f498978a9b29d792f0d2692d1dd003650c24c76510e3bc001" +dependencies = [ + "autocfg", + "bytes", + "libc", + "mio", + "num_cpus", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.45.0", +] + +[[package]] +name = "tokio-macros" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61a573bdc87985e9d6ddeed1b3d864e8a302c847e40d647746df2f1de209d1ce" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.15", +] + +[[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-util" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5427d89453009325de0d8f342c9490009f76e999cb7672d77e46267448f7e6b2" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", + "tracing", +] + +[[package]] +name = "tower-service" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" + +[[package]] +name = "tracing" +version = "0.1.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +dependencies = [ + "cfg-if", + "pin-project-lite", + "tracing-core", +] + +[[package]] +name = "tracing-core" +version = "0.1.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" +dependencies = [ + "once_cell", +] + +[[package]] +name = "try-lock" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" + +[[package]] +name = "unicode-bidi" +version = "0.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" + +[[package]] +name = "unicode-ident" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" + +[[package]] +name = "unicode-normalization" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "url" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[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.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +dependencies = [ + "log", + "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 = "wasm-bindgen" +version = "0.2.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 1.0.109", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f219e0d211ba40266969f6dbdd90636da12f75bee4fc9d6c23d1260dadb51454" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" + +[[package]] +name = "web-sys" +version = "0.3.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e33b99f4b23ba3eec1a53ac264e35a755f00e966e0065077d6027c0f575b0b97" +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-sys" +version = "0.42.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.0", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5" +dependencies = [ + "windows_aarch64_gnullvm 0.48.0", + "windows_aarch64_msvc 0.48.0", + "windows_i686_gnu 0.48.0", + "windows_i686_msvc 0.48.0", + "windows_x86_64_gnu 0.48.0", + "windows_x86_64_gnullvm 0.48.0", + "windows_x86_64_msvc 0.48.0", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" + +[[package]] +name = "winreg" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" +dependencies = [ + "winapi", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..fdab461 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "satellit-ansage" +version = "0.1.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +dotenv = "0.15.0" +reqwest = { version = "0.11.16", features = ["json"] } +serde = { version = "1.0.160", features = ["derive"] } +serde_json = "1.0.96" +tokio = { version = "1.27.0", features = ["full"] } diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..d4ad9fc --- /dev/null +++ b/src/main.rs @@ -0,0 +1,19 @@ +use std::{env, error::Error}; + +use crate::n2yo::N2YO; + +mod n2yo; + +#[tokio::main] +async fn main() -> Result<(), Box> { + dotenv::dotenv().ok(); + let api_key = env::var("N2YO_API_KEY")?; + + let n2yo = N2YO::new(api_key); + + let tle = n2yo.tle(25544).await?; + + println!("{}", tle.tle); + + Ok(()) +} diff --git a/src/n2yo/mod.rs b/src/n2yo/mod.rs new file mode 100644 index 0000000..7f0c549 --- /dev/null +++ b/src/n2yo/mod.rs @@ -0,0 +1,199 @@ +use reqwest::Client; +use serde::de::DeserializeOwned; + +use self::proto::{Above, Positions, RadioPasses, VisualPasses, TLE}; + +mod proto; + +const BASE_URL: &str = "https://api.n2yo.com/rest/v1/satellite"; + +pub struct N2YO { + api_key: String, + client: Client, +} + +type Result = std::result::Result>; + +impl N2YO { + pub fn new(api_key: String) -> Self { + Self { + api_key, + client: Client::new(), + } + } + + async fn query(&self, s: &str) -> Result { + let result = self + .client + .get(s) + .query(&[("apiKey", &self.api_key)]) + .send() + .await? + .json() + .await?; + + Ok(result) + } + + /// Get TLE + /// + /// Retrieve the Two Line Elements (TLE) for a satellite identified by NORAD id. + #[allow(dead_code)] + pub async fn tle(&self, id: u64) -> Result { + self.query(&format!("{BASE_URL}/tle/{id}")).await + } + + /// Get satellite positions + /// + /// Retrieve the future positions of any satellite as groundtrack (latitude, longitude) to display + /// orbits on maps. Also return the satellite's azimuth and elevation with respect to the observer + /// location. Each element in the response array is one second of calculation. First element is + /// calculated for current UTC time. + #[allow(dead_code)] + pub async fn positions( + &self, + id: u64, + lat: f64, + lng: f64, + alt: f64, + seconds: u16, + ) -> Result { + self.query(&format!( + "{BASE_URL}/positions/{id}/{lat}/{lng}/{alt}/{seconds}" + )) + .await + } + + /// Get visual passes + /// + /// Get predicted visual passes for any satellite relative to a location on Earth. A "visual pass" + /// is a pass that should be optically visible on the entire (or partial) duration of crossing the + /// sky. For that to happen, the satellite must be above the horizon, illumintaed by Sun (not in + /// Earth shadow), and the sky dark enough to allow visual satellite observation. + + #[allow(dead_code)] + pub async fn visual_passes( + &self, + id: u64, + lat: f64, + lng: f64, + alt: f64, + days: u8, + min_visibility: u64, + ) -> Result { + self.query(&format!( + "{BASE_URL}/positions/{id}/{lat}/{lng}/{alt}/{days}/{min_visibility}" + )) + .await + } + + /// Get radio passes + /// + /// The "radio passes" are similar to "visual passes", the only difference being the requirement + /// for the objects to be optically visible for observers. This function is useful mainly for + /// predicting satellite passes to be used for radio communications. The quality of the pass depends + /// essentially on the highest elevation value during the pass, which is one of the input parameters. + #[allow(dead_code)] + pub async fn radio_passes( + &self, + id: u64, + lat: f64, + lng: f64, + alt: f64, + days: u8, + min_elevation: u64, + ) -> Result { + self.query(&format!( + "{BASE_URL}/positions/{id}/{lat}/{lng}/{alt}/{days}/{min_elevation}" + )) + .await + } + + /// What's up? + /// + /// The "above" function will return all objects within a given search radius above observer's location. + /// The radius (θ), expressed in degrees, is measured relative to the point in the sky directly above + /// an observer (azimuth). This image may offer a better explanation: + /// + /// ![](https://www.n2yo.com/img/above.png) + /// + /// The search radius range is 0 to 90 degrees, nearly 0 meaning to show only satellites passing exactly + /// above the observer location, while 90 degrees to return all satellites above the horizon. Since there + /// are many satellites and debris in the sky at any point in time, the result could be filtered by + /// satellite category (integer). The following categories are currently available at n2yo.com: + /// + /// | Category | id | + /// |----------|---:| + /// |Amateur radio|18| + /// |Beidou Navigation System|35| + /// |Brightest|1| + /// |Celestis|45| + /// |Chinese Space Station|54| + /// |CubeSats|32| + /// |Disaster monitoring|8| + /// |Earth resources|6| + /// |Education|29| + /// |Engineering|28| + /// |Experimental|19| + /// |Flock|48| + /// |Galileo|22| + /// |Geodetic|27| + /// |Geostationary|10| + /// |Global Positioning System (GPS) Constellation|50| + /// |Global Positioning System (GPS) Operational|20| + /// |Globalstar|17| + /// |Glonass Constellation|51| + /// |Glonass Operational|21| + /// |GOES|5| + /// |Gonets|40| + /// |Gorizont|12| + /// |Intelsat|11| + /// |Iridium|15| + /// IRNSS|46| + /// ISS|2| + /// Lemur|49| + /// Military|30| + /// Molniya|14| + /// Navy Navigation Satellite System|24| + /// NOAA|4| + /// O3B Networks|43| + /// OneWeb|53| + /// Orbcomm|16| + /// Parus|38| + /// QZSS|47| + /// Radar Calibration|31| + /// Raduga|13| + /// Russian LEO Navigation|25| + /// Satellite-Based Augmentation System|23| + /// Search & rescue|7| + /// Space & Earth Science|26| + /// Starlink|52| + /// Strela|39| + /// Tracking and Data Relay Satellite System|9| + /// Tselina|44| + /// Tsikada|42| + /// Tsiklon|41| + /// TV|34| + /// Weather|3| + /// Westford Needles|37| + /// XM and Sirius|33| + /// Yaogan|36| + /// + /// Please use this function responsably as there is a lot of CPU needed in order to calculate exact + /// positions for all satellites in the sky. The function will return altitude, latitude and longitude + /// of satellites footprints to be displayed on a map, and some minimal information to identify the object. + #[allow(dead_code)] + pub async fn above( + &self, + lat: f64, + lng: f64, + alt: f64, + search_radius: u8, + category_id: u8, + ) -> Result { + self.query(&format!( + "{BASE_URL}/above/{lat}/{lng}/{alt}/{search_radius}/{category_id}" + )) + .await + } +} diff --git a/src/n2yo/proto.rs b/src/n2yo/proto.rs new file mode 100644 index 0000000..8dfb466 --- /dev/null +++ b/src/n2yo/proto.rs @@ -0,0 +1,472 @@ +#![allow(clippy::upper_case_acronyms)] +#![allow(dead_code)] + +use serde::Deserialize; + +#[derive(Debug, Deserialize)] +pub struct Info { + /// NORAD id used in input + #[serde(rename = "satid")] + pub sat_id: u64, + + /// Satellite name + #[serde(rename = "satname")] + pub sat_name: String, + + /// Count of transactions performed with this API key in last 60 minutes + #[serde(rename = "transactionscount")] + pub transaction_count: u64, +} + +#[derive(Debug, Deserialize)] +pub struct TLE { + pub info: Info, + /// TLE on single line string. Split the line in two by \r\n to get original two lines + pub tle: String, +} + +#[derive(Debug, Deserialize)] +pub struct Positions { + pub info: Info, + pub positions: Vec, +} + +#[derive(Debug, Deserialize)] +pub struct Position { + /// Satellite footprint latitude (decimal degrees format) + #[serde(rename = "satlatitude")] + pub sat_latitude: f64, + + /// Satellite footprint longitude (decimal degrees format) + #[serde(rename = "satlongitude")] + pub sat_longitude: f64, + + #[serde(rename = "sataltitude")] + pub sat_altitude: f64, + + /// Satellite azimuth with respect to observer's location (degrees) + pub azimuth: f64, + + /// Satellite elevation with respect to observer's location (degrees) + pub elevation: f64, + + /// Satellite right ascension (degrees) + pub ra: f64, + + /// Satellite declination (degrees) + pub dec: f64, + + /// Unix time for this position (seconds). You should convert this UTC value to observer's time zone + pub timestamp: u64, +} + +#[derive(Debug, Deserialize)] +pub struct PassInfo { + /// NORAD id used in input + #[serde(rename = "satid")] + pub sat_id: u64, + + /// Satellite name + #[serde(rename = "satname")] + pub sat_name: String, + + /// Count of transactions performed with this API key in last 60 minutes + #[serde(rename = "transactionscount")] + pub transaction_count: u64, + + /// Count of passes returned + #[serde(rename = "passescount")] + pub pass_count: u64, +} + +#[derive(Debug, Deserialize)] +pub enum Compass { + N, + NNE, + NE, + ENE, + E, + ESE, + SE, + SSE, + S, + SSW, + SW, + WSW, + W, + WNW, + NW, + NNW, +} + +#[derive(Debug, Deserialize)] +pub struct VisualPasses { + pub info: PassInfo, + pub passes: Option>, +} + +#[derive(Debug, Deserialize)] +pub struct VisualPass { + // start + /// Satellite azimuth for the start of this pass (relative to the observer, in degrees) + #[serde(rename = "startAz")] + pub start_az: f64, + + /// Satellite azimuth for the start of this pass (relative to the observer). Possible values: N, NE, E, SE, S, SW, W, NW + #[serde(rename = "startAzCompass")] + pub start_az_compass: Compass, + + /// Satellite elevation for the start of this pass (relative to the observer, in degrees) + #[serde(rename = "startEl")] + pub start_el: f64, + + /// Unix time for the start of this pass. You should convert this UTC value to observer's time zone + #[serde(rename = "startUTC")] + pub start_utc: u64, + + // max + /// Satellite azimuth for the max elevation of this pass (relative to the observer, in degrees) + #[serde(rename = "maxAz")] + pub max_az: f64, + + /// Satellite azimuth for the max elevation of this pass (relative to the observer). Possible values: N, NE, E, SE, S, SW, W, NW + #[serde(rename = "maxAzCompass")] + pub max_az_compass: Compass, + + /// Satellite max elevation for this pass (relative to the observer, in degrees) + #[serde(rename = "maxEl")] + pub max_el: f64, + + /// Unix time for the max elevation of this pass. You should convert this UTC value to observer's time zone + #[serde(rename = "maxUTC")] + pub max_utc: u64, + + // end + /// Satellite azimuth for the end of this pass (relative to the observer, in degrees) + #[serde(rename = "endAz")] + pub end_az: f64, + + /// Satellite azimuth for the end of this pass (relative to the observer). Possible values: N, NE, E, SE, S, SW, W, NW + #[serde(rename = "endAzCompass")] + pub end_az_compass: Compass, + + /// Satellite elevation for the end of this pass (relative to the observer, in degrees) + #[serde(rename = "endEl")] + pub end_el: f64, + + /// Unix time for the end of this pass. You should convert this UTC value to observer's time zone + #[serde(rename = "endUTC")] + pub end_utc: u64, + + /// Max visual magnitude of the pass, same scale as star brightness. If magnitude cannot be determined, the value is 100000 + pub mag: f64, + + /// Total visible duration of this pass (in seconds) + pub duration: u64, +} + +#[derive(Debug, Deserialize)] +pub struct RadioPasses { + pub info: PassInfo, + pub passes: Option>, +} + +#[derive(Debug, Deserialize)] +pub struct RadioPass { + // start + /// Satellite azimuth for the start of this pass (relative to the observer, in degrees) + #[serde(rename = "startAz")] + pub start_az: f64, + + /// Satellite azimuth for the start of this pass (relative to the observer). Possible values: N, NE, E, SE, S, SW, W, NW + #[serde(rename = "startAzCompass")] + pub start_az_compass: Compass, + + /// Unix time for the start of this pass. You should convert this UTC value to observer's time zone + #[serde(rename = "startUTC")] + pub start_utc: u64, + + // max + /// Satellite azimuth for the max elevation of this pass (relative to the observer, in degrees) + #[serde(rename = "maxAz")] + pub max_az: f64, + + /// Satellite azimuth for the max elevation of this pass (relative to the observer). Possible values: N, NE, E, SE, S, SW, W, NW + #[serde(rename = "maxAzCompass")] + pub max_az_compass: Compass, + + /// Satellite max elevation for this pass (relative to the observer, in degrees) + #[serde(rename = "maxEl")] + pub max_el: f64, + + /// Unix time for the max elevation of this pass. You should convert this UTC value to observer's time zone + #[serde(rename = "maxUTC")] + pub max_utc: u64, + + // end + /// Satellite azimuth for the end of this pass (relative to the observer, in degrees) + #[serde(rename = "endAz")] + pub end_az: f64, + + /// Satellite azimuth for the end of this pass (relative to the observer). Possible values: N, NE, E, SE, S, SW, W, NW + #[serde(rename = "endAzCompass")] + pub end_az_compass: Compass, + + /// Unix time for the end of this pass. You should convert this UTC value to observer's time zone + #[serde(rename = "endUTC")] + pub end_utc: u64, +} + +#[derive(Debug, Deserialize)] +pub struct Above { + pub info: AboveInfo, + pub above: Option>, +} + +#[derive(Debug, Deserialize)] +pub struct AboveInfo { + /// Category name (ANY if category id requested was 0) + pub category: String, + + /// Count of transactions performed with this API key in last 60 minutes + #[serde(rename = "transactionscount")] + pub transaction_count: u64, + + /// Count of satellites returned + #[serde(rename = "satcount")] + pub sat_count: u64, +} + +#[derive(Debug, Deserialize)] +pub struct AboveSat { + /// Satellite NORAD id + #[serde(rename = "satid")] + pub sat_id: u64, + + /// Satellite international designator + #[serde(rename = "satname")] + pub sat_name: String, + + /// Satellite name + #[serde(rename = "intDesignator")] + pub int_designator: String, + + /// Satellite launch date (YYYY-MM-DD) + #[serde(rename = "launchDate")] + pub launch_date: String, + + /// Satellite footprint latitude (decimal degrees format) + #[serde(rename = "satlat")] + pub sat_lat: f64, + + /// Satellite footprint longitude (decimal degrees format) + #[serde(rename = "satlng")] + pub sat_lng: f64, + + /// Satellite altitude (km) + #[serde(rename = "satalt")] + pub sat_alt: f64, +} + +#[cfg(test)] +mod test { + use super::*; + + #[test] + fn test_tle() { + let data = r#"{ + "info": { + "satid": 25544, + "satname": "SPACE STATION", + "transactionscount": 4 + }, + "tle": "1 25544U 98067A 18077.09047010 .00001878 00000-0 35621-4 0 9999\r\n2 25544 51.6412 112.8495 0001928 208.4187 178.9720 15.54106440104358" + }"#; + + let parsed = serde_json::from_str::(data); + assert!(parsed.is_ok()) + } + + #[test] + fn test_positions() { + let data = r#"{ + "info": { + "satname": "SPACE STATION", + "satid": 25544, + "transactionscount": 5 + }, + "positions": [ + { + "satlatitude": -39.90318514, + "satlongitude": 158.28897924, + "sataltitude": 417.85, + "azimuth": 254.31, + "elevation": -69.09, + "ra": 44.77078138, + "dec": -43.99279118, + "timestamp": 1521354418 + }, + { + "satlatitude": -39.86493451, + "satlongitude": 158.35261287, + "sataltitude": 417.84, + "azimuth": 254.33, + "elevation": -69.06, + "ra": 44.81676119, + "dec": -43.98086419, + "timestamp": 1521354419 + } + ] + }"#; + + let parsed = serde_json::from_str::(data); + assert!(parsed.is_ok()); + } + + #[test] + fn test_visualpasses() { + let data = r#"{ + "info": { + "satid": 25544, + "satname": "SPACE STATION", + "transactionscount": 4, + "passescount": 3 + }, + "passes": [ + { + "startAz": 307.21, + "startAzCompass": "NW", + "startEl": 13.08, + "startUTC": 1521368025, + "maxAz": 225.45, + "maxAzCompass": "SW", + "maxEl": 78.27, + "maxUTC": 1521368345, + "endAz": 132.82, + "endAzCompass": "SE", + "endEl": 0, + "endUTC": 1521368660, + "mag": -2.4, + "duration": 485 + }, + { + "startAz": 311.56, + "startAzCompass": "NW", + "startEl": 50.94, + "startUTC": 1521451295, + "maxAz": 37.91, + "maxAzCompass": "NE", + "maxEl": 52.21, + "maxUTC": 1521451615, + "endAz": 118.61, + "endAzCompass": "ESE", + "endEl": 0, + "endUTC": 1521451925, + "mag": -2, + "duration": 325 + }, + { + "startAz": 291.06, + "startAzCompass": "WNW", + "startEl": 3.47, + "startUTC": 1521457105, + "maxAz": 231.58, + "maxAzCompass": "SW", + "maxEl": 14.75, + "maxUTC": 1521457380, + "endAz": 170.63, + "endAzCompass": "S", + "endEl": 0, + "endUTC": 1521457650, + "mag": -0.1, + "duration": 485 + } + ] + }"#; + + let parsed = serde_json::from_str::(data); + assert!(parsed.is_ok()); + } + + #[test] + fn test_radiopasses() { + let data = r#"{ + "info": { + "satid": 25544, + "satname": "SPACE STATION", + "transactionscount": 2, + "passescount": 2 + }, + "passes": [ + { + "startAz": 311.57, + "startAzCompass": "NW", + "startUTC": 1521451295, + "maxAz": 37.98, + "maxAzCompass": "NE", + "maxEl": 52.19, + "maxUTC": 1521451615, + "endAz": 118.6, + "endAzCompass": "ESE", + "endUTC": 1521451925 + }, + { + "startAz": 242.34, + "startAzCompass": "WSW", + "startUTC": 1521600275, + "maxAz": 328.03, + "maxAzCompass": "NW", + "maxEl": 49.59, + "maxUTC": 1521600595, + "endAz": 47.97, + "endAzCompass": "NE", + "endUTC": 1521600905 + } + ] + }"#; + let parsed = serde_json::from_str::(data); + assert!(parsed.is_ok()); + } + + #[test] + fn test_above() { + let data = r#"{ + "info": { + "category": "Amateur radio", + "transactionscount": 17, + "satcount": 3 + }, + "above": [ + { + "satid": 20480, + "satname": "JAS 1B (FUJI 2)", + "intDesignator": "1990-013C", + "launchDate": "1990-02-07", + "satlat": 49.5744, + "satlng": -96.7081, + "satalt": 1227.9326 + }, + { + "satid": 26609, + "satname": "AMSAT OSCAR 40", + "intDesignator": "2000-072B", + "launchDate": "2000-11-16", + "satlat": 5.5105, + "satlng": -21.4478, + "satalt": 49678.6389 + }, + { + "satid": 40719, + "satname": "DEORBITSAIL", + "intDesignator": "2015-032E", + "launchDate": "2015-07-10", + "satlat": 43.8106, + "satlng": -90.3944, + "satalt": 657.5516 + } + ] + }"#; + let parsed = serde_json::from_str::(data); + assert!(parsed.is_ok()); + } +}