diff --git a/Cargo.lock b/Cargo.lock index 00b8943..ce879bf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -55,6 +55,12 @@ version = "3.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37ccbd214614c6783386c1af30caf03192f17891059cecc394b4fb119e363de3" +[[package]] +name = "bytecount" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c676a478f63e9fa2dd5368a42f28bba0d6c560b775f38583c8bbaa7fcd67c9c" + [[package]] name = "byteorder" version = "1.4.3" @@ -77,6 +83,7 @@ dependencies = [ "regex", "reqwest", "scraper", + "tabled", "tokio", "uuid", ] @@ -766,6 +773,17 @@ version = "6.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ff7415e9ae3fff1225851df9e0d9e4e5479f947619774677a63572e55e80eff" +[[package]] +name = "papergrid" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "453cf71f2a37af495a1a124bf30d4d7469cfbea58e9f2479be9d222396a518a2" +dependencies = [ + "bytecount", + "fnv", + "unicode-width", +] + [[package]] name = "parking_lot" version = "0.12.1" @@ -1342,6 +1360,30 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "tabled" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5b2f8c37d26d87d2252187b0a45ea3cbf42baca10377c7e7eaaa2800fa9bf97" +dependencies = [ + "papergrid", + "tabled_derive", + "unicode-width", +] + +[[package]] +name = "tabled_derive" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9ee618502f497abf593e1c5c9577f34775b111480009ffccd7ad70d23fcaba8" +dependencies = [ + "heck", + "proc-macro-error", + "proc-macro2", + "quote", + "syn", +] + [[package]] name = "tempfile" version = "3.3.0" diff --git a/Cargo.toml b/Cargo.toml index a5fb37d..391cd84 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,3 +18,4 @@ chrono = ">=0.4.20" ics = "0.5" uuid = { version = "1.1", features = ["v4", "fast-rng"] } clap = { version = "3.2", features = ["derive"] } +tabled = "0.8" diff --git a/src/main.rs b/src/main.rs index 42cf611..54fa679 100644 --- a/src/main.rs +++ b/src/main.rs @@ -61,6 +61,6 @@ async fn main() { } else { // Show the calendar println!("Displaying..."); - timetable::display(); + timetable::display(timetable); } } diff --git a/src/timetable.rs b/src/timetable.rs index 8be5fb9..5bd9895 100644 --- a/src/timetable.rs +++ b/src/timetable.rs @@ -1,7 +1,6 @@ use chrono::{Datelike, Duration, TimeZone, Utc}; use regex::Regex; use scraper::{Html, Selector}; - pub mod models; /// Fetch the timetable for a class @@ -322,6 +321,6 @@ fn get_semester(semester: Option, letter: Option) -> i8 { } /// Display the timetable -pub fn display() { - todo!("WIP") +pub fn display(timetable: (Vec, (usize, Vec))) { + println!("{:#?}", timetable); } diff --git a/src/timetable/models.rs b/src/timetable/models.rs index 1b67bcf..612e3d8 100644 --- a/src/timetable/models.rs +++ b/src/timetable/models.rs @@ -1,9 +1,13 @@ -#[derive(Clone)] +use tabled::Tabled; + +#[derive(Tabled, Clone, Debug)] +#[tabled(rename_all = "CamelCase")] pub struct Course { /// Course's name pub name: String, /// Professor's name + #[tabled(display_with = "crate::utils::display_option")] pub professor: Option, /// List of rooms where the course takes place @@ -13,20 +17,25 @@ pub struct Course { /// - 0 => first possible class of the day /// - 1 => second possible class of the day /// - etc. + #[tabled(skip)] pub start: usize, /// Number of time slots the course takes up in the timetable + #[tabled(skip)] pub size: usize, /// Datetime when the course start /// Filled only when building for the ICS + #[tabled(skip)] pub dtstart: Option>, /// Datetime when the course end /// Filled only when building for the ICS + #[tabled(skip)] pub dtend: Option>, } +#[derive(Debug)] pub struct Day { /// Day's name pub name: String, diff --git a/src/utils.rs b/src/utils.rs index 44dec89..e5ffaa1 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -13,3 +13,11 @@ pub fn check_errors(html: &String, loc: &str) { fn err_code(code: i32) -> String { format!("HTTP Code : {}", code) } + +/// Return the string if exists, otherwise return empty string +pub fn display_option(o: &Option) -> String { + match o { + Some(s) => s.to_string(), + None => String::new(), + } +}