rstml_component_macro/
component.rs

1use 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}