use proc_macro2::TokenStream;
#[derive(Debug, Clone)]
pub(crate) struct Template {
pub(crate) nodes: Vec<TemplateNode>,
}
#[derive(Debug, Clone)]
pub(crate) enum TemplateNode {
Element(ElementTemplate),
Component(ComponentTemplate),
Text(String),
Expr(RustExpr),
Comment(String),
}
#[derive(Debug, Clone)]
pub(crate) struct ElementTemplate {
pub(crate) name: XmlName,
pub(crate) attributes: Vec<AttributeTemplate>,
pub(crate) children: Vec<TemplateNode>,
pub(crate) self_closing: bool,
}
#[derive(Debug, Clone)]
pub(crate) struct ComponentTemplate {
pub(crate) path: RustPath,
pub(crate) props: Vec<AttributeTemplate>,
pub(crate) children: Vec<TemplateNode>,
pub(crate) self_closing: bool,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub(crate) struct XmlName {
pub(crate) prefix: Option<String>,
pub(crate) local: String,
}
impl XmlName {
pub(crate) fn lexical(&self) -> String {
match &self.prefix {
Some(prefix) => format!("{prefix}:{}", self.local),
None => self.local.clone(),
}
}
}
#[derive(Debug, Clone)]
pub(crate) struct AttributeTemplate {
pub(crate) name: XmlName,
pub(crate) value: AttributeValue,
}
#[derive(Debug, Clone)]
pub(crate) enum AttributeValue {
Literal(String),
Expr(RustExpr),
}
#[derive(Debug, Clone)]
pub(crate) struct RustExpr {
pub(crate) tokens: TokenStream,
}
impl RustExpr {
pub(crate) fn source(&self) -> String {
self.tokens.to_string()
}
}
#[derive(Debug, Clone)]
pub(crate) struct RustPath {
pub(crate) tokens: TokenStream,
}
impl RustPath {
pub(crate) fn source(&self) -> String {
self.tokens.to_string()
}
}