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