diff --git a/src/extractor.rs b/src/extractor.rs new file mode 100644 index 0000000..fd2f7a2 --- /dev/null +++ b/src/extractor.rs @@ -0,0 +1,29 @@ +use scraper::Selector; + +pub(crate) struct Extractor { + pub time: Selector, + pub departure: Selector, + pub delay: Selector, +} + +impl Extractor { + pub(crate) fn new() -> Self { + Self { + time: Self::get_time_selector(), + departure: Self::get_departure_selector(), + delay: Self::get_late_selector(), + } + } + + fn get_time_selector() -> Selector { + Selector::parse("div.col.c2of12.tour p").unwrap() + } + + fn get_departure_selector() -> Selector { + Selector::parse("li[data-filter][data-departure-id][data-departure-time]").unwrap() + } + + fn get_late_selector() -> Selector { + Selector::parse("span.late").unwrap() + } +} diff --git a/src/main.rs b/src/main.rs index bb708f2..9bd56bc 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,7 +1,10 @@ -use anyhow::{anyhow, Result}; +mod extractor; +use anyhow::{anyhow, Result}; use scraper::{Html, Selector}; +use extractor::Extractor; + const SIEDLUNG: &str = "https://www.vvo-online.de/de/fahrplan/aktuelle-abfahrten-ankuenfte/abfahrten?stopid=33006764"; @@ -9,17 +12,15 @@ fn main() -> Result<()> { let message = query_server()?; let html = Html::parse_document(&message); - let departure_selector = get_departure_selector(); - let time_selector = get_time_selector(); - let late_selector = get_late_selector(); + let extractor = Extractor::new(); - for departure_block in html.select(&departure_selector) { + for departure_block in html.select(&extractor.departure) { let val = departure_block.value(); println!("{}", val.attr("data-filter").unwrap().trim()); - let late = extract_delay(departure_block, &late_selector); + let late = extract_delay(departure_block, &extractor.delay); for time_block in departure_block - .select(&time_selector) + .select(&extractor.time) .next() .unwrap() .children() @@ -42,10 +43,6 @@ fn main() -> Result<()> { Ok(()) } -fn get_late_selector() -> Selector { - Selector::parse("span.late").unwrap() -} - fn query_server() -> Result { match ureq::get(SIEDLUNG).call() { Ok(response) => Ok(response.into_string().map_err(|e| anyhow!(e))?), @@ -59,11 +56,3 @@ fn extract_delay(departure_block: scraper::ElementRef, late_selector: &Selector) .next() .map(|content| content.inner_html()) } - -fn get_time_selector() -> Selector { - Selector::parse("div.col.c2of12.tour p").unwrap() -} - -fn get_departure_selector() -> Selector { - Selector::parse("li[data-filter][data-departure-id][data-departure-time]").unwrap() -}