use crate::{fields::*, *};
pub struct StructWithNamedFields {
pub attributes: Vec<Attribute>,
pub visibility: Visibility,
pub ident: Ident,
pub generics: Generics,
pub fields: Vec<NamedField>,
}
impl StructWithNamedFields {
pub fn new(input: syn::DeriveInput) -> Self {
let mut fields: Vec<NamedField> = Vec::new();
if let syn::Data::Struct(new_input) = input.data {
if let syn::Fields::Named(named_fields) = new_input.fields {
for named_field in named_fields.named.into_iter() {
fields.push(NamedField::new(named_field));
}
} else {
panic!("Only structs with named fields may be parsed into StructWithNamedFields");
}
} else {
panic!("Only structs may be parsed into StructWithNamedFields");
}
Self {
attributes: input.attrs,
visibility: input.vis,
ident: input.ident,
generics: input.generics,
fields,
}
}
}
pub struct StructWithUnnamedFields {
pub attributes: Vec<Attribute>,
pub visibility: Visibility,
pub ident: Ident,
pub generics: Generics,
pub fields: Vec<UnnamedField>,
}
impl StructWithUnnamedFields {
pub fn new(input: syn::DeriveInput) -> Self {
let mut fields: Vec<UnnamedField> = Vec::new();
if let syn::Data::Struct(new_input) = input.data {
let possibly_unnamed_fields = new_input.fields;
if let syn::Fields::Unnamed(unnamed_fields) = possibly_unnamed_fields {
for field in unnamed_fields.unnamed {
fields.push(UnnamedField::new(field));
}
} else {
panic!(
"Only structs with unnamed fields may be parsed into StructWithUnnamedFields"
);
}
} else {
panic!("Only structs may be parsed into StructWithUnnamedFields");
}
Self {
attributes: input.attrs,
visibility: input.vis,
ident: input.ident,
generics: input.generics,
fields,
}
}
}
pub struct UnitStruct {
pub attributes: Vec<Attribute>,
pub visibility: Visibility,
pub ident: Ident,
pub generics: Generics,
}
impl UnitStruct {
pub fn new(input: syn::DeriveInput) -> Self {
Self {
attributes: input.attrs,
visibility: input.vis,
ident: input.ident,
generics: input.generics,
}
}
}