use std::fmt::{self, Write};
#[repr(transparent)]
struct StrBuf(String);
impl Write for StrBuf {
#[inline]
fn write_str(&mut self, s: &str) -> fmt::Result {
self.0.try_reserve(s.len()).map_err(|_| fmt::Error)?;
self.0.push_str(s);
Ok(())
}
}
#[inline]
pub fn try_format(args: fmt::Arguments<'_>) -> Result<String, fmt::Error> {
let capacity = args.estimated_capacity();
let mut output = String::new();
output.try_reserve(capacity).map_err(|_| fmt::Error)?;
let mut buf = StrBuf(output);
buf.write_fmt(args)?;
Ok(buf.0)
}
#[macro_export]
macro_rules! try_format {
($($arg:tt)*) => {{
let res = $crate::try_format(format_args!($($arg)*));
res
}}
}