From 7f11abdbd463cde40b2cd53bf880c8851325dcf9 Mon Sep 17 00:00:00 2001 From: "Dr. Matthias Ratajczak" Date: Thu, 15 Dec 2022 15:48:24 +0100 Subject: [PATCH] refactor main --- src/main.rs | 60 +++++++++++++++++++++++++++++++---------------------- 1 file changed, 35 insertions(+), 25 deletions(-) diff --git a/src/main.rs b/src/main.rs index 9bd56bc..1f68032 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,6 @@ mod extractor; -use anyhow::{anyhow, Result}; +use anyhow::{anyhow, bail, Result}; use scraper::{Html, Selector}; use extractor::Extractor; @@ -14,35 +14,45 @@ fn main() -> Result<()> { let extractor = Extractor::new(); - 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, &extractor.delay); - for time_block in departure_block - .select(&extractor.time) - .next() - .unwrap() - .children() - { - let value = time_block.value(); - - if value.is_text() { - let text = value.as_text().unwrap().trim(); - if !text.is_empty() { - print!("Abfahrt: {text}"); - if let Some(late_text) = &late { - print!(" | Verspätet: {late_text}"); - } - println!(); - } - } - } + for departure in get_departures(&html, &extractor) { + println!("{}", get_transport_line(departure)); + println!("{}", get_times(departure, &extractor)?); println!(); } Ok(()) } +fn get_times(departure: scraper::ElementRef, extractor: &Extractor) -> Result { + let delay = extract_delay(departure, &extractor.delay); + for time_block in departure.select(&extractor.time).next().unwrap().children() { + let value = time_block.value(); + + if value.is_text() { + let scheduled_time = value.as_text().unwrap().trim(); + if !scheduled_time.is_empty() { + let mut result = "Abfahrt: ".to_owned(); + result.push_str(scheduled_time); + + if let Some(late_text) = &delay { + result.push_str(" | Verspätet: "); + result.push_str(late_text); + } + return Ok(result); + } + } + } + bail!("could not get the times") +} + +fn get_departures<'a>(html: &'a Html, extractor: &'a Extractor) -> scraper::html::Select<'a, 'a> { + html.select(&extractor.departure) +} + +fn get_transport_line(departure_block: scraper::ElementRef) -> &str { + let val = departure_block.value(); + val.attr("data-filter").unwrap().trim() +} + fn query_server() -> Result { match ureq::get(SIEDLUNG).call() { Ok(response) => Ok(response.into_string().map_err(|e| anyhow!(e))?),