le-robert 0.1.0

Get French word definitions, synonyms and use samples from the dictionary Le Robert
Documentation
#![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)
    }
}