use lazy_format::lazy_format;
use std::fmt::{self, Display, Formatter};
pub fn format<C, T, M, D>(
f: &mut Formatter<'_>,
container: C,
mapper: M,
separator: &'static str,
prefix: Option<&'static str>,
) -> fmt::Result
where
C: IntoIterator<Item = T>,
M: Fn(T) -> D,
D: Display,
{
let mut container = container.into_iter();
if let Some(item) = container.by_ref().next() {
if let Some(prefix) = prefix {
f.write_str(prefix)?;
}
mapper(item).fmt(f)?;
}
for item in container {
f.write_str(separator)?;
mapper(item).fmt(f)?;
}
Ok(())
}
pub fn simple_format<C, T>(
f: &mut Formatter<'_>,
container: C,
prefix: Option<&'static str>,
) -> fmt::Result
where
C: IntoIterator<Item = T>,
T: Display,
{
format(f, container, plain, "", prefix)
}
pub fn plain<S>(s: S) -> impl Display
where
S: Display,
{
lazy_format!("{s}")
}
pub fn single_quoted<S>(s: S) -> impl Display
where
S: Display,
{
lazy_format!("'{s}'")
}
pub fn double_quoted<S>(s: S) -> impl Display
where
S: Display,
{
lazy_format!("\"{s}\"")
}
pub fn key_value<K, V>(kv: (K, V)) -> impl Display
where
K: Display,
V: Display,
{
lazy_format!("{}: {}", kv.0, kv.1)
}
pub const SPACE: &str = " ";
pub const NEWLINE_INDENT: &str = "\n ";