vertigo-macro 0.11.4

Reactive Real-DOM library with SSR for Rust - macros
Documentation
use proc_macro::TokenStream;
use proc_macro2::TokenStream as TokenStream2;
use quote::quote;
use rstml::parse;

mod commons;
mod component;
mod group_attrs;
mod node;
use node::convert_node;

pub(crate) fn dom_inner(input: TokenStream) -> TokenStream2 {
    let nodes = match parse(input) {
        Ok(nodes) => nodes,
        Err(err) => return err.to_compile_error(),
    };

    let mut dom_nodes = Vec::new();

    for node in nodes {
        let tokens = convert_node(&node, true);
        dom_nodes.push(tokens);
    }

    if dom_nodes.is_empty() {
        emit_call_site_error!("Empty input");
        return quote! {};
    }

    if dom_nodes.len() == 1 {
        let Some(last) = dom_nodes.pop() else {
            emit_call_site_error!("Empty input");
            return quote! {};
        };

        return quote! {
            vertigo::DomNode::from(#last)
        };
    }

    quote! {
        vertigo::DomNode::from(vertigo::DomComment::dom_fragment(vec!(
            #(#dom_nodes,)*
        )))
    }
}

pub(crate) fn dom_element_inner(input: TokenStream) -> TokenStream2 {
    let nodes = match parse(input) {
        Ok(nodes) => nodes,
        Err(err) => return err.to_compile_error(),
    };

    let mut modes_dom = Vec::new();

    for node in nodes {
        let node = convert_node(&node, false);
        modes_dom.push(node);
    }

    if modes_dom.len() != 1 {
        emit_call_site_error!("This macro supports only one DomElement as root");
        return quote! {};
    }

    modes_dom.pop().unwrap_or_default()
}