afvalcalendar: Host enschede afvalcalendar
This commit is contained in:
parent
0d43b5177d
commit
8f178f776e
10 changed files with 1651 additions and 0 deletions
pkgs/afvalcalendar/src
43
pkgs/afvalcalendar/src/calendar.rs
Normal file
43
pkgs/afvalcalendar/src/calendar.rs
Normal file
|
@ -0,0 +1,43 @@
|
|||
use chrono::{Duration, NaiveDate};
|
||||
use icalendar::{Alarm, Calendar, Component, Event, EventLike, Property};
|
||||
|
||||
use crate::trash::TrashType;
|
||||
|
||||
pub(crate) fn calendar_from_pickup_dates(dates: Vec<(TrashType, NaiveDate)>) -> Calendar {
|
||||
let mut ical = Calendar::new();
|
||||
ical.name("Twente Milieu Afvalkalender");
|
||||
|
||||
let events = dates.iter().map(|date| {
|
||||
let description = match date.0 {
|
||||
TrashType::Grey => "Restafval wordt opgehaald",
|
||||
TrashType::Green => "GFT wordt opgehaald",
|
||||
TrashType::Paper => "Papier wordt opgehaald",
|
||||
TrashType::Packages => "Verpakkingen worden opgehaald",
|
||||
};
|
||||
|
||||
let color = Property::new(
|
||||
"COLOR",
|
||||
match date.0 {
|
||||
TrashType::Grey => "darkgray",
|
||||
TrashType::Green => "darkgreen",
|
||||
TrashType::Paper => "royalblue",
|
||||
TrashType::Packages => "darkorange",
|
||||
},
|
||||
);
|
||||
|
||||
let reminder = Alarm::display(description, -Duration::hours(5));
|
||||
|
||||
Event::new()
|
||||
.all_day(date.1)
|
||||
.summary(description)
|
||||
.append_property(color)
|
||||
.alarm(reminder)
|
||||
.done()
|
||||
});
|
||||
|
||||
for event in events {
|
||||
ical.push(event);
|
||||
}
|
||||
|
||||
ical.done()
|
||||
}
|
10
pkgs/afvalcalendar/src/main.rs
Normal file
10
pkgs/afvalcalendar/src/main.rs
Normal file
|
@ -0,0 +1,10 @@
|
|||
mod calendar;
|
||||
mod trash;
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() {
|
||||
let dates = trash::get_pickup_dates().await.unwrap();
|
||||
let calendar = calendar::calendar_from_pickup_dates(dates);
|
||||
|
||||
calendar.print().unwrap();
|
||||
}
|
59
pkgs/afvalcalendar/src/trash.rs
Normal file
59
pkgs/afvalcalendar/src/trash.rs
Normal file
|
@ -0,0 +1,59 @@
|
|||
use chrono::{Months, NaiveDate, NaiveDateTime, Utc};
|
||||
use serde::Deserialize;
|
||||
use serde_repr::Deserialize_repr;
|
||||
|
||||
#[derive(Deserialize, Debug)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
struct CalendarAPIDatum {
|
||||
pickup_dates: Vec<NaiveDateTime>,
|
||||
pickup_type: TrashType,
|
||||
}
|
||||
|
||||
#[derive(Deserialize, Debug)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
struct CalendarAPIResponse {
|
||||
data_list: Vec<CalendarAPIDatum>,
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, Deserialize_repr, Debug)]
|
||||
#[repr(u8)]
|
||||
pub(crate) enum TrashType {
|
||||
Grey = 0,
|
||||
Green = 1,
|
||||
Paper = 2,
|
||||
Packages = 10,
|
||||
}
|
||||
|
||||
pub(crate) async fn get_pickup_dates() -> Result<Vec<(TrashType, NaiveDate)>, reqwest::Error> {
|
||||
let today = Utc::now().date_naive();
|
||||
let next_month = (today + Months::new(1)).to_string();
|
||||
let today = today.to_string();
|
||||
|
||||
let client = reqwest::Client::new();
|
||||
|
||||
let params = [
|
||||
("companyCode", "8d97bb56-5afd-4cbc-a651-b4f7314264b4"),
|
||||
("uniqueAddressID", "1300002485"),
|
||||
("startDate", &today),
|
||||
("endDate", &next_month),
|
||||
];
|
||||
|
||||
let calendar = client
|
||||
.post("https://twentemilieuapi.ximmio.com/api/GetCalendar")
|
||||
.form(¶ms)
|
||||
.send()
|
||||
.await?
|
||||
.json::<CalendarAPIResponse>()
|
||||
.await?;
|
||||
|
||||
Ok(calendar
|
||||
.data_list
|
||||
.iter()
|
||||
.flat_map(|datum| {
|
||||
datum
|
||||
.pickup_dates
|
||||
.iter()
|
||||
.map(|date| (datum.pickup_type, NaiveDate::from(*date)))
|
||||
})
|
||||
.collect::<Vec<(TrashType, NaiveDate)>>())
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue