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))]
69pub fn display(input: TokenStream) -> TokenStream {
70 let ast = parse_macro_input!(input as DeriveInput);
72
73 let res = impls::impl_display(&ast);
75
76 res.into()
77}
78#[proc_macro_derive(VariantConstructors, attributes(scsys))]
80pub fn variant_constructors(input: TokenStream) -> TokenStream {
81 let ast: DeriveInput = syn::parse(input).unwrap();
82
83 match ast.data {
84 Data::Enum(inner) => impls::impl_functional_constructors(&ast.ident, &inner.variants),
85 _ => panic!("This derive macro only works with enums"),
86 }
87 .into()
88}
89#[proc_macro_derive(Wrapper, attributes(scsys))]
92pub fn wrapper(input: TokenStream) -> TokenStream {
93 let ast = parse_macro_input!(input as DeriveInput);
95
96 let res = impls::impl_wrapper(&ast);
98
99 res.into()
100}
101
102#[proc_macro_derive(Getter, attributes(scsys))]
103pub fn derive_getter(input: TokenStream) -> TokenStream {
104 let input = parse_macro_input!(input as DeriveInput);
105
106 let get = impls::impl_getter(&input);
107 let get_mut = impls::impl_getter_mut(&input);
108
109 let merged = quote::quote! {
110 #get
111 #get_mut
112 };
113
114 merged.into()
115}
116
117#[proc_macro_derive(Get, attributes(scsys))]
118pub fn derive_get(input: TokenStream) -> TokenStream {
119 let input = parse_macro_input!(input as DeriveInput);
120 impls::impl_getter(&input).into()
121}
122
123#[proc_macro_derive(GetMut, attributes(scsys))]
124pub fn derive_get_mut(input: TokenStream) -> TokenStream {
125 let input = parse_macro_input!(input as DeriveInput);
126 impls::impl_getter_mut(&input).into()
127}
128
129#[proc_macro_derive(Set, attributes(scsys))]
130pub fn derive_set(input: TokenStream) -> TokenStream {
131 let input = parse_macro_input!(input as DeriveInput);
132 impls::impl_set(&input).into()
133}
134
135#[proc_macro_derive(With, attributes(scsys))]
136pub fn derive_with(input: TokenStream) -> TokenStream {
137 let input = parse_macro_input!(input as DeriveInput);
138 impls::impl_with(&input).into()
139}