use rust_stemmers::Algorithm;
use crate::stopwords::{english, german};
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum Language {
English,
German,
French,
Spanish,
Italian,
Dutch,
Portuguese,
Swedish,
Norwegian,
Danish,
Finnish,
Russian,
}
impl Language {
#[must_use]
pub fn from_tag(tag: &str) -> Option<Self> {
let primary = tag.split(['-', '_']).next().unwrap_or(tag);
match primary.to_ascii_lowercase().as_str() {
"en" => Some(Self::English),
"de" => Some(Self::German),
"fr" => Some(Self::French),
"es" => Some(Self::Spanish),
"it" => Some(Self::Italian),
"nl" => Some(Self::Dutch),
"pt" => Some(Self::Portuguese),
"sv" => Some(Self::Swedish),
"no" | "nb" | "nn" => Some(Self::Norwegian),
"da" => Some(Self::Danish),
"fi" => Some(Self::Finnish),
"ru" => Some(Self::Russian),
_ => None,
}
}
pub(crate) fn stemmer_algorithm(self) -> Algorithm {
match self {
Self::English => Algorithm::English,
Self::German => Algorithm::German,
Self::French => Algorithm::French,
Self::Spanish => Algorithm::Spanish,
Self::Italian => Algorithm::Italian,
Self::Dutch => Algorithm::Dutch,
Self::Portuguese => Algorithm::Portuguese,
Self::Swedish => Algorithm::Swedish,
Self::Norwegian => Algorithm::Norwegian,
Self::Danish => Algorithm::Danish,
Self::Finnish => Algorithm::Finnish,
Self::Russian => Algorithm::Russian,
}
}
pub(crate) fn stop_words(self) -> &'static [&'static str] {
match self {
Self::English => english::WORDS,
Self::German => german::WORDS,
_ => &[],
}
}
}