use proc_macro::{self, TokenStream};
use quote::quote;
use syn::{DeriveInput, parse_macro_input};
use crate::utils::{assert_field, crate_ref};
pub(crate) fn mock_props(input: TokenStream) -> TokenStream {
let DeriveInput {
ident,
generics,
data,
..
} = parse_macro_input!(input);
let crate_name = crate_ref();
if let syn::Data::Struct(s) = data {
assert_field(&ident, s, "props");
let (impl_generics, type_generics, where_clause) = generics.split_for_impl();
let output = quote! {
const _: () = {
use #crate_name::*;
use ratatui::layout::Rect;
use ratatui::buffer::Buffer;
use ratatui::widgets::{Block, List, ListState, StatefulWidgetRef};
impl #impl_generics MockProps for #ident #type_generics #where_clause {
fn props(&self) -> Option<& Props> {
Some(&self.props)
}
fn props_mut(&mut self) -> Option<&mut Props> {
Some(&mut self.props)
}
}
};
};
output.into()
} else {
panic!("MockComponent must be derived by a `Struct`");
}
}