Skip to main content

line_protocol_derive/
lib.rs

1pub(crate) mod line_protocol_struct;
2pub(crate) mod line_protocol_tag_enum;
3
4use proc_macro::TokenStream;
5use syn::Data;
6use syn::spanned::Spanned;
7use syn::{DeriveInput, Error, parse_macro_input};
8
9fn generate_line_protocol(input: DeriveInput) -> Result<proc_macro2::TokenStream, Error> {
10    use crate::line_protocol_struct::parser::StructSettings;
11
12    match input.data {
13        Data::Struct(data) => Ok(StructSettings::new(&input.ident, &data, &input.attrs)?
14            .generator()?
15            .tokenstream()),
16        Data::Enum(_) => Err(Error::new(
17            input.span(),
18            "#[derive(LineProtocol)] doesn't support enum types",
19        )),
20        Data::Union(_) => Err(Error::new(
21            input.span(),
22            "#[derive(LineProtocol)] doesn't support union types",
23        )),
24    }
25}
26
27fn generate_line_protocol_tag(input: DeriveInput) -> Result<proc_macro2::TokenStream, Error> {
28    use crate::line_protocol_tag_enum::parser::EnumSettings;
29
30    match input.data {
31        Data::Struct(_) => Err(Error::new(
32            input.span(),
33            "#[derive(LineProtocolTag)] doesn't support struct types",
34        )),
35        Data::Enum(data) => Ok(EnumSettings::new(&input.ident, &data, &input.attrs)?
36            .generator()
37            .tokenstream()),
38        Data::Union(_) => Err(Error::new(
39            input.span(),
40            "#[derive(LineProtocolTag)] doesn't support union types",
41        )),
42    }
43}
44
45#[proc_macro_derive(LineProtocol, attributes(line_protocol))]
46pub fn line_protocol(input: TokenStream) -> TokenStream {
47    let input = parse_macro_input!(input as DeriveInput);
48
49    generate_line_protocol(input)
50        .unwrap_or_else(Error::into_compile_error)
51        .into()
52}
53
54#[proc_macro_derive(LineProtocolTag, attributes(line_protocol))]
55pub fn line_protocol_tag(input: TokenStream) -> TokenStream {
56    let input = parse_macro_input!(input as DeriveInput);
57
58    generate_line_protocol_tag(input)
59        .unwrap_or_else(Error::into_compile_error)
60        .into()
61}