Compare commits
2 Commits
49e8db169c
...
72fc8fb588
Author | SHA1 | Date | |
---|---|---|---|
72fc8fb588 | |||
5abbe686cf |
47
src/main.rs
47
src/main.rs
@ -1,4 +1,5 @@
|
|||||||
use axum::{
|
use axum::{
|
||||||
|
extract::State,
|
||||||
routing::get,
|
routing::get,
|
||||||
Router,
|
Router,
|
||||||
};
|
};
|
||||||
@ -10,6 +11,8 @@ use serde::{
|
|||||||
Serialize,
|
Serialize,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
use std::collections::HashMap;
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize)]
|
#[derive(Serialize, Deserialize)]
|
||||||
struct TrafficDataThresholds {
|
struct TrafficDataThresholds {
|
||||||
level: i64,
|
level: i64,
|
||||||
@ -29,12 +32,7 @@ struct TrafficDataItem {
|
|||||||
thresholds: Vec<TrafficDataThresholds>,
|
thresholds: Vec<TrafficDataThresholds>,
|
||||||
}
|
}
|
||||||
|
|
||||||
struct BaederNames {
|
async fn get_baeder_names() -> Result<HashMap<String, String>, String> {
|
||||||
id: String,
|
|
||||||
name: String,
|
|
||||||
}
|
|
||||||
|
|
||||||
async fn get_baeder_names() -> Result<Vec<BaederNames>, String> {
|
|
||||||
let client = reqwest::Client::new();
|
let client = reqwest::Client::new();
|
||||||
|
|
||||||
let baedernames_req = client.get(String::from("https://www.berlinerbaeder.de/baeder/sommerbaeder-auslastung/"))
|
let baedernames_req = client.get(String::from("https://www.berlinerbaeder.de/baeder/sommerbaeder-auslastung/"))
|
||||||
@ -51,19 +49,23 @@ async fn get_baeder_names() -> Result<Vec<BaederNames>, String> {
|
|||||||
let r = Regex::new(r#"<tr data-bath="(.+)" data-name="(.+)" data-address="#)
|
let r = Regex::new(r#"<tr data-bath="(.+)" data-name="(.+)" data-address="#)
|
||||||
.map_err(|_err| String::from("Cannot parse regex"))?;
|
.map_err(|_err| String::from("Cannot parse regex"))?;
|
||||||
|
|
||||||
let mut baedernames: Vec<BaederNames> = vec!{};
|
let mut baedernames= HashMap::new();
|
||||||
|
|
||||||
for c in r.captures_iter(baedernames_body.as_str()) {
|
for c in r.captures_iter(baedernames_body.as_str()) {
|
||||||
baedernames.push(BaederNames {
|
baedernames.insert(
|
||||||
id: c.get(1).unwrap().as_str().to_string(),
|
c.get(1).unwrap().as_str().to_string(), // id
|
||||||
name: c.get(2).unwrap().as_str().to_string(),
|
c.get(2).unwrap().as_str().to_string(), // name
|
||||||
})
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return Ok(baedernames);
|
return Ok(baedernames);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Clone)]
|
||||||
|
struct AppState {
|
||||||
|
baedernames: HashMap<String, String>,
|
||||||
|
}
|
||||||
|
|
||||||
#[tokio::main]
|
#[tokio::main]
|
||||||
async fn main() {
|
async fn main() {
|
||||||
@ -91,11 +93,24 @@ async fn main() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let baedernames = get_baeder_names().await;
|
// If baedernames cannot be fetched, ignore them
|
||||||
|
let baedernames = get_baeder_names().await.unwrap_or(HashMap::new());
|
||||||
|
|
||||||
|
println!("Baedernames:");
|
||||||
|
for (id, name) in &baedernames {
|
||||||
|
println!("{id}: {name}");
|
||||||
|
}
|
||||||
|
println!("");
|
||||||
|
|
||||||
|
let state = AppState {
|
||||||
|
baedernames,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
let app = Router::new()
|
let app = Router::new()
|
||||||
.route("/", get(route_index))
|
.route("/", get(route_index))
|
||||||
.route("/metrics", get(route_metrics));
|
.route("/metrics", get(route_metrics))
|
||||||
|
.with_state(state);
|
||||||
|
|
||||||
let listener = tokio::net::TcpListener::bind(listen).await.unwrap();
|
let listener = tokio::net::TcpListener::bind(listen).await.unwrap();
|
||||||
println!("Server listening on: http://{}", listener.local_addr().unwrap());
|
println!("Server listening on: http://{}", listener.local_addr().unwrap());
|
||||||
@ -107,7 +122,9 @@ async fn route_index() -> String {
|
|||||||
return String::from("Prometheus exporter for Berlinerbaeder occupancy");
|
return String::from("Prometheus exporter for Berlinerbaeder occupancy");
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn route_metrics() -> Result<String, String> {
|
async fn route_metrics(
|
||||||
|
State(state): State<AppState>,
|
||||||
|
) -> Result<String, String> {
|
||||||
let client = reqwest::Client::new();
|
let client = reqwest::Client::new();
|
||||||
let trafficdata_req = client.get(String::from("https://www.berlinerbaeder.de/traffic/trafficdata.json"))
|
let trafficdata_req = client.get(String::from("https://www.berlinerbaeder.de/traffic/trafficdata.json"))
|
||||||
.send().await
|
.send().await
|
||||||
@ -126,7 +143,7 @@ async fn route_metrics() -> Result<String, String> {
|
|||||||
let mut out = String::new();
|
let mut out = String::new();
|
||||||
|
|
||||||
for bad in trafficdata {
|
for bad in trafficdata {
|
||||||
out.push_str(&format!("berlinerbaeder_occupation{{bad=\"{}\"}} {}\n", bad.id, bad.counter.unwrap_or(-1)));
|
out.push_str(&format!("berlinerbaeder_occupation{{bad=\"{}\" badname=\"{}\"}} {}\n", bad.id, state.baedernames.get(&bad.id).unwrap_or(&String::new()), bad.counter.unwrap_or(-1)));
|
||||||
}
|
}
|
||||||
|
|
||||||
return Ok(out);
|
return Ok(out);
|
||||||
|
Loading…
Reference in New Issue
Block a user