1extern crate proc_macro;
6extern crate quote;
7extern crate syn;
8
9pub(crate) mod attrs;
10pub(crate) mod utils;
11
12pub(crate) mod display;
13pub(crate) mod getter;
14pub(crate) mod params;
15pub(crate) mod variants;
16
17use proc_macro::TokenStream;
18use syn::{Data, DeriveInput, parse_macro_input};
19
20#[proc_macro_derive(Display, attributes(scsys))]
21pub fn display(input: TokenStream) -> TokenStream {
22 let ast = parse_macro_input!(input as DeriveInput);
24
25 let res = display::impl_display(&ast);
27
28 res.into()
29}
30#[proc_macro_derive(VariantConstructors, attributes(scsys))]
32pub fn variant_constructors(input: TokenStream) -> TokenStream {
33 let ast: DeriveInput = syn::parse(input).unwrap();
34
35 match ast.data {
36 Data::Enum(inner) => variants::impl_functional_constructors(&ast.ident, &inner.variants),
37 _ => panic!("This derive macro only works with enums"),
38 }
39 .into()
40}
41
42#[proc_macro_derive(Getter)]
43pub fn getter_derive(input: TokenStream) -> TokenStream {
44 let input = parse_macro_input!(input as DeriveInput);
45 getter::impl_getter(&input).into()
46}
47
48#[proc_macro_derive(Set)]
49pub fn set_derive(input: TokenStream) -> TokenStream {
50 let input = parse_macro_input!(input as DeriveInput);
51 getter::impl_set(&input).into()
52}
53
54#[proc_macro_derive(With)]
55pub fn with_derive(input: TokenStream) -> TokenStream {
56 let input = parse_macro_input!(input as DeriveInput);
57 getter::impl_with(&input).into()
58}