Files
whoareyou/src/probe/vem_ringde.rs

164 lines
3.8 KiB
Rust

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<Entry, ()> {
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::<Vec<_>>()
.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));
}
}