ddd_toolkit_macro/lib.rs
1//! Derive macros for [`ddd-toolkit-core`](https://docs.rs/ddd-toolkit-core)'s
2//! value-object-shaped traits: `ValueObject`, `EntityId`, `SecretVo`, and
3//! `EnumVo`. Works alongside `ddd-toolkit-core` directly, or through the
4//! [`ddd-toolkit`](https://docs.rs/ddd-toolkit) facade - see this crate's
5//! README for the full list of supported `#[vo(...)]` attributes.
6
7mod attributes;
8mod entity_id;
9mod enum_vo;
10mod krate;
11mod secret_vo;
12mod vo;
13
14use crate::enum_vo::expand_enum_vo;
15use crate::vo::expand_value_object;
16use crate::{entity_id::expand_entity_id, secret_vo::expand_secret_vo};
17use proc_macro::TokenStream;
18use syn::{DeriveInput, parse_macro_input};
19
20/// Derives [`ValueObject`](https://docs.rs/ddd-toolkit-core/latest/ddd_toolkit_core/domain/trait.ValueObject.html)
21/// and [`Wrapped`](https://docs.rs/ddd-toolkit-core/latest/ddd_toolkit_core/domain/trait.Wrapped.html)
22/// for a single-field tuple struct. See the crate-level docs for supported
23/// `#[vo(...)]` attributes.
24#[proc_macro_derive(ValueObject, attributes(vo))]
25pub fn derive_value_object(input: TokenStream) -> TokenStream {
26 let input = parse_macro_input!(input as DeriveInput);
27 expand_value_object(&input)
28 .unwrap_or_else(syn::Error::into_compile_error)
29 .into()
30}
31
32/// Derives [`EntityId`](https://docs.rs/ddd-toolkit-core/latest/ddd_toolkit_core/domain/trait.EntityId.html)
33/// (and everything `#[derive(ValueObject)]` derives) for a single-field
34/// tuple struct.
35#[proc_macro_derive(EntityId, attributes(vo))]
36pub fn derive_entity_id(input: TokenStream) -> TokenStream {
37 let input = parse_macro_input!(input as DeriveInput);
38 expand_entity_id(&input)
39 .unwrap_or_else(syn::Error::into_compile_error)
40 .into()
41}
42
43/// Derives [`SecretVo`](https://docs.rs/ddd-toolkit-core/latest/ddd_toolkit_core/domain/trait.SecretVo.html)
44/// for a single-field tuple struct, with a `Debug` impl that always redacts
45/// the wrapped value.
46#[proc_macro_derive(SecretVo, attributes(vo))]
47pub fn derive_secret_vo(input: TokenStream) -> TokenStream {
48 let input = parse_macro_input!(input as DeriveInput);
49 expand_secret_vo(&input)
50 .unwrap_or_else(syn::Error::into_compile_error)
51 .into()
52}
53
54/// Derives [`EnumVo`](https://docs.rs/ddd-toolkit-core/latest/ddd_toolkit_core/domain/trait.EnumVo.html)
55/// for a fieldless enum.
56#[proc_macro_derive(EnumVo, attributes(vo))]
57pub fn derive_enum_vo(input: TokenStream) -> TokenStream {
58 let input = parse_macro_input!(input as DeriveInput);
59 expand_enum_vo(&input)
60 .unwrap_or_else(syn::Error::into_compile_error)
61 .into()
62}