ez-tui-derive 0.0.3-alpha

A framework to create terminal user interfaces in Rust with Ratatui
Documentation
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"),
    }
}