use std::str; // use log::debug; use scraper::{Html, Selector}; use crate::context::Context; use crate::probe::{Entry, Probe}; fn from_html(document: &str) -> Result { let html = Html::parse_document(document); let mut messages = Vec::new(); let history = Vec::new(); let comments = Vec::new(); let selector = Selector::parse("#toporganisations li").unwrap(); for element in html.select(&selector) { let message = element .text() .map(str::trim) .filter(|s| !s.is_empty()) .collect::>() .join(" "); messages.push(message); } Ok(Entry { messages, history, comments, }) } pub struct VemRingde; impl Probe for VemRingde { fn uri(&self, number: &str) -> String { format!("http://vemringde.se/?q={}", number) } fn search(&mut self, ctx: &mut Context, number: &str) -> Result<(), ()> { let body = if let Some(cache) = ctx.cache_get("vem_ringde", &number) { String::from_utf8(cache.data).unwrap() } else { let body = reqwest::get(&self.uri(number)).unwrap().text().unwrap(); ctx.cache_set("vem_ringde", &number, body.as_bytes()) .expect("wut?! why not?!"); body }; match from_html(&body) { Ok(entry) => { println!("vemringde.se:"); print!("{}", entry); Ok(()) } Err(_) => Err(()), } } } #[cfg(test)] mod tests { use pretty_assertions::assert_eq; use super::*; #[test] fn test_0104754350() { let document = include_str!("../../fixtures/vemringde/0104754350.html"); let expected = Entry { messages: vec!["Folksam (5 samtal)".to_string()], history: vec![], comments: vec![], }; assert_eq!(from_html(&document), Ok(expected)); } #[test] fn test_0313908905() { let document = include_str!("../../fixtures/vemringde/0313908905.html"); let expected = Entry { messages: vec![], history: vec![], comments: vec![], }; assert_eq!(from_html(&document), Ok(expected)); } #[test] fn test_0702269893() { let document = include_str!("../../fixtures/vemringde/0702269893.html"); let expected = Entry { messages: vec![], history: vec![], comments: vec![], }; assert_eq!(from_html(&document), Ok(expected)); } #[test] fn test_0726443387() { let document = include_str!("../../fixtures/vemringde/0726443387.html"); let expected = Entry { messages: vec![], history: vec![], comments: vec![], }; assert_eq!(from_html(&document), Ok(expected)); } #[test] fn test_0751793426() { let document = include_str!("../../fixtures/vemringde/0751793426.html"); let expected = Entry { messages: vec![], history: vec![], comments: vec![], }; assert_eq!(from_html(&document), Ok(expected)); } #[test] fn test_0751793483() { let document = include_str!("../../fixtures/vemringde/0751793483.html"); let expected = Entry { messages: vec![], history: vec![], comments: vec![], }; assert_eq!(from_html(&document), Ok(expected)); } #[test] fn test_0751793499() { let document = include_str!("../../fixtures/vemringde/0751793499.html"); let expected = Entry { messages: vec![], history: vec![], comments: vec![], }; assert_eq!(from_html(&document), Ok(expected)); } }