use proc_macro2::TokenStream;
use quote::quote;
use syn::{Error, ItemStruct};
use super::encoding;
use crate::path::HarmosPath;
pub(super) fn declare(item: &mut ItemStruct, harmos: &HarmosPath, skip_debug: bool) -> Result<TokenStream, Error> {
let mut defaultable = true;
for field in &item.fields {
let (required_message, _, _) = encoding(&field.ty, harmos)?;
if required_message {
defaultable = false;
}
}
if !skip_debug && !derives(item, "Debug") {
item.attrs.push(syn::parse_quote!(#[derive(Debug)]));
}
if defaultable && !derives(item, "Default") {
item.attrs.push(syn::parse_quote!(#[derive(Default)]));
}
Ok(quote!(#item))
}
fn derives(item: &ItemStruct, name: &str) -> bool {
item.attrs.iter().filter(|attr| attr.path().is_ident("derive")).any(|attr| {
attr.parse_args_with(syn::punctuated::Punctuated::<syn::Path, syn::Token![,]>::parse_terminated)
.is_ok_and(|paths| paths.iter().any(|path| path.segments.last().is_some_and(|part| part.ident == name)))
})
}