langdetect_rs/
language.rs

1use std::fmt;
2
3/// Represents a detected language with its probability score.
4///
5/// This struct is returned by detection methods to provide both the
6/// language identifier and the confidence score for that detection.
7#[derive(Debug, Clone, PartialEq)]
8pub struct Language {
9    /// The language identifier (ISO 639-1 code) or None for unknown.
10    pub lang: Option<String>,
11    /// The probability score between 0.0 and 1.0.
12    pub prob: f64,
13}
14
15impl Language {
16    /// Creates a new Language instance.
17    ///
18    /// # Arguments
19    /// * `lang` - Optional language code (e.g., "ru", "en").
20    /// * `prob` - Probability score between 0.0 and 1.0.
21    ///
22    /// # Examples
23    ///
24    /// ```rust
25    /// use langdetect_rs::language::Language;
26    ///
27    /// let english = Language::new(Some("en".to_string()), 0.95);
28    /// let unknown = Language::new(None, 0.0);
29    /// ```
30    pub fn new(lang: Option<String>, prob: f64) -> Self {
31        Language { lang, prob }
32    }
33}
34
35impl fmt::Display for Language {
36    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
37        match &self.lang {
38            Some(lang) => write!(f, "{}:{:.1}", lang, self.prob),
39            None => write!(f, ""),
40        }
41    }
42}
43
44impl PartialOrd for Language {
45    fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {
46        self.prob.partial_cmp(&other.prob)
47    }
48}
49
50#[cfg(test)]
51mod tests {
52    use super::*;
53
54    #[test]
55    fn test_language() {
56        let lang = Language::new(None, 0.0);
57        assert_eq!(lang.lang, None);
58        assert!((lang.prob - 0.0).abs() < 0.0001);
59        assert_eq!(lang.to_string(), "");
60
61        let lang2 = Language::new(Some("en".to_string()), 1.0);
62        assert_eq!(lang2.lang.as_deref(), Some("en"));
63        assert!((lang2.prob - 1.0).abs() < 0.0001);
64        assert_eq!(lang2.to_string(), "en:1.0");
65    }
66
67    #[test]
68    fn test_cmp() {
69        let lang1 = Language::new(Some("a".to_string()), 0.1);
70        let lang2 = Language::new(Some("b".to_string()), 0.5);
71
72        assert!(lang1 < lang2);
73        assert!(lang1 != lang2);
74        assert!(!(lang1 > lang1));
75    }
76}