aboutsummaryrefslogtreecommitdiff
path: root/mingling_macros/src/derive/structural_data.rs
blob: acb2f28b684489508120715b4973aa2a7482f042 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
use proc_macro::TokenStream;
use quote::quote;
use syn::{DeriveInput, parse_macro_input};

use crate::get_global_set;

/// Derive macro for `StructuralData`.
pub(crate) fn derive_structural_data(input: TokenStream) -> TokenStream {
    let input = parse_macro_input!(input as DeriveInput);
    let type_name = input.ident;

    // Register in STRUCTURED_TYPES
    let type_name_str = type_name.to_string();
    get_global_set(&crate::STRUCTURED_TYPES)
        .lock()
        .unwrap()
        .insert(type_name_str);

    // Generate BOTH the sealed impl AND the StructuralData impl.
    let expanded = quote! {
        impl ::mingling::__private::StructuralDataSealed<crate::ThisProgram> for #type_name {}
        impl ::mingling::__private::StructuralData<crate::ThisProgram> for #type_name {}
    };

    expanded.into()
}