use syn::ItemStruct;
use crate::parsing::util::attr::AttributeCheck;
use crate::models::TusksParameters;
impl TusksParameters {
pub fn from_struct(item_struct: ItemStruct) -> syn::Result<Option<Self>> {
if item_struct.ident != "Parameters" {
return Ok(None);
}
if item_struct.has_attr("skip") {
return Ok(None);
}
if !matches!(item_struct.vis, syn::Visibility::Public(_)) {
return Err(syn::Error::new_spanned(
&item_struct.ident,
"Parameters struct must be public"
));
}
for field in &item_struct.fields {
if let Some(field_name) = &field.ident {
if field_name == "super_" {
return Err(syn::Error::new_spanned(
field_name,
"super_ field is not allowed in Parameters struct. \
It will be added programmatically."
));
}
}
if !Self::is_reference_type(&field.ty) {
return Err(syn::Error::new_spanned(
&field.ty,
"all fields in Parameters struct must be & references"
));
}
}
Ok(Some(TusksParameters {
pstruct: item_struct,
}))
}
fn is_reference_type(ty: &syn::Type) -> bool {
matches!(ty, syn::Type::Reference(_))
}
}