use std::{borrow::Cow, fmt};
#[derive(Clone)]
pub struct Name<R>
where
R: crate::gimli::Reader<Offset = usize>,
{
name: R,
}
impl<R> Name<R>
where
R: crate::gimli::Reader<Offset = usize>,
{
pub(crate) fn from_die(
dwarf: &crate::gimli::Dwarf<R>,
unit: &crate::gimli::Unit<R, usize>,
entry: &crate::gimli::DebuggingInformationEntry<'_, '_, R>,
) -> Result<Self, crate::Error> {
let name = crate::get(entry, crate::gimli::DW_AT_name)?;
let name = dwarf.attr_string(unit, name)?;
Ok(Self { name })
}
pub(crate) fn from_die_opt(
dwarf: &crate::gimli::Dwarf<R>,
unit: &crate::gimli::Unit<R, usize>,
entry: &crate::gimli::DebuggingInformationEntry<'_, '_, R>,
) -> Result<Option<Self>, crate::Error> {
let name = crate::get_opt(entry, crate::gimli::DW_AT_name)?;
Ok(if let Some(name) = name {
let name = dwarf.attr_string(unit, name)?;
Some(Self { name })
} else {
None
})
}
pub fn to_string(&self) -> Result<Cow<'_, str>, crate::Error> {
Ok(self.name.to_string()?)
}
pub fn to_string_lossy(&self) -> Result<Cow<'_, str>, crate::Error> {
Ok(self.name.to_string_lossy()?)
}
pub fn to_slice(&self) -> Result<Cow<'_, [u8]>, crate::Error> {
Ok(self.name.to_slice()?)
}
}
impl<R> fmt::Debug for Name<R>
where
R: crate::gimli::Reader<Offset = usize>,
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
self.to_string_lossy().map_err(crate::fmt_err)?.fmt(f)
}
}
impl<R> fmt::Display for Name<R>
where
R: crate::gimli::Reader<Offset = usize>,
{
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
self.to_string_lossy().map_err(crate::fmt_err)?.fmt(f)
}
}