serde_evolve_macros/
lib.rs

1//! Procedural macros for the `serde-evolve` crate.
2//!
3//! This crate provides the `Versioned` derive macro for generating versioned type
4//! conversions and serialization/deserialization implementations.
5
6#![allow(clippy::option_if_let_else)] // `darling` expands field defaults into if-let/else; suppress noisy lint.
7
8mod emit;
9mod parse;
10mod validate;
11
12use proc_macro::TokenStream;
13use syn::{DeriveInput, parse_macro_input};
14
15/// Derive macro for versioned data structures.
16///
17/// See the `serde-evolve` crate documentation for usage examples.
18#[proc_macro_derive(Versioned, attributes(versioned))]
19pub fn derive_versioned(input: TokenStream) -> TokenStream {
20    let input = parse_macro_input!(input as DeriveInput);
21
22    match parse::parse_input(&input) {
23        Ok(parsed) => match validate::validate(parsed) {
24            Ok(validated) => emit::generate(&validated).into(),
25            Err(err) => err.to_compile_error().into(),
26        },
27        Err(err) => err.write_errors().into(),
28    }
29}