use super::*;
pub trait Boilerplate {
const TEMPLATE: &'static str;
const TEXT: &'static [&'static str];
#[cfg(feature = "reload")]
const PATH: Option<&'static str>;
fn boilerplate(
&self,
boilerplate_text: &[impl AsRef<str>],
boilerplate_output: &mut fmt::Formatter,
) -> fmt::Result;
#[cfg(feature = "reload")]
fn reload(&self, src: &str) -> Result<Reload<&Self>, Error> {
let new = Token::parse(src).map_err(Error::ParseNew)?;
let old = Token::parse(Self::TEMPLATE).map_err(Error::ParseOld)?;
if new.len() != old.len() {
return Err(Error::Length {
new: new.len(),
old: old.len(),
});
}
for (new, old) in new.iter().zip(old) {
if !new.is_compatible_with(old) {
return Err(Error::Incompatible {
new: new.to_string(),
old: old.to_string(),
});
}
}
Ok(Reload {
inner: self,
text: new
.into_iter()
.filter_map(Token::text)
.map(ToOwned::to_owned)
.collect(),
})
}
#[cfg(feature = "reload")]
fn reload_from_path(&self) -> Result<Reload<&Self>, Error> {
let Some(path) = Self::PATH else {
return Err(Error::Path);
};
let src = std::fs::read_to_string(path).map_err(|source| Error::Io { source, path })?;
self.reload(&src)
}
}