fej/src/ivago/controller/pickup_times.rs

56 lines
1.7 KiB
Rust

use super::structs::{BasicDate, PickupTime, Street};
use crate::errors::FejError;
use chrono::DateTime;
use chrono_tz::Tz;
use reqwest::blocking as reqwest;
use std::collections::HashMap;
use std::convert::{From, TryFrom};
const BASE_URL: &str = "https://www.ivago.be/nl/particulier/afval/ophaling";
const CAL_URL: &str = "https://www.ivago.be/nl/particulier/garbage/pick-up/pickups";
pub fn get_pickup_times(
street: &Street,
number: &u32,
start_date: &DateTime<Tz>,
end_date: &DateTime<Tz>,
) -> Result<Vec<PickupTime>, FejError> {
let client = reqwest::Client::builder().cookie_store(true).build()?;
// This populates the cookies with the necessary values
client
.post(BASE_URL)
.form(&[
("garbage_type", ""),
("ivago_street", &String::from(street)),
("number", &number.to_string()),
("form_id", "garbage_address_form"),
])
.send()?;
let response = client
.get(CAL_URL)
.query(&[
("_format", "json"),
("type", ""),
("start", &start_date.timestamp().to_string()),
("end", &end_date.timestamp().to_string()),
])
.send()?;
let data: Vec<HashMap<String, String>> = response.json()?;
let mut output: Vec<PickupTime> = Vec::new();
for map in data
.iter()
.filter(|m| m.contains_key("date") && m.contains_key("label"))
{
// Because we filtered the maps in the loop, we can safely us unwrap here
if let Ok(date) = BasicDate::try_from(map.get("date").unwrap().as_str()) {
output.push(PickupTime::new(date, map.get("label").unwrap().to_string()))
}
}
Ok(output)
}