use super::Name;
use std::fmt;
#[allow(non_camel_case_types)]
#[derive(Clone)]
pub struct Struct<'dwarf, R: crate::gimli::Reader<Offset = usize>>
where
R: crate::gimli::Reader<Offset = usize>,
{
dwarf: &'dwarf crate::gimli::Dwarf<R>,
unit: &'dwarf crate::gimli::Unit<R, usize>,
entry: crate::gimli::DebuggingInformationEntry<'dwarf, 'dwarf, R>,
}
impl<'dwarf, R> Struct<'dwarf, R>
where
R: crate::gimli::Reader<Offset = usize>,
{
pub(crate) fn from_dw_tag_structure_type(
dwarf: &'dwarf crate::gimli::Dwarf<R>,
unit: &'dwarf crate::gimli::Unit<R, usize>,
entry: crate::gimli::DebuggingInformationEntry<'dwarf, 'dwarf, R>,
) -> Result<Self, crate::Error> {
crate::check_tag(&entry, crate::gimli::DW_TAG_structure_type)?;
Ok(Self { dwarf, unit, entry })
}
#[allow(dead_code)]
pub(crate) fn dwarf(&self) -> &'dwarf crate::gimli::Dwarf<R> {
self.dwarf
}
#[allow(dead_code)]
pub(crate) fn unit(&self) -> &crate::gimli::Unit<R, usize> {
self.unit
}
#[allow(dead_code)]
pub(crate) fn entry(&self) -> &crate::gimli::DebuggingInformationEntry<'dwarf, 'dwarf, R> {
&self.entry
}
pub fn name(&self) -> Result<Name<R>, crate::Error> {
Name::from_die(self.dwarf(), self.unit(), self.entry())
}
pub fn size(&self) -> Result<u64, crate::Error> {
crate::get_size(self.entry())
}
pub fn align(&self) -> Result<Option<u64>, crate::Error> {
crate::get_align(self.entry())
}
pub fn fields(&self) -> Result<super::Fields<'dwarf, R>, crate::Error> {
let tree = self.unit.entries_tree(Some(self.entry.offset()))?;
Ok(super::Fields::from_tree(self.dwarf, self.unit, tree))
}
}
impl<'dwarf, R> fmt::Debug for Struct<'dwarf, R>
where
R: crate::gimli::Reader<Offset = usize>,
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let mut debug_tuple = f.debug_tuple("deflect::schema::Struct");
debug_tuple.field(&crate::debug::DebugEntry::new(
self.dwarf,
self.unit,
&self.entry,
));
debug_tuple.finish()
}
}
impl<'dwarf, R> fmt::Display for Struct<'dwarf, R>
where
R: crate::gimli::Reader<Offset = usize>,
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let type_name = self.name().map_err(crate::fmt_err)?;
let type_name = type_name.to_string_lossy().map_err(crate::fmt_err)?;
let mut debug_struct = f.debug_struct(&type_name);
let mut fields = self.fields().map_err(crate::fmt_err)?;
let mut fields = fields.iter().map_err(crate::fmt_err)?;
while let Some(field) = fields.try_next().map_err(crate::fmt_err)? {
let field_name = field.name().map_err(crate::fmt_err)?;
let field_name = field_name.to_string_lossy().map_err(crate::fmt_err)?;
let field_type = field.r#type().map_err(crate::fmt_err)?;
debug_struct.field(&field_name, &crate::DebugDisplay(field_type));
}
debug_struct.finish()
}
}