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}