From b5dae458682940f0304806eb2902748ccda9379b Mon Sep 17 00:00:00 2001 From: Paul van Tilburg Date: Sat, 12 Feb 2022 15:58:56 +0100 Subject: [PATCH] Create maps cache and run its task next to Rocket --- Cargo.lock | 134 +++++++++++++++++++++++++++++++++++++++++++++++++++- Cargo.toml | 1 + src/main.rs | 37 ++++++++++++--- src/maps.rs | 17 +++++++ 4 files changed, 182 insertions(+), 7 deletions(-) create mode 100644 src/maps.rs diff --git a/Cargo.lock b/Cargo.lock index 545adef..8451990 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,21 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "addr2line" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9ecd88a8c8378ca913a680cd98f0f13ac67383d35993f86c90a70e3f137816b" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + [[package]] name = "ansi_term" version = "0.12.1" @@ -78,6 +93,21 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +[[package]] +name = "backtrace" +version = "0.3.64" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e121dee8023ce33ab248d9ce1493df03c3b38a659b240096fcbd7048ff9c31f" +dependencies = [ + "addr2line", + "cc", + "cfg-if 1.0.0", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + [[package]] name = "base-x" version = "0.2.8" @@ -152,6 +182,33 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "color-eyre" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f1885697ee8a177096d42f158922251a41973117f6d8a234cee94b9509157b7" +dependencies = [ + "backtrace", + "color-spantrace", + "eyre", + "indenter", + "once_cell", + "owo-colors", + "tracing-error", +] + +[[package]] +name = "color-spantrace" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6eee477a4a8a72f4addd4de416eb56d54bc307b284d6601bafdee1f4ea462d1" +dependencies = [ + "once_cell", + "owo-colors", + "tracing-core", + "tracing-error", +] + [[package]] name = "const_fn" version = "0.4.9" @@ -239,6 +296,16 @@ dependencies = [ "cfg-if 1.0.0", ] +[[package]] +name = "eyre" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc225d8f637923fe585089fcf03e705c222131232d2c1fb622e84ecf725d0eb8" +dependencies = [ + "indenter", + "once_cell", +] + [[package]] name = "fastrand" version = "1.7.0" @@ -448,6 +515,12 @@ dependencies = [ "wasi", ] +[[package]] +name = "gimli" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78cc372d058dcf6d5ecd98510e7fbc9e5aec4d21de70f65fea8fecebcd881bd4" + [[package]] name = "glob" version = "0.3.0" @@ -630,6 +703,12 @@ dependencies = [ "unicode-normalization", ] +[[package]] +name = "indenter" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" + [[package]] name = "indexmap" version = "1.8.0" @@ -744,7 +823,7 @@ dependencies = [ "serde", "serde_json", "tracing", - "tracing-subscriber", + "tracing-subscriber 0.3.8", ] [[package]] @@ -784,6 +863,16 @@ dependencies = [ "unicase", ] +[[package]] +name = "miniz_oxide" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" +dependencies = [ + "adler", + "autocfg", +] + [[package]] name = "mio" version = "0.6.23" @@ -924,6 +1013,15 @@ dependencies = [ "libc", ] +[[package]] +name = "object" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67ac1d3f9a1d3616fd9a60c8d74296f22406a238b6a72f5cc1e6f314df4ffbf9" +dependencies = [ + "memchr", +] + [[package]] name = "once_cell" version = "1.9.0" @@ -963,6 +1061,12 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "owo-colors" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2386b4ebe91c2f7f51082d4cefa145d030e33a1842a96b12e4885cc3c01f7a55" + [[package]] name = "parking_lot" version = "0.11.2" @@ -1325,6 +1429,12 @@ dependencies = [ "uncased", ] +[[package]] +name = "rustc-demangle" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ef03e0a2b150c7a90d01faf6254c9c48a41e95fb2a8c2ac1c6f0d2b9aefc342" + [[package]] name = "rustc_version" version = "0.2.3" @@ -1487,6 +1597,7 @@ name = "sinoptik" version = "0.1.0" dependencies = [ "chrono", + "color-eyre", "geocoding", "rocket", ] @@ -1869,6 +1980,16 @@ dependencies = [ "valuable", ] +[[package]] +name = "tracing-error" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4d7c0b83d4a500748fa5879461652b361edf5c9d51ede2a2ac03875ca185e24" +dependencies = [ + "tracing", + "tracing-subscriber 0.2.25", +] + [[package]] name = "tracing-futures" version = "0.2.5" @@ -1890,6 +2011,17 @@ dependencies = [ "tracing-core", ] +[[package]] +name = "tracing-subscriber" +version = "0.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e0d2eaa99c3c2e41547cfa109e910a68ea03823cccad4a0525dcbc9b01e8c71" +dependencies = [ + "sharded-slab", + "thread_local", + "tracing-core", +] + [[package]] name = "tracing-subscriber" version = "0.3.8" diff --git a/Cargo.toml b/Cargo.toml index 405387d..932822d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,5 +5,6 @@ edition = "2021" [dependencies] chrono = "0.4.19" +color-eyre = "0.5.6" geocoding = "0.3.1" rocket = { version = "0.5.0-rc.1", features = ["json"] } diff --git a/src/main.rs b/src/main.rs index 8ddf126..9826f75 100644 --- a/src/main.rs +++ b/src/main.rs @@ -11,11 +11,16 @@ )] #![deny(missing_docs)] +use color_eyre::Result; use geocoding::{Forward, Openstreetmap, Point}; use rocket::serde::json::Json; use rocket::serde::Serialize; -use rocket::tokio; -use rocket::{get, launch, routes, FromFormField}; +use rocket::tokio::{self, select}; +use rocket::{get, routes, FromFormField}; + +use self::maps::Maps; + +mod maps; /// The current for a specific location. /// @@ -178,8 +183,28 @@ async fn forecast_geo(lat: f64, lon: f64, metrics: Vec) -> Json _ { - rocket::build().mount("/", routes![forecast_address, forecast_geo]) +/// Starts the main maps refresh loop and sets up and launches Rocket. +#[rocket::main] +async fn main() -> Result<()> { + color_eyre::install()?; + + let rocket = rocket::build() + .mount("/", routes![forecast_address, forecast_geo]) + .ignite() + .await?; + let shutdown = rocket.shutdown(); + + let maps_updater = tokio::spawn(Maps::run()); + + select! { + result = rocket.launch() => { + result? + } + result = maps_updater => { + shutdown.notify(); + result? + } + } + + Ok(()) } diff --git a/src/maps.rs b/src/maps.rs new file mode 100644 index 0000000..bc4cbc2 --- /dev/null +++ b/src/maps.rs @@ -0,0 +1,17 @@ +//! Maps handling. + +use rocket::tokio::time::{sleep, Duration}; + +/// The interval between map refreshes (in seconds). +const SLEEP_INTERVAL: u64 = 60; + +#[derive(Debug, Default)] +pub(crate) struct Maps; + +impl Maps { + pub(crate) async fn run() -> ! { + loop { + sleep(Duration::from_secs(SLEEP_INTERVAL)).await; + } + } +}