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, end_date: &DateTime, ) -> Result, 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> = response.json()?; let mut output: Vec = 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) }