[#4] Added BasicDate type conversions
parent
c89841ad38
commit
01276004e1
|
@ -1,11 +1,17 @@
|
||||||
use super::search::Street;
|
use super::search::Street;
|
||||||
|
use chrono::{FixedOffset, TimeZone};
|
||||||
use regex::Regex;
|
use regex::Regex;
|
||||||
|
use reqwest::blocking as reqwest;
|
||||||
use rocket::http::RawStr;
|
use rocket::http::RawStr;
|
||||||
use rocket::request::FromFormValue;
|
use rocket::request::FromFormValue;
|
||||||
use serde::ser::{Serialize, SerializeStruct, Serializer};
|
use serde::ser::{SerializeStruct, Serializer};
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
use std::collections::HashMap;
|
||||||
|
use std::convert::From;
|
||||||
use std::error::Error;
|
use std::error::Error;
|
||||||
|
|
||||||
const BASE_URL: &str = "https://www.ivago.be/nl/particulier/afval/ophaling";
|
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";
|
||||||
|
|
||||||
/// Represents a very simple Timezoneless date. Considering the timezone will
|
/// Represents a very simple Timezoneless date. Considering the timezone will
|
||||||
/// always be CEST (aka Belgium's timezone), this is good enough.
|
/// always be CEST (aka Belgium's timezone), this is good enough.
|
||||||
|
@ -49,6 +55,16 @@ impl Serialize for BasicDate {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl From<BasicDate> for i64 {
|
||||||
|
fn from(date: BasicDate) -> i64 {
|
||||||
|
// Timezone of Brussels is UTC + 2 hours in the western hemisphere
|
||||||
|
FixedOffset::west(7_200)
|
||||||
|
.ymd(date.year as i32, date.month as u32, date.day as u32)
|
||||||
|
.and_hms(0, 0, 0)
|
||||||
|
.timestamp()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl Serialize for PickupTime {
|
impl Serialize for PickupTime {
|
||||||
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
||||||
where
|
where
|
||||||
|
@ -66,6 +82,7 @@ impl Serialize for PickupTime {
|
||||||
|
|
||||||
/// Represents a pickup time instance. All fields are a direct map of the
|
/// Represents a pickup time instance. All fields are a direct map of the
|
||||||
/// original API
|
/// original API
|
||||||
|
#[derive(Deserialize)]
|
||||||
pub struct PickupTime {
|
pub struct PickupTime {
|
||||||
date: BasicDate,
|
date: BasicDate,
|
||||||
label: String,
|
label: String,
|
||||||
|
@ -79,5 +96,35 @@ pub fn get_pickup_times(
|
||||||
start_date: BasicDate,
|
start_date: BasicDate,
|
||||||
end_date: BasicDate,
|
end_date: BasicDate,
|
||||||
) -> Result<Vec<PickupTime>, Box<dyn Error>> {
|
) -> Result<Vec<PickupTime>, Box<dyn Error>> {
|
||||||
Ok(Vec::new())
|
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", &i64::from(start_date).to_string()),
|
||||||
|
("end", &i64::from(end_date).to_string()),
|
||||||
|
])
|
||||||
|
.send()?;
|
||||||
|
let data: Vec<HashMap<String, String>> = response.json()?;
|
||||||
|
|
||||||
|
let mut output: Vec<PickupTime> = Vec::new();
|
||||||
|
|
||||||
|
for map in data.iter() {
|
||||||
|
if let Some(value) = map.get("value") {}
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok()
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue