1#[macro_use]
2extern crate darling;
3extern crate proc_macro2;
4extern crate quote;
5extern crate syn;
6
7use proc_macro::TokenStream;
8
9use darling::util::Flag;
10use syn::{Data, DeriveInput, Expr, ExprPath, LitStr, parse_macro_input};
11
12#[proc_macro_attribute]
22pub fn armour_metrics(attr: TokenStream, item: TokenStream) -> TokenStream {
23 metrics::armour_metrics_impl(attr, item)
24}
25
26mod crate_path;
27mod enum_parse;
28mod metrics;
29mod rapira_field_attrs;
30mod struct_parse;
31
32#[proc_macro_derive(GetType, attributes(get_type))]
37pub fn derive_get_type(stream: TokenStream) -> TokenStream {
38 let ast = parse_macro_input!(stream as DeriveInput);
39 if !ast.generics.params.is_empty() {
40 return syn::Error::new_spanned(
41 &ast.generics,
42 "#[derive(GetType)] does not support generic types",
43 )
44 .to_compile_error()
45 .into();
46 }
47 let name = ast.ident;
48 let data = &ast.data;
49 let path = crate_path::schema_crate_path();
50
51 match data {
52 Data::Struct(data_struct) => struct_parse::parse(data_struct, name, &path).into(),
53 Data::Enum(data_enum) => enum_parse::parse(data_enum, name, &path),
54 Data::Union(_) => {
55 panic!(
56 "unions not supported, but Rust enums is implemented GetType trait (use Enums instead)"
57 )
58 }
59 }
60}
61
62#[derive(FromMeta, Debug)]
63struct CustomField {
64 name: LitStr,
65 types: Expr,
66}
67
68#[derive(Default, FromField, Debug)]
69#[darling(attributes(get_type))]
70pub(crate) struct FieldAttr {
71 pub(crate) with_type: Option<ExprPath>,
72 pub(crate) unimplemented: Flag,
73 pub(crate) custom: Option<CustomField>,
74 pub(crate) flatten: Flag,
75}