le_robert/
lib.rs

1#![feature(let_chains)]
2
3mod scrap;
4mod tests;
5
6#[derive(Debug)]
7pub enum RobertError {
8    ReqwestError(reqwest::Error),
9    ParsercherError(String),
10}
11
12#[derive(Debug)]
13pub struct UseSample {
14    pub sample: String,
15    pub source: String,
16}
17
18#[derive(Default)]
19pub struct WordInfos {
20    pub word: String,
21    pub definitions: Vec<String>,
22    pub synonyms: Vec<String>,
23    pub use_samples: Vec<UseSample>,
24}
25
26impl WordInfos {
27    pub fn new(word: &str) -> Result<Self, RobertError> {
28        let dom = scrap::dom_for_word(word).map_err(RobertError::ReqwestError)?;
29        let def = scrap::parse_def(&dom).map_err(RobertError::ParsercherError)?;
30        let synonyms = scrap::parse_synonyms(&dom).map_err(RobertError::ParsercherError)?;
31        let use_samples = scrap::parse_samples(&dom).map_err(RobertError::ParsercherError)?;
32
33        Ok(WordInfos {
34            word: String::from(word),
35            definitions: def,
36            synonyms: synonyms,
37            use_samples: use_samples,
38        })
39    }
40}
41
42pub struct WordInfosBuilder {
43    parse_def: bool,
44    parse_synonyms: bool,
45    parse_use_samples: bool,
46}
47
48impl WordInfosBuilder {
49    pub fn new(parse_def: bool, parse_synonyms: bool, parse_use_samples: bool) -> Self {
50        Self {
51            parse_def,
52            parse_synonyms,
53            parse_use_samples,
54        }
55    }
56
57    pub fn word_infos(&self, word: String) -> Result<WordInfos, RobertError> {
58        let mut infos = WordInfos::default();
59        infos.word = word.clone();
60
61        let dom = scrap::dom_for_word(&word).map_err(RobertError::ReqwestError)?;
62
63        if self.parse_def {
64            let def = scrap::parse_def(&dom).map_err(RobertError::ParsercherError)?;
65            infos.definitions = def;
66        }
67
68        if self.parse_synonyms {
69            let syns = scrap::parse_synonyms(&dom).map_err(RobertError::ParsercherError)?;
70            infos.synonyms = syns;
71        }
72
73        if self.parse_use_samples {
74            let samples = scrap::parse_samples(&dom).map_err(RobertError::ParsercherError)?;
75            infos.use_samples = samples;
76        }
77
78        Ok(infos)
79    }
80}