1use quote::ToTokens;
2use syn::{DeriveInput, parse_macro_input};
3
4mod label_group;
5mod metric_group;
6mod value;
7
8#[proc_macro_derive(FixedCardinalityLabel, attributes(label))]
9pub fn derive_label(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
10 match value::FixedCardinalityLabel::try_from(parse_macro_input!(input as DeriveInput)) {
11 Ok(output) => output.to_token_stream(),
12 Err(err) => err.into_compile_error().into_token_stream(),
13 }
14 .into()
15}
16
17#[proc_macro_derive(LabelGroup, attributes(label))]
18pub fn derive_label_group(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
19 match label_group::LabelGroup::try_from(parse_macro_input!(input as DeriveInput)) {
20 Ok(output) => output.to_token_stream(),
21 Err(err) => err.into_compile_error().into_token_stream(),
22 }
23 .into()
24}
25
26#[proc_macro_derive(MetricGroup, attributes(metric))]
27pub fn derive_metric_group(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
28 match metric_group::MetricGroup::try_from(parse_macro_input!(input as DeriveInput)) {
29 Ok(output) => output.to_token_stream(),
30 Err(err) => err.into_compile_error().into_token_stream(),
31 }
32 .into()
33}
34
35const CRATE: &str = "measured";
36struct Krate(pub syn::Path);
37
38impl Default for Krate {
39 fn default() -> Self {
40 Self(syn::Path {
41 leading_colon: Some(Default::default()),
42 segments: [syn::PathSegment::from(syn::Ident::new(
43 CRATE,
44 proc_macro2::Span::call_site(),
45 ))]
46 .into_iter()
47 .collect(),
48 })
49 }
50}