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}