whatlang/core/
detector.rs1use crate::core;
2use crate::core::FilterList;
3use crate::core::Info;
4use crate::core::Options;
5use crate::scripts::{detect_script, Script};
6use crate::Lang;
7
8#[cfg_attr(feature = "arbitrary", derive(::arbitrary::Arbitrary))]
32#[derive(Debug, Clone, Default)]
33pub struct Detector {
34 options: Options,
35}
36
37impl Detector {
38 pub fn new() -> Self {
39 Self::default()
40 }
41
42 pub fn with_allowlist(list: Vec<Lang>) -> Self {
43 let opts = Options::new().set_filter_list(FilterList::allow(list));
44 Self::with_options(opts)
45 }
46
47 pub fn with_denylist(list: Vec<Lang>) -> Self {
48 let opts = Options::new().set_filter_list(FilterList::deny(list));
49 Self::with_options(opts)
50 }
51
52 fn with_options(options: Options) -> Self {
53 Detector { options }
54 }
55
56 pub fn detect(&self, text: &str) -> Option<Info> {
57 core::detect_with_options(text, &self.options)
58 }
59
60 pub fn detect_lang(&self, text: &str) -> Option<Lang> {
61 core::detect_with_options(text, &self.options).map(|info| info.lang())
62 }
63
64 pub fn detect_script(&self, text: &str) -> Option<Script> {
65 detect_script(text)
66 }
67}
68
69#[cfg(test)]
70mod tests {
71 use super::*;
72
73 #[test]
74 fn test_detect_script() {
75 assert_eq!(
77 Detector::new().detect_script("Кириллица"),
78 Some(Script::Cyrillic)
79 );
80 }
81
82 #[test]
83 fn test_detect_lang() {
84 let text = "Ĉiuj redaktantoj de Esperanta Vikipedio estas volontuloj. Ili partoprenas en la kunlaborema komunumo, sen estro, kie la anoj kunordigas siajn strebojn kadre de temaj projektoj kaj pluraj diskutejoj. Ili sekvas la bazajn regulojn establitaj de la komunumo, ekzemple kontrolebleco de la informo aŭ la menciindeco de la temo.";
86 assert_eq!(Detector::new().detect_lang(text), Some(Lang::Epo));
87 }
88
89 #[test]
90 fn test_detect() {
91 let text = "Ĉiuj redaktantoj de Esperanta Vikipedio estas volontuloj. Ili partoprenas en la kunlaborema komunumo, sen estro, kie la anoj kunordigas siajn strebojn kadre de temaj projektoj kaj pluraj diskutejoj. Ili sekvas la bazajn regulojn establitaj de la komunumo, ekzemple kontrolebleco de la informo aŭ la menciindeco de la temo.";
93 let output = Detector::new().detect(text);
94 assert_eq!(output.is_some(), true);
95
96 let info = output.unwrap();
97 assert_eq!(info.lang(), Lang::Epo);
98 assert_eq!(info.script(), Script::Latin);
99 }
100}