icu_plurals/options.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
5/// A list of options set by the developer to adjust the behavior of the PluralRules.
6///
7/// # Examples
8/// ```
9/// use icu::plurals::{PluralRuleType, PluralRulesOptions};
10///
11/// let options =
12/// PluralRulesOptions::default().with_type(PluralRuleType::Cardinal);
13/// ```
14#[derive(Debug, Clone, Copy, PartialEq, Eq)]
15#[non_exhaustive]
16pub struct PluralRulesOptions {
17 /// Plural rule type to use.
18 ///
19 /// Default is [`PluralRuleType::Cardinal`]
20 pub rule_type: Option<PluralRuleType>,
21}
22
23impl Default for PluralRulesOptions {
24 fn default() -> Self {
25 Self::default()
26 }
27}
28
29impl PluralRulesOptions {
30 /// Constructs a new [`PluralRulesOptions`] struct.
31 pub const fn default() -> Self {
32 Self { rule_type: None }
33 }
34
35 /// Auguments the struct with the set [`PluralRuleType`].
36 pub const fn with_type(mut self, rule_type: PluralRuleType) -> Self {
37 self.rule_type = Some(rule_type);
38 self
39 }
40}
41
42impl From<PluralRuleType> for PluralRulesOptions {
43 fn from(value: PluralRuleType) -> Self {
44 Self {
45 rule_type: Some(value),
46 }
47 }
48}
49
50/// A type of a plural rule which can be associated with the [`PluralRules`] struct.
51///
52/// [`PluralRules`]: crate::PluralRules
53#[derive(Debug, PartialEq, Eq, Clone, Copy, Hash, Default)]
54#[non_exhaustive]
55pub enum PluralRuleType {
56 /// Cardinal plural forms express quantities of units such as time, currency or distance,
57 /// used in conjunction with a number expressed in decimal digits (i.e. "2", not "two").
58 ///
59 /// For example, English has two forms for cardinals:
60 ///
61 /// * [`One`]: `1 day`
62 /// * [`Other`]: `0 days`, `2 days`, `10 days`, `0.3 days`
63 ///
64 /// [`One`]: crate::PluralCategory::One
65 /// [`Other`]: crate::PluralCategory::Other
66 #[default]
67 Cardinal,
68 /// Ordinal plural forms denote the order of items in a set and are always integers.
69 ///
70 /// For example, English has four forms for ordinals:
71 ///
72 /// * [`One`]: `1st floor`, `21st floor`, `101st floor`
73 /// * [`Two`]: `2nd floor`, `22nd floor`, `102nd floor`
74 /// * [`Few`]: `3rd floor`, `23rd floor`, `103rd floor`
75 /// * [`Other`]: `4th floor`, `11th floor`, `96th floor`
76 ///
77 /// [`One`]: crate::PluralCategory::One
78 /// [`Two`]: crate::PluralCategory::Two
79 /// [`Few`]: crate::PluralCategory::Few
80 /// [`Other`]: crate::PluralCategory::Other
81 Ordinal,
82}