use crate::Formatable;
use crate::Span;
use crate::Spanable;
use std;
pub struct DelayedFormat<'a, T> {
pub span: Span<T>,
pub fmt: &'a str,
pub start: &'a str,
pub end: &'a str,
}
impl<'a, T> std::fmt::Display for DelayedFormat<'a, T>
where
T: Spanable + Formatable,
{
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
use std::fmt::Write;
let mut start_fmt = String::new();
start_fmt.write_fmt(format_args!("{}", self.span.start.format(self.start)))?;
start_fmt.shrink_to_fit();
let mut end_fmt = String::new();
end_fmt.write_fmt(format_args!("{}", self.span.end.format(self.end)))?;
end_fmt.shrink_to_fit();
let r1 = self.fmt.replace("{start}", start_fmt.as_str());
let r2 = r1.replace("{end}", end_fmt.as_str());
write!(f, "{}", r2)
}
}