1extern crate proc_macro;
2
3use crate::parser::HtmlParser;
4use crate::tag::Tag;
5use syn::parse::{Parse, ParseStream, Result};
6use syn::parse_macro_input;
7
8mod parser;
9mod tag;
10
11#[proc_macro]
15pub fn html(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
16 let parsed = parse_macro_input!(input as Html);
17
18 let mut html_parser = HtmlParser::new();
19
20 let parsed_tags_len = parsed.tags.len();
21
22 for (idx, tag) in parsed.tags.iter().enumerate() {
27 let mut next_tag = None;
28
29 if parsed_tags_len - 1 > idx {
30 next_tag = Some(&parsed.tags[idx + 1])
31 }
32
33 html_parser.push_tag(tag, next_tag);
34 }
35
36 html_parser.finish().into()
37}
38
39#[derive(Debug)]
40struct Html {
41 tags: Vec<Tag>,
42}
43
44impl Parse for Html {
45 fn parse(input: ParseStream) -> Result<Self> {
46 let mut tags = Vec::new();
47
48 while !input.is_empty() {
49 let tag: Tag = input.parse()?;
50 tags.push(tag);
51 }
52
53 Ok(Html { tags })
54 }
55}