annotation_rs_codegen/
lib.rs

1extern crate proc_macro;
2
3use proc_macro::TokenStream;
4use syn::{parse_macro_input, DeriveInput};
5
6mod field;
7mod ty;
8
9mod attribute;
10use attribute::Annotation;
11
12mod enum_value;
13use crate::reader::{GetAnnotationParam, ReaderConfig};
14use enum_value::EnumValue;
15
16mod reader;
17
18#[proc_macro_derive(AnnotationEnumValue, attributes(variant_value, mod_path))]
19pub fn derive_enum_value(input: TokenStream) -> TokenStream {
20    let input = parse_macro_input!(input as DeriveInput);
21
22    let enum_value = EnumValue::from_ast(&input);
23
24    TokenStream::from(match enum_value {
25        Ok(value) => value.get_implement(),
26        Err(e) => e.to_compile_error(),
27    })
28}
29
30#[proc_macro_derive(Annotation, attributes(field, mod_path))]
31pub fn derive_attribute(input: TokenStream) -> TokenStream {
32    let input = parse_macro_input!(input as DeriveInput);
33
34    let attribute = Annotation::from_ast(&input);
35
36    TokenStream::from(match attribute {
37        Ok(value) => value.get_implement(),
38        Err(e) => e.to_compile_error(),
39    })
40}
41
42#[proc_macro]
43pub fn generate_reader(input: TokenStream) -> TokenStream {
44    let config = parse_macro_input!(input as ReaderConfig);
45    TokenStream::from(config.get_reader())
46}
47
48#[proc_macro]
49pub fn __get_annotation(input: TokenStream) -> TokenStream {
50    let config = parse_macro_input!(input as GetAnnotationParam);
51    TokenStream::from(config.get_annotation())
52}
53
54#[proc_macro]
55pub fn __has_annotation(input: TokenStream) -> TokenStream {
56    let config = parse_macro_input!(input as GetAnnotationParam);
57    TokenStream::from(config.has_annotation())
58}