language_text_analysis/
language.rs1use rust_stemmers::Algorithm;
4
5use crate::stopwords::{english, german};
6
7#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
14#[non_exhaustive]
15pub enum Language {
16 English,
18 German,
20 French,
22 Spanish,
24 Italian,
26 Dutch,
28 Portuguese,
30 Swedish,
32 Norwegian,
34 Danish,
36 Finnish,
38 Russian,
40}
41
42impl Language {
43 #[must_use]
50 pub fn from_tag(tag: &str) -> Option<Self> {
51 let primary = tag.split(['-', '_']).next().unwrap_or(tag);
52 match primary.to_ascii_lowercase().as_str() {
53 "en" => Some(Self::English),
54 "de" => Some(Self::German),
55 "fr" => Some(Self::French),
56 "es" => Some(Self::Spanish),
57 "it" => Some(Self::Italian),
58 "nl" => Some(Self::Dutch),
59 "pt" => Some(Self::Portuguese),
60 "sv" => Some(Self::Swedish),
61 "no" | "nb" | "nn" => Some(Self::Norwegian),
62 "da" => Some(Self::Danish),
63 "fi" => Some(Self::Finnish),
64 "ru" => Some(Self::Russian),
65 _ => None,
66 }
67 }
68
69 pub(crate) fn stemmer_algorithm(self) -> Algorithm {
71 match self {
72 Self::English => Algorithm::English,
73 Self::German => Algorithm::German,
74 Self::French => Algorithm::French,
75 Self::Spanish => Algorithm::Spanish,
76 Self::Italian => Algorithm::Italian,
77 Self::Dutch => Algorithm::Dutch,
78 Self::Portuguese => Algorithm::Portuguese,
79 Self::Swedish => Algorithm::Swedish,
80 Self::Norwegian => Algorithm::Norwegian,
81 Self::Danish => Algorithm::Danish,
82 Self::Finnish => Algorithm::Finnish,
83 Self::Russian => Algorithm::Russian,
84 }
85 }
86
87 pub(crate) fn stop_words(self) -> &'static [&'static str] {
91 match self {
92 Self::English => english::WORDS,
93 Self::German => german::WORDS,
94 _ => &[],
95 }
96 }
97}