Skip to main content

co_macros/
lib.rs

1// SPDX-License-Identifier: AGPL-3.0-only
2// Copyright (C) 2026 1io BRANDGUARDIAN GmbH
3
4use 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	// flags
48	let args = syn::parse_macro_input!(metadata as CoArgs);
49
50	// generate
51	co::macro_co(input, args.features)
52}
53
54/**
55 * Attribute usage:
56 * #[tagged(<tag>)]
57 * Currently options for tag consist of:
58 * - external
59 *
60 * More may be added in the future
61 */
62#[proc_macro_derive(TaggedFields, attributes(tagged))]
63pub fn derive_tagged_fields(item: TokenStream) -> TokenStream {
64	tagged_fields::derive_tagged_fields(item)
65}