use super::{
field_config::FieldConfig,
BitfieldStruct,
Config,
};
pub struct FieldInfo<'a> {
pub index: usize,
pub field: &'a syn::Field,
pub config: FieldConfig,
}
impl<'a> FieldInfo<'a> {
pub fn new(id: usize, field: &'a syn::Field, config: FieldConfig) -> Self {
Self {
index: id,
field,
config,
}
}
pub fn ident_frag(&self) -> &dyn quote::IdentFragment {
match &self.field.ident {
Some(ident) => ident,
None => &self.index,
}
}
pub fn name(&self) -> String {
Self::ident_as_string(self.field, self.index)
}
pub fn ident_as_string(field: &'a syn::Field, index: usize) -> String {
field
.ident
.as_ref()
.map(ToString::to_string)
.unwrap_or_else(|| format!("{}", index))
}
}
impl BitfieldStruct {
pub fn fields(
item_struct: &syn::ItemStruct,
) -> impl Iterator<Item = (usize, &syn::Field)> {
item_struct
.fields
.iter()
.enumerate()
.map(|(n, field)| (n, field))
}
pub fn field_infos<'a, 'b: 'a>(
&'a self,
config: &'b Config,
) -> impl Iterator<Item = FieldInfo<'a>> {
Self::fields(&self.item_struct).map(move |(n, field)| {
let field_config = config
.field_configs
.get(&n)
.map(|config| &config.value)
.cloned()
.unwrap_or_default();
FieldInfo::new(n, field, field_config)
})
}
}