use proc_macro2::{Ident, TokenStream};
use quote::quote;
use syn::{DataStruct, FieldsNamed};
use proc_macro_crate::FoundCrate;
pub(crate) fn crate_ref() -> TokenStream {
match proc_macro_crate::crate_name("ez-tui") {
Ok(FoundCrate::Itself) => quote!(crate),
Ok(FoundCrate::Name(name)) => {
let ident = Ident::new(&name, proc_macro2::Span::call_site());
quote!(#ident)
}
Err(err) => panic!("`ez_tui_lib` crate not found in macro context {err}"),
}
}
pub(crate) fn assert_field(ident: &Ident, s: DataStruct, name: &str) {
match s.fields {
syn::Fields::Named(FieldsNamed { named, .. }) => {
if !named
.iter()
.any(|x| x.ident.as_ref().is_some_and(|i| i == name))
{
panic!("`{name}` not found for struct '{ident}'");
}
}
_ => panic!("struct {ident} does not contain named fields"),
}
}