use crate::arg::FormatArg;
use crate::builder::FormatBuilder;
use crate::engine::format_with_args;
use crate::error::FormatError;
use crate::param::FormatParam;
pub trait Format {
fn format(&self, param: &dyn FormatParam) -> String {
self.try_format(param).expect("Insufficient parameters")
}
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 builder<'t>(&'t self) -> FormatBuilder<'t, 'static>;
}
impl Format for str {
fn try_format(&self, param: &dyn FormatParam) -> Result<String, FormatError> {
let mut args: Vec<&dyn FormatArg> = Vec::new();
param.visit(&mut |arg| args.push(arg));
format_with_args(self, &args)
}
fn builder<'t>(&'t self) -> FormatBuilder<'t, 'static> {
FormatBuilder::new(self)
}
}