kobold_macros 0.4.1

Macros for Kobold
Documentation
use proc_macro::TokenStream;

use crate::dom::{Component, Property};
use crate::gen::{DomNode, Field, Generator, IntoGenerator, TokenStreamExt};
use crate::tokenize::prelude::*;

impl Component {
    fn into_expression(self) -> TokenStream {
        let mut stream = self.path;

        if let Some(generics) = self.generics {
            stream.write(("::", generics));
        }

        let mut props = None;

        for Property { name, expr } in self.props {
            let props = props.get_or_insert_with(TokenStream::new);

            props.write((name, ':', expr.stream, ','));
        }

        if let Some(spread) = self.spread {
            let props = props.get_or_insert_with(TokenStream::new);

            props.write(("..", spread.stream));
        }

        if let Some(props) = props {
            stream.write(block(props));
        }

        if let Some(children) = self.children {
            let children = crate::gen::generate(children);

            stream.write(call(".render_with", children));
        } else {
            stream.write(".render()");
        }

        stream
    }
}

impl IntoGenerator for Component {
    fn into_gen(self, gen: &mut Generator) -> DomNode {
        let name = gen.names.next();
        let value = self.into_expression();

        gen.out.fields.push(Field::Html { name, value });

        DomNode::Variable(name)
    }
}