use crate::{
ast::{Argument, FormatString, Segment},
error::Error,
parser,
renderer::Renderer,
};
use alloc::vec::Vec;
#[derive(Debug)]
pub struct Template<'a> {
pub(crate) parsed: FormatString<'a>,
}
impl<'a> Template<'a> {
pub fn new(source: &'a str) -> Result<Self, Error> {
let parsed = parser::parse(source)?;
Ok(Self { parsed })
}
pub fn render(&self) -> Renderer<'_> {
Renderer::new(self)
}
pub fn contains(&self, name: &str) -> bool {
self.parsed.segments.iter().any(|seg| {
if let Segment::Placeholder(p) = seg
&& let Argument::Named(n) = &p.argument
{
return *n == name;
}
false
})
}
pub fn placeholders(&self) -> Vec<&str> {
self.parsed
.segments
.iter()
.filter_map(|seg| {
if let Segment::Placeholder(p) = seg
&& let Argument::Named(n) = &p.argument
{
return Some(*n);
}
None
})
.collect::<Vec<_>>()
}
}
impl<'a> TryFrom<&'a str> for Template<'a> {
type Error = Error;
fn try_from(source: &'a str) -> Result<Self, Self::Error> {
Self::new(source)
}
}