xdoc-macros 0.1.1

Procedural macros for xdoc
Documentation
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()
    }
}