random-word-generator 0.1.0

Get a raondom word in different language -- Unofficial
Documentation
#[derive(Default, Debug)]
#[allow(dead_code)]
pub enum Language {
    #[default] ITA,
    ENG,
    ESP,
    GER,
    FRE,
}
#[derive(Default, Debug)]
#[allow(dead_code)]
pub struct RandomWord {
    language: Language,
    word: String,
    meaning: String,
}

impl RandomWord {

    pub fn new(language: Language) -> RandomWord {
        RandomWord {
            language,
            ..Default::default()
        }
    }

    pub fn set_word(&mut self, word: &str) {
        self.word = String::from(word);
    }

    pub fn get_word(&mut self) -> &str {
        &self.word
    }

    pub fn set_meaning(&mut self, meaning: &str) {
        self.meaning = String::from(meaning);
    }
}

pub fn get_random_word(ln: Language) -> RandomWord {
    match ln {
        Language::ITA => get_word(RandomWord::new(Language::ITA), "https://www.palabrasaleatorias.com/parole-casuali.php?fs=1&fs2=0&Submit=Nuova+parola", "td>div"),
        Language::ESP => get_word(RandomWord::new(Language::ESP), "https://www.danielpinero.com/generatore-parola-casuale-spagnolo", r#"body > div.archives.post.post1 > div > div.row > div.col-md-6.col-lg-8 > div.shadow6 > div:nth-child(2) > span > b"#),
        Language::ENG => get_eng_word(RandomWord::new(Language::ENG)),
        Language::GER => get_word(RandomWord::new(Language::GER), "https://www.coolgenerator.com/random-german-words-generator", r#"#main > div > div > div.col-md-9 > div:nth-child(2) > ul > li:nth-child(1) > p.text-center.font-18 > b > span"#),
        Language::FRE => get_word(RandomWord::new(Language::FRE), "https://www.coolgenerator.com/random-french-words-generator", r#"#main > div > div > div.col-md-9 > div:nth-child(2) > ul > li:nth-child(1) > p.text-center.font-18 > b > span"#),
    }

}

fn get_word(mut rw: RandomWord, url: &str, selector: &str) -> RandomWord {
    let response = reqwest::blocking::get(url,)
        .unwrap()
        .text()
        .unwrap();
    let document = scraper::Html::parse_document(&response);
    let selector = scraper::Selector::parse(selector).unwrap();
    let mut inner_html_element = document.select(&selector).map(|x| x.inner_html());
    let mut word = inner_html_element.next().unwrap().trim().to_lowercase();
    word = format_word(word);
    rw.set_word(&word.trim());
    rw.set_meaning("_");
    return rw;
}

fn get_eng_word(mut rw: RandomWord) -> RandomWord {
    let word = random_word::gen();
    rw.set_word(&word);
    return rw;
}

fn format_word(word: String) -> String {
    let mut chunks: Vec<String> = vec!(word.split(",").collect());
    let mut result = &chunks[0];
    chunks = vec!(result.split(" ").collect());
    if chunks.len() > 1 {
        result = &chunks[1];
    } else {
        result = &chunks[0];
    }
    chunks = vec!(result.split("-").collect());
    result = &chunks[0];
    String::from(result)
}