cabytcini/src/weather.rs

68 lines
1.7 KiB
Rust

use crate::{config::Config, MTState};
use anyhow::Result;
use serde::{Deserialize, Serialize};
use std::{thread, time};
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Root {
pub currently: Currently,
pub daily: Daily,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Currently {
pub time: i64,
pub summary: String,
pub temperature: f64,
pub apparent_temperature: f64,
pub humidity: f64,
pub icon: String,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Daily {
pub summary: String,
pub icon: String,
pub data: Vec<Daum>,
}
#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Daum {
pub time: i64,
pub icon: String,
pub temperature_high: f64,
pub temperature_low: f64,
}
const UPDATE_FREQUENCY: u64 = 15 * 60; // 15 minutes
fn get(cfg: &Config) -> Result<Root> {
let now: Root = ureq::get(&cfg.weather_url)
.set("User-Agent", crate::APP_USER_AGENT)
.call()?
.into_json()?;
Ok(now)
}
pub fn update(st: MTState, cfg: Config) {
loop {
match get(&cfg) {
Ok(datni) => {
let mut data = st.lock().unwrap();
data.weather = Some(datni);
}
Err(why) => {
log::error!("error getting weather from {}: {:?}", &cfg.weather_url, why);
}
}
let amt = time::Duration::new(UPDATE_FREQUENCY, 0);
thread::sleep(amt);
}
}