rstml_component_macro/
component.rs1use proc_macro2::TokenStream;
2use proc_macro2_diagnostics::SpanDiagnosticExt;
3use quote::quote;
4use syn::{spanned::Spanned, Fields, Item};
5
6pub fn derive_html_component(input: TokenStream) -> TokenStream {
7 let full_span = input.span();
8 let input = match syn::parse2(input) {
9 Ok(Item::Struct(item_struct)) => item_struct,
10 Ok(_) => {
11 return full_span
12 .error("Derived `HtmlComponent`s must be structs")
13 .emit_as_item_tokens()
14 }
15 Err(err) => return err.into_compile_error(),
16 };
17
18 if matches!(&input.fields, Fields::Unnamed(_)) {
19 return input
20 .fields
21 .span()
22 .error("Derived `HtmlComponent`s cannot have tuple fields")
23 .emit_as_item_tokens();
24 }
25
26 let ident = &input.ident;
27 let (impl_generics, ty_generics, where_clause) = input.generics.split_for_impl();
28
29 quote! {
30 #[automatically_derived]
31 impl #impl_generics ::rstml_component::HtmlComponent for #ident #ty_generics #where_clause {
32 type Content = Self;
33
34 fn into_content(self) -> Self::Content {
35 self
36 }
37 }
38 }
39}