#![feature(let_chains)]
mod scrap;
mod tests;
#[derive(Debug)]
pub enum RobertError {
ReqwestError(reqwest::Error),
ParsercherError(String),
}
#[derive(Debug)]
pub struct UseSample {
pub sample: String,
pub source: String,
}
#[derive(Default)]
pub struct WordInfos {
pub word: String,
pub definitions: Vec<String>,
pub synonyms: Vec<String>,
pub use_samples: Vec<UseSample>,
}
impl WordInfos {
pub fn new(word: &str) -> Result<Self, RobertError> {
let dom = scrap::dom_for_word(word).map_err(RobertError::ReqwestError)?;
let def = scrap::parse_def(&dom).map_err(RobertError::ParsercherError)?;
let synonyms = scrap::parse_synonyms(&dom).map_err(RobertError::ParsercherError)?;
let use_samples = scrap::parse_samples(&dom).map_err(RobertError::ParsercherError)?;
Ok(WordInfos {
word: String::from(word),
definitions: def,
synonyms: synonyms,
use_samples: use_samples,
})
}
}
pub struct WordInfosBuilder {
parse_def: bool,
parse_synonyms: bool,
parse_use_samples: bool,
}
impl WordInfosBuilder {
pub fn new(parse_def: bool, parse_synonyms: bool, parse_use_samples: bool) -> Self {
Self {
parse_def,
parse_synonyms,
parse_use_samples,
}
}
pub fn word_infos(&self, word: String) -> Result<WordInfos, RobertError> {
let mut infos = WordInfos::default();
infos.word = word.clone();
let dom = scrap::dom_for_word(&word).map_err(RobertError::ReqwestError)?;
if self.parse_def {
let def = scrap::parse_def(&dom).map_err(RobertError::ParsercherError)?;
infos.definitions = def;
}
if self.parse_synonyms {
let syns = scrap::parse_synonyms(&dom).map_err(RobertError::ParsercherError)?;
infos.synonyms = syns;
}
if self.parse_use_samples {
let samples = scrap::parse_samples(&dom).map_err(RobertError::ParsercherError)?;
infos.use_samples = samples;
}
Ok(infos)
}
}