use super::style::Style;
#[derive(Debug)]
pub struct Fields<T> {
pub style: Style,
pub fields: Vec<T>,
}
impl<T> Fields<T> {
pub fn len(&self) -> usize {
self.fields.len()
}
pub fn is_empty(&self) -> bool {
self.fields.is_empty()
}
pub fn iter(&self) -> std::slice::Iter<'_, T> {
self.fields.iter()
}
pub(crate) fn from_syn_fields(fields: &syn::Fields) -> syn::Result<Self>
where
T: FromSynField,
{
match fields {
syn::Fields::Unit => Ok(Self {
style: Style::Unit,
fields: Vec::new(),
}),
syn::Fields::Named(named) => {
let mut vec = Vec::new();
for field in &named.named {
vec.push(T::from_syn_field(field)?);
}
Ok(Self {
style: Style::Struct,
fields: vec,
})
}
syn::Fields::Unnamed(unnamed) => {
let mut vec = Vec::new();
for field in &unnamed.unnamed {
vec.push(T::from_syn_field(field)?);
}
Ok(Self {
style: Style::Tuple,
fields: vec,
})
}
}
}
}
pub(crate) trait FromSynField: Sized {
fn from_syn_field(field: &syn::Field) -> syn::Result<Self>;
}