icu_locid/subtags/
language.rs

1// This file is part of ICU4X. For terms of use, please see the file
2// called LICENSE at the top level of the ICU4X source tree
3// (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
4
5impl_tinystr_subtag!(
6    /// A language subtag (examples: `"en"`, `"csb"`, `"zh"`, `"und"`, etc.)
7    ///
8    /// [`Language`] represents a Unicode base language code conformant to the
9    /// [`unicode_language_id`] field of the Language and Locale Identifier.
10    ///
11    /// # Examples
12    ///
13    /// ```
14    /// use icu::locid::subtags::Language;
15    ///
16    /// let language: Language =
17    ///     "en".parse().expect("Failed to parse a language subtag.");
18    /// ```
19    ///
20    /// If the [`Language`] has no value assigned, it serializes to a string `"und"`, which
21    /// can be then parsed back to an empty [`Language`] field.
22    ///
23    /// # Examples
24    ///
25    /// ```
26    /// use icu::locid::subtags::Language;
27    ///
28    /// assert_eq!(Language::default().as_str(), "und");
29    /// ```
30    ///
31    /// `Notice`: ICU4X uses a narrow form of language subtag of 2-3 characters.
32    /// The specification allows language subtag to optionally also be 5-8 characters
33    /// but that form has not been used and ICU4X does not support it right now.
34    ///
35    /// [`unicode_language_id`]: https://unicode.org/reports/tr35/#unicode_language_id
36    Language,
37    subtags,
38    language,
39    subtags_language,
40    2..=3,
41    s,
42    s.is_ascii_alphabetic(),
43    s.to_ascii_lowercase(),
44    s.is_ascii_alphabetic_lowercase(),
45    InvalidLanguage,
46    ["en", "foo"],
47    ["419", "german", "en1"],
48);
49
50impl Language {
51    /// The default undefined language "und". Same as [`default()`](Default::default()).
52    ///
53    /// # Examples
54    ///
55    /// ```
56    /// use icu::locid::subtags::Language;
57    ///
58    /// assert_eq!(Language::default(), Language::UND);
59    /// ```
60    pub const UND: Self = unsafe { Self::from_raw_unchecked(*b"und") };
61
62    /// Resets the [`Language`] subtag to an empty one (equal to `"und"`).
63    ///
64    /// # Examples
65    ///
66    /// ```
67    /// use icu::locid::subtags::{language, Language};
68    ///
69    /// let mut lang = language!("csb");
70    ///
71    /// assert_ne!(lang, Language::UND);
72    ///
73    /// lang.clear();
74    ///
75    /// assert_eq!(lang, Language::UND);
76    /// ```
77    #[inline]
78    pub fn clear(&mut self) {
79        *self = Self::UND
80    }
81
82    /// Tests if the [`Language`] subtag is empty (equal to `"und"`).
83    ///
84    /// # Examples
85    ///
86    /// ```
87    /// use icu::locid::subtags::Language;
88    ///
89    /// let mut lang = Language::UND;
90    ///
91    /// assert!(lang.is_empty());
92    ///
93    /// lang.clear();
94    ///
95    /// assert!(lang.is_empty());
96    /// ```
97    #[inline]
98    pub fn is_empty(self) -> bool {
99        self == Self::UND
100    }
101}
102
103impl Default for Language {
104    fn default() -> Language {
105        Language::UND
106    }
107}