mod generate;
mod parse;
mod stringid;
mod strlookup_hashmap;
use proc_macro::TokenStream;
use strlookup_hashmap::get_strlookup_hashmap_impl;
use syn::{parse_macro_input, DeriveInput};
use crate::generate::to_tokenstream;
use crate::stringid::{get_stringid_impl, get_stringid_type};
use crate::strlookup_hashmap::{get_strlookup_type, StrLookupHashMap};
#[proc_macro_derive(StringIdImpl)]
pub fn stringid_macro_derive(input: TokenStream) -> TokenStream {
let input = parse_macro_input!(input as DeriveInput);
let name = input.ident.clone();
match get_stringid_type(&input) {
Ok(path) => {
let stringid_type = to_tokenstream(path);
let expanded = get_stringid_impl(stringid_type, name);
TokenStream::from(expanded)
}
Err(err) => err.into_compile_error().into(),
}
}
#[proc_macro_attribute]
pub fn strlookup_hashmap(attrs: TokenStream, item: TokenStream) -> TokenStream {
let input = parse_macro_input!(item as DeriveInput);
let name = input.ident.clone();
match get_strlookup_type(&input) {
Ok(()) => {}
Err(err) => return err.into_compile_error().into(),
}
let attrs = syn::parse::<StrLookupHashMap>(attrs);
match attrs {
Ok(strlookup) => {
let expanded = get_strlookup_hashmap_impl(
&name,
strlookup.key_type,
strlookup.store_type,
strlookup.hashmap_size,
);
TokenStream::from(expanded)
}
Err(err) => err.into_compile_error().into(),
}
}