#![warn(missing_docs)]
#![cfg_attr(docsrs, feature(doc_cfg))]
#![cfg_attr(docsrs, allow(unused_attributes))]
use std::fmt::Display;
#[cfg(feature = "durations")]
#[cfg_attr(docsrs, doc(cfg(feature = "durations")))]
pub mod durations;
#[cfg(feature = "durations")]
#[cfg_attr(docsrs, doc(cfg(feature = "durations")))]
pub use durations::*;
pub fn humanise_list<T>(list: &[T]) -> String
where
T: Display,
{
match list.len() {
0 => "".to_string(),
1 => list.first().unwrap().to_string(),
2 => format!("{} and {}", list.first().unwrap(), list.last().unwrap()),
_ => {
let mut str = String::new();
for (i, value) in list.iter().enumerate() {
let prefix = match i {
0 => "",
len if len == list.len() - 1 => ", and ",
_ => ", ",
};
str = format!("{}{}{}", str, prefix, value);
}
str
}
}
}
#[inline]
pub fn plural_suffix(count: u128, word: impl AsRef<str>, opposite: bool) -> String {
let count = count.into();
let suffix = match count {
1 => {
if opposite {
"s"
} else {
""
}
}
_ => {
if opposite {
""
} else {
"s"
}
}
};
format!("{}{}", word.as_ref(), suffix)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn plural_suffix_opposite_false() {
assert_eq!(plural_suffix(0, "name", false), "names");
assert_eq!(plural_suffix(1, "name", false), "name");
assert_eq!(plural_suffix(2, "name", false), "names");
}
#[test]
fn plural_suffix_opposite_true() {
assert_eq!(plural_suffix(0, "make", true), "make");
assert_eq!(plural_suffix(1, "make", true), "makes");
assert_eq!(plural_suffix(2, "make", true), "make");
}
}