nsg/work_schedule/
mod.rs

1//! Work schedule parser (collection of [`Order`]s)
2//!
3//! ## Example usage
4//! You can find example HTMLs in `src/tests/assets/work_schedule/valid`
5//!
6//! ```
7//! use nsg::work_schedule::WorkSchedule;
8//!
9//! let html = include_str!("../tests/assets/work_schedule/valid/1.html");
10//! let work_schedule = WorkSchedule::from(&html);
11//!
12//! println!("Orders: {:#?}", work_schedule.0);
13//! ```
14
15pub mod order;
16
17use scraper::{Html, Selector};
18use serde::{Deserialize, Serialize};
19
20use crate::work_schedule::order::Order;
21
22/// Parsed work schedule containing vector of [`Order`]s
23#[derive(Clone, PartialEq, PartialOrd, Eq, Ord, Debug, Hash, Serialize, Default, Deserialize)]
24pub struct WorkSchedule(pub Vec<Order>);
25
26impl WorkSchedule {
27    /// Parse work schedule from HTML
28    pub fn from(html: &str) -> WorkSchedule {
29        let fragment = Html::parse_fragment(html);
30        let orders = WorkSchedule::parse(&fragment);
31
32        WorkSchedule(orders)
33    }
34
35    fn parse(fragment: &Html) -> Vec<Order> {
36        let request_rows_selector = Selector::parse("table tr td table tr.requestrow").unwrap();
37        let request_rows = fragment.select(&request_rows_selector);
38
39        let mut orders = Vec::new();
40
41        for row in request_rows {
42            orders.push(Order::from_row_and_fragment(&row, fragment));
43        }
44
45        orders
46    }
47}