use alloc::string::String;
use core::fmt;
use crate::builder::FormatBuilder;
use crate::error::FormatError;
use crate::param::{FormatParam, collect_args};
use crate::template::Template;
pub trait Format {
fn format(&self, param: &dyn FormatParam) -> String {
self.try_format(param)
.unwrap_or_else(|error| panic!("format failed: {error}"))
}
fn try_format(&self, param: &dyn FormatParam) -> Result<String, FormatError>;
fn checked_format(&self, param: &dyn FormatParam) -> Option<String> {
self.try_format(param).ok()
}
fn write_to(&self, sink: &mut dyn fmt::Write, param: &dyn FormatParam) {
self.try_write_to(sink, param)
.unwrap_or_else(|error| panic!("format failed: {error}"))
}
fn try_write_to(
&self,
sink: &mut dyn fmt::Write,
param: &dyn FormatParam,
) -> Result<(), FormatError>;
fn builder<'t>(&'t self) -> FormatBuilder<'t, 'static>;
}
impl Format for str {
fn try_format(&self, param: &dyn FormatParam) -> Result<String, FormatError> {
let mut out = String::with_capacity(self.len());
self.try_write_to(&mut out, param)?;
Ok(out)
}
fn try_write_to(
&self,
sink: &mut dyn fmt::Write,
param: &dyn FormatParam,
) -> Result<(), FormatError> {
let args = collect_args(param);
Template::parse(self)?.render(&args, sink)
}
fn builder<'t>(&'t self) -> FormatBuilder<'t, 'static> {
FormatBuilder::new(self)
}
}