annotation_rs_codegen/
lib.rs1extern 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}