use ::std::os::raw::{c_char, c_uint};
use serde_derive::{Deserialize, Serialize};
use crate::error::{Error, Result};
pub const ACPI_EVENT_FAMILY_NAME: &str = "acpi_event";
pub const ACPI_EVENT_MCAST_GROUP_NAME: &str = "acpi_mc_group";
#[repr(u16)]
#[allow(unused)]
pub enum AcpiAttrType {
Unspecified = 0,
Event = 1,
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
#[allow(non_camel_case_types)]
pub struct acpi_genl_event {
device_class: [c_char; 20usize],
bus_id: [c_char; 15usize],
r#type: c_uint,
data: c_uint,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AcpiGenericNetlinkEvent {
pub device_class: String,
pub bus_id: String,
pub r#type: u32,
pub data: u32,
}
impl AcpiGenericNetlinkEvent {
pub const DEVICE_CLASS_BATTERY: &str = "battery";
pub const DEVICE_CLASS_AC: &str = "ac_adapter";
pub const DEVICE_CLASS_PROCESSOR: &str = "processor";
}
fn get_u8_bytes(slice: &[c_char]) -> Result<Vec<u8>> {
slice
.into_iter()
.take_while(|c| **c != 0)
.map(|c| -> Result<u8> {
if *c < 0 {
Err(format!("slice contained signed char: {}", c).into())
} else {
Ok(*c as u8)
}
})
.collect::<Result<Vec<_>>>()
}
impl<'a> TryFrom<&'a acpi_genl_event> for AcpiGenericNetlinkEvent {
type Error = Error;
fn try_from(value: &'a acpi_genl_event) -> std::result::Result<Self, Self::Error> {
Ok(AcpiGenericNetlinkEvent {
device_class: String::from_utf8(get_u8_bytes(&value.device_class)?)?,
bus_id: String::from_utf8(get_u8_bytes(&value.bus_id)?)?,
r#type: value.r#type,
data: value.data,
})
}
}