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}