Update formatting

This commit is contained in:
2024-04-21 22:21:24 +02:00
parent a945e288c4
commit 36fdf4d806
3 changed files with 99 additions and 63 deletions

View File

@@ -4,29 +4,29 @@ use clap::Parser;
#[derive(Parser, Debug)] #[derive(Parser, Debug)]
#[command(author, version, about, long_about = None)] #[command(author, version, about, long_about = None)]
pub struct Args { pub struct Args {
/// Show Mensa Morgenstelle /// Show Mensa Morgenstelle
#[arg(short, long, default_value_t = false)] #[arg(short, long, default_value_t = false)]
pub morgenstelle: bool, pub morgenstelle: bool,
/// Show Mensa Shedhalle /// Show Mensa Shedhalle
#[arg(short, long, default_value_t = false)] #[arg(short, long, default_value_t = false)]
pub shedhalle: bool, pub shedhalle: bool,
/// Format as plain text /// Format as plain text
#[arg(short, long, default_value_t = false)] #[arg(short, long, default_value_t = false)]
pub plaintext: bool, pub plaintext: bool,
/// Use very short format (oneline) /// Use very short format (oneline)
#[arg(short, long, default_value_t = false)] #[arg(short, long, default_value_t = false)]
pub oneline: bool, pub oneline: bool,
/// Offset of days in the future (valid inputs 0-7) /// Offset of days in the future (valid inputs 0-7)
#[arg(short, long, default_value_t = 0)] #[arg(short, long, default_value_t = 0)]
pub days: u8, pub days: u8,
/// Show the vegetarian menu /// Show the vegetarian menu
#[arg(short, long, default_value_t = false)] #[arg(short, long, default_value_t = false)]
pub vegetarian: bool, pub vegetarian: bool,
} }
pub fn get_args() -> Args { pub fn get_args() -> Args {

View File

@@ -1,11 +1,11 @@
use mensa::Mealplan; use chrono::{Datelike, Local};
use comfy_table::*;
use comfy_table::presets::UTF8_FULL;
use comfy_table::modifiers::UTF8_ROUND_CORNERS; use comfy_table::modifiers::UTF8_ROUND_CORNERS;
use chrono::{Local, Datelike}; use comfy_table::presets::UTF8_FULL;
use comfy_table::*;
use mensa::Mealplan;
mod mensa;
mod cli; mod cli;
mod mensa;
//use crate::mensa::*; //use crate::mensa::*;
@@ -35,7 +35,7 @@ async fn exec_arguments(args: &cli::Args) -> Result<(), Box<dyn std::error::Erro
} }
fn exec_arg_helper(args: &cli::Args, m: &dyn mensa::Mealplan) { fn exec_arg_helper(args: &cli::Args, m: &dyn mensa::Mealplan) {
if let Some(menus) = m.nth(args.days, args.vegetarian) { if let Some(menus) = m.nth(args.days, args.vegetarian) {
if args.plaintext { if args.plaintext {
for i in menus.iter() { for i in menus.iter() {
i.print_short_info(); i.print_short_info();
@@ -47,14 +47,19 @@ fn exec_arg_helper(args: &cli::Args, m: &dyn mensa::Mealplan) {
menus.first().unwrap().print_very_short_info(); menus.first().unwrap().print_very_short_info();
return; return;
} }
// Default case --> print fancy // Default case --> print fancy
if let Some(dt) = Local::now().checked_add_days(chrono::Days::new(args.days as u64)) { if let Some(dt) = Local::now().checked_add_days(chrono::Days::new(args.days as u64)) {
println!("Datum: {}", dt.date_naive()); println!("Datum: {}", dt.date_naive());
} }
println!("{}", m.name()); println!("{}", m.name());
table_short(menus.iter().map(|&x| x.get_short_info()).collect::<Vec<(&str, String, &str)>>()); table_short(
} menus
.iter()
.map(|&x| x.get_short_info())
.collect::<Vec<(&str, String, &str)>>(),
);
}
} }
fn table_short(data: Vec<(&str, String, &str)>) { fn table_short(data: Vec<(&str, String, &str)>) {
@@ -68,7 +73,7 @@ fn table_short(data: Vec<(&str, String, &str)>) {
.set_content_arrangement(ContentArrangement::Dynamic) .set_content_arrangement(ContentArrangement::Dynamic)
//.set_width(40) //.set_width(40)
.set_header(vec!["Art", "Beschreibung", "Preis (Student)"]); .set_header(vec!["Art", "Beschreibung", "Preis (Student)"]);
for d in data.iter() { for d in data.iter() {
table.add_row(vec![Cell::new(d.0), Cell::new(&d.1), Cell::new(d.2)]); table.add_row(vec![Cell::new(d.0), Cell::new(&d.1), Cell::new(d.2)]);
} }
@@ -78,4 +83,3 @@ fn table_short(data: Vec<(&str, String, &str)>) {
println!("{table}"); println!("{table}");
} }

View File

@@ -1,12 +1,11 @@
extern crate serde_derive; extern crate serde_derive;
use chrono::{Local, Datelike}; use chrono::{Datelike, Local};
use serde::{Serialize, Deserialize};
use serde::{Deserialize, Serialize};
pub enum MensaName { pub enum MensaName {
Shedhalle, Shedhalle,
Morgenstelle Morgenstelle,
} }
pub trait Mealplan { pub trait Mealplan {
@@ -18,25 +17,29 @@ pub trait Mealplan {
pub enum Mensa { pub enum Mensa {
Shedhalle(MensaShedhalle), Shedhalle(MensaShedhalle),
Morgenstelle(MensaMorgenstelle) Morgenstelle(MensaMorgenstelle),
} }
impl Mensa { impl Mensa {
pub async fn from(name: MensaName) -> Result<Mensa, Box<dyn std::error::Error>> { pub async fn from(name: MensaName) -> Result<Mensa, Box<dyn std::error::Error>> {
match name { match name {
MensaName::Shedhalle => { MensaName::Shedhalle => {
let resp = reqwest::get("https://www.my-stuwe.de//wp-json/mealplans/v1/canteens/611?lang=de") let resp = reqwest::get(
.await? "https://www.my-stuwe.de//wp-json/mealplans/v1/canteens/611?lang=de",
.json::<MensaShedhalle>() )
.await?; .await?
.json::<MensaShedhalle>()
.await?;
Ok(Mensa::Shedhalle(resp)) Ok(Mensa::Shedhalle(resp))
}, }
MensaName::Morgenstelle => { MensaName::Morgenstelle => {
let resp = reqwest::get("https://www.my-stuwe.de//wp-json/mealplans/v1/canteens/621?lang=de") let resp = reqwest::get(
.await? "https://www.my-stuwe.de//wp-json/mealplans/v1/canteens/621?lang=de",
.json::<MensaMorgenstelle>() )
.await?; .await?
.json::<MensaMorgenstelle>()
.await?;
Ok(Mensa::Morgenstelle(resp)) Ok(Mensa::Morgenstelle(resp))
} }
@@ -44,8 +47,6 @@ impl Mensa {
} }
} }
fn get_nth_date(days: u8) -> Option<chrono::DateTime<Local>> { fn get_nth_date(days: u8) -> Option<chrono::DateTime<Local>> {
if days > 7 { if days > 7 {
return None; return None;
@@ -55,13 +56,12 @@ fn get_nth_date(days: u8) -> Option<chrono::DateTime<Local>> {
return match dt.weekday() { return match dt.weekday() {
chrono::Weekday::Sat => dt.checked_add_days(chrono::Days::new(2)), chrono::Weekday::Sat => dt.checked_add_days(chrono::Days::new(2)),
chrono::Weekday::Sun => dt.checked_add_days(chrono::Days::new(1)), chrono::Weekday::Sun => dt.checked_add_days(chrono::Days::new(1)),
_ => Some(dt) _ => Some(dt),
}; };
} }
None None
} }
#[derive(Debug, Serialize, Deserialize)] #[derive(Debug, Serialize, Deserialize)]
pub struct MensaShedhalle { pub struct MensaShedhalle {
#[serde(rename = "611")] #[serde(rename = "611")]
@@ -85,7 +85,11 @@ impl Mealplan for MensaShedhalle {
fn today(&self) -> Vec<&Menu> { fn today(&self) -> Vec<&Menu> {
let local = format!("{}", Local::now().format("%Y-%m-%d")); let local = format!("{}", Local::now().format("%Y-%m-%d"));
self.canteen.menus.iter().filter(|&x| x.menu_date == local).collect() self.canteen
.menus
.iter()
.filter(|&x| x.menu_date == local)
.collect()
} }
fn nth(&self, days: u8, vegetarian: bool) -> Option<Vec<&Menu>> { fn nth(&self, days: u8, vegetarian: bool) -> Option<Vec<&Menu>> {
@@ -93,19 +97,28 @@ impl Mealplan for MensaShedhalle {
Some(dt) => { Some(dt) => {
let local = format!("{}", dt.format("%Y-%m-%d")); let local = format!("{}", dt.format("%Y-%m-%d"));
if vegetarian { if vegetarian {
Some(self.canteen.menus.iter().filter(|&x| x.menu_date == local && x.menu_line.contains("veg")).collect()) Some(
self.canteen
.menus
.iter()
.filter(|&x| x.menu_date == local && x.menu_line.contains("veg"))
.collect(),
)
} else { } else {
Some(self.canteen.menus.iter().filter(|&x| x.menu_date == local).collect()) Some(
self.canteen
.menus
.iter()
.filter(|&x| x.menu_date == local)
.collect(),
)
} }
}, }
_ => None _ => None,
} }
} }
} }
#[derive(Debug, Serialize, Deserialize)] #[derive(Debug, Serialize, Deserialize)]
pub struct MensaMorgenstelle { pub struct MensaMorgenstelle {
#[serde(rename = "621")] #[serde(rename = "621")]
@@ -123,7 +136,11 @@ impl Mealplan for MensaMorgenstelle {
fn today(&self) -> Vec<&Menu> { fn today(&self) -> Vec<&Menu> {
let local = format!("{}", Local::now().format("%Y-%m-%d")); let local = format!("{}", Local::now().format("%Y-%m-%d"));
self.canteen.menus.iter().filter(|&x| x.menu_date == local).collect() self.canteen
.menus
.iter()
.filter(|&x| x.menu_date == local)
.collect()
} }
fn nth(&self, days: u8, vegetarian: bool) -> Option<Vec<&Menu>> { fn nth(&self, days: u8, vegetarian: bool) -> Option<Vec<&Menu>> {
@@ -131,17 +148,28 @@ impl Mealplan for MensaMorgenstelle {
Some(dt) => { Some(dt) => {
let local = format!("{}", dt.format("%Y-%m-%d")); let local = format!("{}", dt.format("%Y-%m-%d"));
if vegetarian { if vegetarian {
Some(self.canteen.menus.iter().filter(|&x| x.menu_date == local && x.menu_line.contains("veg")).collect()) Some(
self.canteen
.menus
.iter()
.filter(|&x| x.menu_date == local && x.menu_line.contains("veg"))
.collect(),
)
} else { } else {
Some(self.canteen.menus.iter().filter(|&x| x.menu_date == local).collect()) Some(
self.canteen
.menus
.iter()
.filter(|&x| x.menu_date == local)
.collect(),
)
} }
}, }
_ => None _ => None,
} }
} }
} }
#[derive(Debug, Serialize, Deserialize)] #[derive(Debug, Serialize, Deserialize)]
pub struct Canteen { pub struct Canteen {
#[serde(rename = "canteenId")] #[serde(rename = "canteenId")]
@@ -179,7 +207,12 @@ impl Menu {
} }
pub fn print_short_info(&self) { pub fn print_short_info(&self) {
println!("{}: {}, {}", self.menu_line, self.menu.join(", "), self.student_price); println!(
"{}: {}, {}",
self.menu_line,
self.menu.join(", "),
self.student_price
);
} }
pub fn print_very_short_info(&self) { pub fn print_very_short_info(&self) {
@@ -215,4 +248,3 @@ pub enum FiltersInclude {
#[serde(rename = "vegan")] #[serde(rename = "vegan")]
Vegan, Vegan,
} }