humfmt 0.3.0

Ergonomic human-readable formatting toolkit for Rust
Documentation
use core::fmt;

use crate::locale::Locale;

use super::ListOptions;

pub fn format_list<T: fmt::Display, L: Locale>(
    f: &mut fmt::Formatter<'_>,
    items: &[T],
    options: &ListOptions<L>,
) -> fmt::Result {
    let locale = options.locale_ref();
    let conjunction = options.conjunction_or(locale.and_word());

    match items {
        [] => Ok(()),
        [item] => write!(f, "{item}"),
        [first, second] => write!(f, "{first} {conjunction} {second}"),
        _ => {
            let separator = locale.list_separator();
            for (idx, item) in items[..items.len() - 1].iter().enumerate() {
                if idx != 0 {
                    write!(f, "{separator}")?;
                }

                write!(f, "{item}")?;
            }

            if options.serial_comma_value() {
                write!(f, ",")?;
            }

            write!(f, " {conjunction} {}", &items[items.len() - 1])
        }
    }
}