/rust/registry/src/index.crates.io-1949cf8c6b5b557f/icu_provider-2.0.0/src/fallback.rs
Line | Count | Source |
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 | | |
5 | | //! Options to define fallback behaviour. |
6 | | //! |
7 | | //! These options are consumed by the `LocaleFallbacker` in the `icu_locales` crate |
8 | | //! (or the `icu::locales` module), but are defined here because they are used by `DataMarkerInfo`. |
9 | | |
10 | | /// Hint for which subtag to prioritize during fallback. |
11 | | /// |
12 | | /// For example, `"en-US"` might fall back to either `"en"` or `"und-US"` depending |
13 | | /// on this enum. |
14 | | #[derive(Debug, PartialEq, Eq, Copy, Clone, PartialOrd, Ord)] |
15 | | #[non_exhaustive] |
16 | | pub enum LocaleFallbackPriority { |
17 | | /// Prioritize the language. This is the default behavior. |
18 | | /// |
19 | | /// For example, `"en-US"` should go to `"en"` and then `"und"`. |
20 | | Language, |
21 | | /// Prioritize the script. |
22 | | /// |
23 | | /// For example, `"en-US"` should go to `"en"` and then `"und-Latn"` and then `"und"`. |
24 | | Script, |
25 | | /// Prioritize the region. |
26 | | /// |
27 | | /// For example, `"en-US"` should go to `"und-US"` and then `"und"`. |
28 | | Region, |
29 | | } |
30 | | |
31 | | impl LocaleFallbackPriority { |
32 | | /// Const-friendly version of [`Default::default`]. |
33 | 0 | pub const fn default() -> Self { |
34 | 0 | Self::Language |
35 | 0 | } |
36 | | } |
37 | | |
38 | | impl Default for LocaleFallbackPriority { |
39 | 0 | fn default() -> Self { |
40 | 0 | Self::default() |
41 | 0 | } |
42 | | } |
43 | | |
44 | | /// Configuration settings for a particular fallback operation. |
45 | | #[derive(Debug, Clone, PartialEq, Eq, Copy)] |
46 | | #[non_exhaustive] |
47 | | pub struct LocaleFallbackConfig { |
48 | | /// Strategy for choosing which subtags to drop during locale fallback. |
49 | | /// |
50 | | /// # Examples |
51 | | /// |
52 | | /// Retain the language and script subtags until the final step: |
53 | | /// |
54 | | /// ``` |
55 | | /// use icu::locale::fallback::LocaleFallbackConfig; |
56 | | /// use icu::locale::fallback::LocaleFallbackPriority; |
57 | | /// use icu::locale::locale; |
58 | | /// use icu::locale::LocaleFallbacker; |
59 | | /// |
60 | | /// // Set up the fallback iterator. |
61 | | /// let fallbacker = LocaleFallbacker::new(); |
62 | | /// let mut config = LocaleFallbackConfig::default(); |
63 | | /// config.priority = LocaleFallbackPriority::Language; |
64 | | /// let mut fallback_iterator = fallbacker |
65 | | /// .for_config(config) |
66 | | /// .fallback_for(locale!("ca-ES-valencia").into()); |
67 | | /// |
68 | | /// // Run the algorithm and check the results. |
69 | | /// assert_eq!(fallback_iterator.get(), &locale!("ca-ES-valencia").into()); |
70 | | /// fallback_iterator.step(); |
71 | | /// assert_eq!(fallback_iterator.get(), &locale!("ca-ES").into()); |
72 | | /// fallback_iterator.step(); |
73 | | /// assert_eq!(fallback_iterator.get(), &locale!("ca-valencia").into()); |
74 | | /// fallback_iterator.step(); |
75 | | /// assert_eq!(fallback_iterator.get(), &locale!("ca").into()); |
76 | | /// fallback_iterator.step(); |
77 | | /// assert_eq!(fallback_iterator.get(), &locale!("und").into()); |
78 | | /// ``` |
79 | | /// |
80 | | /// Retain the region subtag until the final step: |
81 | | /// |
82 | | /// ``` |
83 | | /// use icu::locale::fallback::LocaleFallbackConfig; |
84 | | /// use icu::locale::fallback::LocaleFallbackPriority; |
85 | | /// use icu::locale::locale; |
86 | | /// use icu::locale::LocaleFallbacker; |
87 | | /// |
88 | | /// // Set up the fallback iterator. |
89 | | /// let fallbacker = LocaleFallbacker::new(); |
90 | | /// let mut config = LocaleFallbackConfig::default(); |
91 | | /// config.priority = LocaleFallbackPriority::Region; |
92 | | /// let mut fallback_iterator = fallbacker |
93 | | /// .for_config(config) |
94 | | /// .fallback_for(locale!("ca-ES-valencia").into()); |
95 | | /// |
96 | | /// // Run the algorithm and check the results. |
97 | | /// assert_eq!(fallback_iterator.get(), &locale!("ca-ES-valencia").into()); |
98 | | /// fallback_iterator.step(); |
99 | | /// assert_eq!(fallback_iterator.get(), &locale!("ca-ES").into()); |
100 | | /// fallback_iterator.step(); |
101 | | /// assert_eq!(fallback_iterator.get(), &locale!("und-ES-valencia").into()); |
102 | | /// fallback_iterator.step(); |
103 | | /// assert_eq!(fallback_iterator.get(), &locale!("und-ES").into()); |
104 | | /// fallback_iterator.step(); |
105 | | /// assert_eq!(fallback_iterator.get(), &locale!("und").into()); |
106 | | /// ``` |
107 | | pub priority: LocaleFallbackPriority, |
108 | | } |
109 | | |
110 | | impl LocaleFallbackConfig { |
111 | | /// Const version of [`Default::default`]. |
112 | 0 | pub const fn default() -> Self { |
113 | 0 | Self { |
114 | 0 | priority: LocaleFallbackPriority::default(), |
115 | 0 | } |
116 | 0 | } |
117 | | } |
118 | | |
119 | | impl Default for LocaleFallbackConfig { |
120 | 0 | fn default() -> Self { |
121 | 0 | Self::default() |
122 | 0 | } |
123 | | } |