use proc_macro2::TokenStream;
use quote::quote;
use syn::{Data, DeriveInput, Fields};
pub(crate) fn derive(input: DeriveInput) -> syn::Result<TokenStream> {
match &input.data {
Data::Struct(data) => match &data.fields {
Fields::Named(_) | Fields::Unnamed(_) => {}
Fields::Unit => {
return Err(syn::Error::new_spanned(
&input.ident,
"WhiteChannel cannot be derived for unit structs (no channels)",
));
}
},
Data::Enum(_) => {
return Err(syn::Error::new_spanned(
&input.ident,
"WhiteChannel can only be derived for structs, not enums",
));
}
Data::Union(_) => {
return Err(syn::Error::new_spanned(
&input.ident,
"WhiteChannel can only be derived for structs, not unions",
));
}
}
let name = &input.ident;
let (impl_generics, ty_generics, where_clause) = input.generics.split_for_impl();
let expanded = quote! {
impl #impl_generics ::fovea::pixel::WhiteChannel for #name #ty_generics #where_clause {
#[inline(always)]
fn white_channel() -> <Self as ::fovea::pixel::HomogeneousPixel>::Channel {
<
<Self as ::fovea::pixel::HomogeneousPixel>::Channel
as ::fovea::pixel::BoundedChannel
>::MAX
}
}
};
Ok(expanded)
}