hypertext_macros/
lib.rs

1#![allow(missing_docs, clippy::large_enum_variant)]
2#![cfg_attr(docsrs, feature(doc_auto_cfg))]
3
4use proc_macro2::{Ident, Span};
5use proc_macro2_diagnostics::Diagnostic;
6use quote::quote;
7
8mod generate;
9mod maud;
10mod rsx;
11
12#[proc_macro]
13pub fn maud(tokens: proc_macro::TokenStream) -> proc_macro::TokenStream {
14    let len_estimate = tokens.to_string().len();
15
16    maud::parse(tokens.into())
17        .map_or_else(
18            |err| err.to_compile_error(),
19            |markup| generate::normal(markup, len_estimate, false),
20        )
21        .into()
22}
23
24#[proc_macro]
25pub fn maud_move(tokens: proc_macro::TokenStream) -> proc_macro::TokenStream {
26    let len_estimate = tokens.to_string().len();
27
28    maud::parse(tokens.into())
29        .map_or_else(
30            |err| err.to_compile_error(),
31            |markup| generate::normal(markup, len_estimate, true),
32        )
33        .into()
34}
35
36#[proc_macro]
37pub fn maud_static(tokens: proc_macro::TokenStream) -> proc_macro::TokenStream {
38    let output_ident = Ident::new("hypertext_output", Span::mixed_site());
39
40    maud::parse(tokens.into())
41        .map_or_else(
42            |err| err.to_compile_error(),
43            |markup| generate::r#static(output_ident, markup),
44        )
45        .into()
46}
47
48#[proc_macro]
49pub fn rsx(tokens: proc_macro::TokenStream) -> proc_macro::TokenStream {
50    let len_estimate = tokens.to_string().len();
51
52    let (nodes, diagnostics) = rsx::parse(tokens.into());
53    let output = generate::normal(nodes, len_estimate, false);
54    let diagnostics = diagnostics.into_iter().map(Diagnostic::emit_as_expr_tokens);
55
56    quote! {
57        {
58            #(#diagnostics;)*
59            #output
60        }
61    }
62    .into()
63}
64
65#[proc_macro]
66pub fn rsx_move(tokens: proc_macro::TokenStream) -> proc_macro::TokenStream {
67    let len_estimate = tokens.to_string().len();
68
69    let (nodes, diagnostics) = rsx::parse(tokens.into());
70    let output = generate::normal(nodes, len_estimate, true);
71    let diagnostics = diagnostics.into_iter().map(Diagnostic::emit_as_expr_tokens);
72
73    quote! {
74        {
75            #(#diagnostics;)*
76            #output
77        }
78    }
79    .into()
80}
81
82#[proc_macro]
83pub fn rsx_static(tokens: proc_macro::TokenStream) -> proc_macro::TokenStream {
84    let output_ident = Ident::new("hypertext_output", Span::mixed_site());
85
86    let (nodes, diagnostics) = rsx::parse(tokens.into());
87    let output = generate::r#static(output_ident, nodes);
88    let diagnostics = diagnostics.into_iter().map(Diagnostic::emit_as_expr_tokens);
89
90    quote! {
91        {
92            #(#diagnostics;)*
93            #output
94        }
95    }
96    .into()
97}