use proc_macro::TokenStream;
use std::collections::HashSet;
use std::sync::{LazyLock, Mutex};
use syn::{parse_macro_input, DeriveInput};
mod generator;
mod schema;
use crate::generator::Generator;
use crate::schema::Schema;
static TABLE_REGISTRY: LazyLock<Mutex<HashSet<u8>>> = LazyLock::new(|| Mutex::new(HashSet::new()));
#[proc_macro_derive(Record, attributes(key, index))]
pub fn derive_record(input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as DeriveInput);
let visibility = input.vis.clone();
let schema = match Schema::from_derive_input(input) {
Ok(schema) => schema,
Err(error_tokens) => return error_tokens,
};
{
let mut registry = TABLE_REGISTRY.lock().unwrap();
if let Some(external_scope) = schema.table_value {
if registry.contains(&external_scope) {
return syn::Error::new_spanned(
&schema.name,
format!(
"Duplicate table ID {}. Each table must have a unique integer identifier.",
external_scope
),
)
.to_compile_error()
.into();
}
registry.insert(external_scope);
}
}
Generator::new(schema).generate_record_impl(visibility)
}