Update formatting
This commit is contained in:
36
src/cli.rs
36
src/cli.rs
@@ -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 {
|
||||||
|
22
src/main.rs
22
src/main.rs
@@ -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();
|
||||||
@@ -53,8 +53,13 @@ fn exec_arg_helper(args: &cli::Args, m: &dyn mensa::Mealplan) {
|
|||||||
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)>) {
|
||||||
@@ -78,4 +83,3 @@ fn table_short(data: Vec<(&str, String, &str)>) {
|
|||||||
|
|
||||||
println!("{table}");
|
println!("{table}");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
100
src/mensa.rs
100
src/mensa.rs
@@ -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,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user