measured_derive/
lib.rs

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}