1use crate::co::CoMacroFeature;
5use proc_macro::TokenStream;
6use std::collections::BTreeSet;
7use syn::{
8 parse::{Parse, ParseStream},
9 punctuated::Punctuated,
10 Meta, Token,
11};
12
13mod co;
14mod tagged_fields;
15
16struct CoArgs {
17 features: BTreeSet<CoMacroFeature>,
18}
19impl Parse for CoArgs {
20 fn parse(input: ParseStream) -> syn::Result<Self> {
21 let args = Punctuated::<Meta, Token![,]>::parse_terminated(input)?;
22 let mut features = BTreeSet::new();
23 for arg in &args {
24 let flag = match arg {
25 Meta::Path(path) => path.get_ident().map(|id| id.to_string()),
26 other => {
27 return Err(syn::Error::new_spanned(other, "Expected flag-style identifiers"));
28 },
29 };
30 if let Some(flag) = flag {
31 match CoMacroFeature::try_from(flag.as_str()) {
32 Ok(flag) => {
33 features.insert(flag);
34 },
35 Err(err) => {
36 return Err(err);
37 },
38 }
39 }
40 }
41 Ok(Self { features })
42 }
43}
44
45#[proc_macro_attribute]
46pub fn co(metadata: TokenStream, input: TokenStream) -> TokenStream {
47 let args = syn::parse_macro_input!(metadata as CoArgs);
49
50 co::macro_co(input, args.features)
52}
53
54#[proc_macro_derive(TaggedFields, attributes(tagged))]
63pub fn derive_tagged_fields(item: TokenStream) -> TokenStream {
64 tagged_fields::derive_tagged_fields(item)
65}