Skip to main content

csskit_derives/
lib.rs

1#![deny(warnings)]
2use proc_macro::TokenStream;
3use syn::{DeriveInput, Generics, Result, parse_quote};
4
5mod attributes;
6mod css_feature;
7mod darling_ext;
8mod declaration_metadata;
9mod field_view;
10mod into_cursor;
11mod node_with_metadata;
12mod parse;
13mod peek;
14mod semantic_eq;
15mod to_cursors;
16mod to_span;
17mod visitable;
18mod where_collector;
19
20use field_view::FieldsExt;
21use where_collector::WhereCollector;
22
23fn ensure_lifetime_a(generics: &Generics) -> Generics {
24	let mut g = generics.clone();
25	if generics.lifetimes().all(|l| l.lifetime.ident != "a") {
26		g.params.insert(0, parse_quote!('a));
27	}
28	g
29}
30
31#[cfg(test)]
32mod test;
33
34fn run<F>(stream: TokenStream, f: F) -> TokenStream
35where
36	F: FnOnce(DeriveInput) -> Result<proc_macro2::TokenStream>,
37{
38	let input = syn::parse::<DeriveInput>(stream).unwrap_or_else(|e| panic!("{e}"));
39	f(input).unwrap_or_else(|e| e.into_compile_error()).into()
40}
41
42#[proc_macro_derive(ToCursors, attributes(to_cursors))]
43pub fn derive_to_cursors(stream: TokenStream) -> TokenStream {
44	run(stream, to_cursors::derive)
45}
46
47#[proc_macro_derive(Parse, attributes(parse, atom))]
48pub fn derive_parse(stream: TokenStream) -> TokenStream {
49	run(stream, parse::derive)
50}
51
52#[proc_macro_derive(Peek, attributes(peek, atom))]
53pub fn derive_peek(stream: TokenStream) -> TokenStream {
54	run(stream, peek::derive)
55}
56
57#[proc_macro_derive(IntoCursor)]
58pub fn derive_into_cursor(stream: TokenStream) -> TokenStream {
59	run(stream, into_cursor::derive)
60}
61
62#[proc_macro_derive(ToSpan)]
63pub fn derive_into_span(stream: TokenStream) -> TokenStream {
64	run(stream, to_span::derive)
65}
66
67#[proc_macro_derive(Visitable, attributes(visit, queryable))]
68pub fn derive_visitable(stream: TokenStream) -> TokenStream {
69	run(stream, visitable::derive)
70}
71
72#[proc_macro_derive(NodeWithMetadata, attributes(metadata))]
73pub fn derive_node_with_metadata(stream: TokenStream) -> TokenStream {
74	run(stream, node_with_metadata::derive)
75}
76
77#[proc_macro_derive(ToCSSFeature, attributes(css_feature))]
78pub fn derive_css_feature(stream: TokenStream) -> TokenStream {
79	run(stream, css_feature::derive)
80}
81
82#[proc_macro_derive(DeclarationMetadata, attributes(declaration_metadata))]
83pub fn derive_declaration_metadata(stream: TokenStream) -> TokenStream {
84	run(stream, declaration_metadata::derive)
85}
86
87#[proc_macro_derive(SemanticEq, attributes(semantic_eq))]
88pub fn derive_semantic_eq(stream: TokenStream) -> TokenStream {
89	run(stream, semantic_eq::derive)
90}