diff --git a/Cargo.lock b/Cargo.lock index f0ab768..5c83c90 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17,6 +17,15 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + [[package]] name = "async-trait" version = "0.1.81" @@ -121,6 +130,7 @@ name = "berlinerbaeder-exporter" version = "0.1.0" dependencies = [ "axum", + "regex", "reqwest", "serde", "serde_json", @@ -692,6 +702,35 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "regex" +version = "1.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b91213439dad192326a0d7c6ee3955910425f441d7038e0d6933b0aec5c4517f" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" + [[package]] name = "reqwest" version = "0.12.5" diff --git a/Cargo.toml b/Cargo.toml index 474330c..fcba363 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,6 +5,7 @@ edition = "2021" [dependencies] axum = "0.7.5" +regex = "1.10.5" reqwest = { version = "0.12.5", features = ["json"] } serde = { version = "1.0.204", features = ["derive"] } serde_json = "1.0.120" diff --git a/src/main.rs b/src/main.rs index a0b7647..4eb2fe1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,6 +3,8 @@ use axum::{ Router, }; +use regex::Regex; + use serde::{ Deserialize, Serialize, @@ -27,6 +29,42 @@ struct TrafficDataItem { thresholds: Vec, } +struct BaederNames { + id: String, + name: String, +} + +async fn get_baeder_names() -> Result, String> { + let client = reqwest::Client::new(); + + let baedernames_req = client.get(String::from("https://www.berlinerbaeder.de/baeder/sommerbaeder-auslastung/")) + .send().await + .map_err(|_err| String::from("Cannot fetch baeder names"))?; + + if baedernames_req.status() != reqwest::StatusCode::OK { + return Err(String::from("Unexpected response from baeder names")); + } + + let baedernames_body = baedernames_req.text().await + .map_err(|_err| "Cannot read body of baedernames")?; + + let r = Regex::new(r#" = vec!{}; + + for c in r.captures_iter(baedernames_body.as_str()) { + baedernames.push(BaederNames { + id: c.get(1).unwrap().as_str().to_string(), + name: c.get(2).unwrap().as_str().to_string(), + }) + } + + return Ok(baedernames); + +} + + #[tokio::main] async fn main() { @@ -53,6 +91,8 @@ async fn main() { } } + let baedernames = get_baeder_names().await; + let app = Router::new() .route("/", get(route_index)) .route("/metrics", get(route_metrics));