use proc_macro::{self, TokenStream};
use quote::quote;
use syn::{DeriveInput, parse_macro_input};
use crate::utils::{assert_field, crate_ref};
pub(crate) fn decorated_mock_component(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, "component");
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::style::Style;
use ratatui::text::Line;
use ratatui::prelude::Alignment;
use ratatui::widgets::{Block, Borders,BorderType, List, ListState, Widget, StatefulWidgetRef};
impl #impl_generics MockComponent for #ident #type_generics #where_clause {
fn draw(&mut self, area: Rect, buf: &mut Buffer, theme: &Theme) {
let mut block = theme.block(self.props());
let inner_area = block.inner(area);
block.render(area, buf);
self.component.draw(inner_area, buf, theme)
}
}
impl #impl_generics MockProps for #ident #type_generics #where_clause {
fn props(&self) -> Option<&Props> {
self.component.props()
}
fn props_mut(&mut self) -> Option<&mut Props> {
self.component.props_mut()
}
}
};
};
output.into()
} else {
panic!("DecoratedMockComponent must be derived by a `Struct`");
}
}