1#![doc(
15 html_logo_url = "https://raw.githubusercontent.com/scattered-systems/.github/main/assets/logo.png",
16 html_favicon_url = "https://raw.githubusercontent.com/scattered-systems/.github/main/assets/favicon.ico"
17)]
18extern crate proc_macro;
19extern crate quote;
20extern crate syn;
21
22pub(crate) mod attrs;
23pub(crate) mod impls;
24pub(crate) mod utils;
25
26pub(crate) mod ast;
27use proc_macro::TokenStream;
28use syn::{Data, DeriveInput, parse_macro_input};
29
30#[proc_macro_derive(Display, attributes(scsys))]
31pub fn display(input: TokenStream) -> TokenStream {
32 let ast = parse_macro_input!(input as DeriveInput);
34
35 let res = impls::impl_display(&ast);
37
38 res.into()
39}
40#[proc_macro_derive(VariantConstructors, attributes(scsys))]
42pub fn variant_constructors(input: TokenStream) -> TokenStream {
43 let ast: DeriveInput = syn::parse(input).unwrap();
44
45 match ast.data {
46 Data::Enum(inner) => impls::impl_functional_constructors(&ast.ident, &inner.variants),
47 _ => panic!("This derive macro only works with enums"),
48 }
49 .into()
50}
51#[proc_macro_derive(Wrapper, attributes(scsys))]
54pub fn wrapper(input: TokenStream) -> TokenStream {
55 let ast = parse_macro_input!(input as DeriveInput);
57
58 let res = impls::impl_wrapper(&ast);
60
61 res.into()
62}
63
64#[proc_macro_derive(Getter, attributes(scsys))]
65pub fn getter_derive(input: TokenStream) -> TokenStream {
66 let input = parse_macro_input!(input as DeriveInput);
67 impls::impl_getter(&input).into()
68}
69
70#[proc_macro_derive(Set, attributes(scsys))]
71pub fn set_derive(input: TokenStream) -> TokenStream {
72 let input = parse_macro_input!(input as DeriveInput);
73 impls::impl_set(&input).into()
74}
75
76#[proc_macro_derive(With, attributes(scsys))]
77pub fn with_derive(input: TokenStream) -> TokenStream {
78 let input = parse_macro_input!(input as DeriveInput);
79 impls::impl_with(&input).into()
80}