polyvers_macros/lib.rs
1//! Procedural macro for the `polyvers` crate. Depend on `polyvers` instead of
2//! using this crate directly.
3
4use proc_macro::TokenStream;
5use syn::parse_macro_input;
6
7mod codegen;
8mod parse;
9mod resolve;
10
11/// Declare a versioned struct family. See the `polyvers` crate README for the
12/// full DSL and the canonical example.
13#[proc_macro]
14pub fn versioned(input: TokenStream) -> TokenStream {
15 let spec = parse_macro_input!(input as parse::VersionedSpec);
16 match resolve::resolve(spec) {
17 Ok(resolved) => codegen::generate(&resolved).into(),
18 Err(err) => err.to_compile_error().into(),
19 }
20}