Add print options

This commit is contained in:
2022-11-15 23:31:16 +01:00
parent 909e679632
commit 1b68728e3e
4 changed files with 275 additions and 34 deletions

View File

@@ -1,18 +1,21 @@
use mensa::Mealplan;
mod mensa;
//use crate::mensa::*;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let resp = reqwest::get("https://www.my-stuwe.de//wp-json/mealplans/v1/canteens/611?lang=de")
.await?
.json::<mensa::MensaShedhalle>()
.await?;
println!("{:#?}", resp);
let shedhalle = mensa::Mensa::from(mensa::MensaName::Shedhalle).await?;
if let mensa::Mensa::Shedhalle(resp) = shedhalle {
//println!("{:#?}", resp);
//println!("{}", resp.today());
for a in resp.today().iter() {
a.print_short_info();
}
}
Ok(())
}
pub enum Mensa {
Shedhalle(mensa::MensaShedhalle),
}

View File

@@ -1,14 +1,83 @@
extern crate serde_derive;
use chrono::{DateTime, Local};
use serde::{Serialize, Deserialize};
pub enum MensaName {
Shedhalle,
Morgenstelle
}
pub trait Mealplan {
fn id(&self) -> &str;
fn today(&self) -> Vec<&Menu>;
}
pub enum Mensa {
Shedhalle(MensaShedhalle),
Morgenstelle(MensaMorgenstelle)
}
impl Mensa {
pub async fn from(name: MensaName) -> Result<Mensa, Box<dyn std::error::Error>> {
match name {
MensaName::Shedhalle => {
let resp = reqwest::get("https://www.my-stuwe.de//wp-json/mealplans/v1/canteens/611?lang=de")
.await?
.json::<MensaShedhalle>()
.await?;
Ok(Mensa::Shedhalle(resp))
},
MensaName::Morgenstelle => {
let resp = reqwest::get("https://www.my-stuwe.de//wp-json/mealplans/v1/canteens/621?lang=de")
.await?
.json::<MensaMorgenstelle>()
.await?;
Ok(Mensa::Morgenstelle(resp))
}
}
}
}
#[derive(Debug, Serialize, Deserialize)]
pub struct MensaShedhalle {
#[serde(rename = "611")]
the_611: The611,
canteen: Canteen,
}
impl MensaShedhalle {
fn print(&self) {
println!("{:#?}", self);
}
}
impl Mealplan for MensaShedhalle {
fn id(&self) -> &str {
&self.canteen.canteen_id
}
fn today(&self) -> Vec<&Menu> {
let local = format!("{}", Local::now().format("%Y-%m-%d"));
self.canteen.menus.iter().filter(|&x| x.menu_date == local).collect()
}
}
#[derive(Debug, Serialize, Deserialize)]
pub struct The611 {
pub struct MensaMorgenstelle {
#[serde(rename = "621")]
canteen: Canteen,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct Canteen {
#[serde(rename = "canteenId")]
canteen_id: String,
canteen: String,
@@ -22,7 +91,7 @@ pub struct Menu {
menu_line: String,
photo: Photo,
#[serde(rename = "studentPrice")]
student_price: StudentPrice,
student_price: String,
#[serde(rename = "guestPrice")]
guest_price: String,
#[serde(rename = "pupilPrice")]
@@ -30,14 +99,24 @@ pub struct Menu {
#[serde(rename = "menuDate")]
menu_date: String,
menu: Vec<String>,
meats: Vec<FiltersInclude>,
icons: Vec<FiltersInclude>,
meats: Vec<String>,
icons: Vec<String>,
#[serde(rename = "filtersInclude")]
filters_include: Vec<FiltersInclude>,
allergens: Vec<String>,
additives: Vec<String>,
}
impl Menu {
pub fn print(&self) {
println!("{:#?}", self);
}
pub fn print_short_info(&self) {
println!("{}: {}, {}", self.menu_line, self.menu.join(", "), self.student_price);
}
}
#[derive(Debug, Serialize, Deserialize)]
pub struct Photo {
thumbnail: String,
@@ -61,23 +140,3 @@ pub enum FiltersInclude {
Vegan,
}
#[derive(Debug, Serialize, Deserialize)]
pub enum StudentPrice {
#[serde(rename = "-")]
Empty,
#[serde(rename = "0,95")]
The095,
#[serde(rename = "1,00")]
The100,
#[serde(rename = "2,65")]
The265,
#[serde(rename = "3,10")]
The310,
#[serde(rename = "3,20")]
The320,
#[serde(rename = "3,40")]
The340,
#[serde(rename = "3,50")]
The350,
}