line_protocol_derive/
lib.rs1pub(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}