use crate::Error;
use super::ffi::SMBIOSBaseboardInformation;
use super::utils::{get_smbios_table, parse_smbios};
pub(crate) struct MotherboardInner {
smbios_table: Vec<u8>,
}
impl MotherboardInner {
pub(crate) fn new() -> Result<Self, Error> {
if let Some(smbios_table) = get_smbios_table() {
Ok(Self { smbios_table })
} else {
Err(Error::Other("failed to instantiate Motherboard".into()))
}
}
pub(crate) fn asset_tag(&self) -> Option<String> {
let (info, strings) = parse_smbios::<SMBIOSBaseboardInformation>(&self.smbios_table, 2)?;
if info.asset_tag == 0 {
return None;
}
strings
.get(info.asset_tag as usize - 1)
.copied()
.map(str::to_string)
}
pub(crate) fn name(&self) -> Option<String> {
let (info, strings) = parse_smbios::<SMBIOSBaseboardInformation>(&self.smbios_table, 2)?;
if info.product_name == 0 {
return None;
}
strings
.get(info.product_name as usize - 1)
.copied()
.map(str::to_string)
}
pub(crate) fn vendor_name(&self) -> Option<String> {
let (info, strings) = parse_smbios::<SMBIOSBaseboardInformation>(&self.smbios_table, 2)?;
if info.manufacturer == 0 {
return None;
}
strings
.get(info.manufacturer as usize - 1)
.copied()
.map(str::to_string)
}
pub(crate) fn version(&self) -> Option<String> {
let (info, strings) = parse_smbios::<SMBIOSBaseboardInformation>(&self.smbios_table, 2)?;
if info.version == 0 {
return None;
}
strings
.get(info.version as usize - 1)
.copied()
.map(str::to_string)
}
pub(crate) fn serial_number(&self) -> Option<String> {
let (info, strings) = parse_smbios::<SMBIOSBaseboardInformation>(&self.smbios_table, 2)?;
if info.serial_number == 0 {
return None;
}
strings
.get(info.serial_number as usize - 1)
.copied()
.map(str::to_string)
}
}