scsys_derive/
lib.rs

1/*
2    Appellation: scsys-derive <library>
3    Contrib: FL03 <jo3mccain@icloud.com>
4*/
5#![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    // Parse the inputs into the proper struct
48    let ast = parse_macro_input!(input as DeriveInput);
49
50    // Build the impl
51    let res = impl_display(&ast);
52
53    res.into()
54}
55/// This macro automatically generates functional constructors for all enclosed variants.
56#[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}