language_text_analysis/
language.rs1use rust_stemmers::Algorithm;
4
5use crate::stopwords::{
6 english,
7 german,
8};
9
10#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
17#[non_exhaustive]
18pub enum Language {
19 English,
21 German,
23 French,
25 Spanish,
27 Italian,
29 Dutch,
31 Portuguese,
33 Swedish,
35 Norwegian,
37 Danish,
39 Finnish,
41 Russian,
43}
44
45impl Language {
46 #[must_use]
53 pub fn from_tag(tag: &str) -> Option<Self> {
54 let primary = tag.split(['-', '_']).next().unwrap_or(tag);
55 match primary.to_ascii_lowercase().as_str() {
56 "en" => Some(Self::English),
57 "de" => Some(Self::German),
58 "fr" => Some(Self::French),
59 "es" => Some(Self::Spanish),
60 "it" => Some(Self::Italian),
61 "nl" => Some(Self::Dutch),
62 "pt" => Some(Self::Portuguese),
63 "sv" => Some(Self::Swedish),
64 "no" | "nb" | "nn" => Some(Self::Norwegian),
65 "da" => Some(Self::Danish),
66 "fi" => Some(Self::Finnish),
67 "ru" => Some(Self::Russian),
68 _ => None,
69 }
70 }
71
72 pub(crate) fn stemmer_algorithm(self) -> Algorithm {
74 match self {
75 Self::English => Algorithm::English,
76 Self::German => Algorithm::German,
77 Self::French => Algorithm::French,
78 Self::Spanish => Algorithm::Spanish,
79 Self::Italian => Algorithm::Italian,
80 Self::Dutch => Algorithm::Dutch,
81 Self::Portuguese => Algorithm::Portuguese,
82 Self::Swedish => Algorithm::Swedish,
83 Self::Norwegian => Algorithm::Norwegian,
84 Self::Danish => Algorithm::Danish,
85 Self::Finnish => Algorithm::Finnish,
86 Self::Russian => Algorithm::Russian,
87 }
88 }
89
90 pub(crate) fn stop_words(self) -> &'static [&'static str] {
94 match self {
95 Self::English => english::WORDS,
96 Self::German => german::WORDS,
97 _ => &[],
98 }
99 }
100}