plurify/
lib.rs

1// Functions
2
3/// Get plural string `s` for number `n`
4///
5/// ## Example
6/// ``` rust
7/// use plurify::*;
8///
9/// let en = &["cat", "cats", "cats"];
10/// let uk = &["кіт", "кота", "котів"];
11///
12/// assert_eq!(plurify(1, en), "cat");
13/// assert_eq!(plurify(2, en), "cats");
14/// assert_eq!(plurify(5, en), "cats");
15///
16/// assert_eq!(plurify(1, uk), "кіт");
17/// assert_eq!(plurify(2, uk), "кота");
18/// assert_eq!(plurify(5, uk), "котів");
19/// ```
20pub fn plurify<'a>(n: usize, s: &[&'a str]) -> &'a str {
21    s[if n % 100 > 4 && n % 100 < 20 {
22        2
23    } else {
24        [2, 0, 1, 1, 1, 2][usize::min(n % 10, 5)]
25    }]
26}
27
28// Traits
29
30pub trait Plurify {
31    fn plurify<'a>(self, s: &[&'a str]) -> &'a str;
32}
33
34impl Plurify for usize {
35    /// Get plural string for `usize` value
36    ///
37    /// ## Example
38    /// ``` rust
39    /// use plurify::*;
40    ///
41    /// let en = &["cat", "cats", "cats"];
42    /// let uk = &["кіт", "кота", "котів"];
43    ///
44    /// assert_eq!(1.plurify(en), "cat");
45    /// assert_eq!(2.plurify(en), "cats");
46    /// assert_eq!(5.plurify(en), "cats");
47    ///
48    /// assert_eq!(1.plurify(uk), "кіт");
49    /// assert_eq!(2.plurify(uk), "кота");
50    /// assert_eq!(5.plurify(uk), "котів");
51    /// ```
52    fn plurify<'a>(self, s: &[&'a str]) -> &'a str {
53        plurify(self, s)
54    }
55}