use crate::oem::hpe::schema::hpei_lo_service_ext::HpeiLoServiceExt as HpeiLoServiceExtSchema;
use crate::schema::service_root::ServiceRoot as ServiceRootSchema;
use crate::Error;
use nv_redfish_core::Bmc;
use std::marker::PhantomData;
use std::sync::Arc;
pub struct HpeiLoServiceExt<B: Bmc> {
data: Arc<HpeiLoServiceExtSchema>,
_bmc: PhantomData<B>,
}
impl<B: Bmc> HpeiLoServiceExt<B> {
pub(crate) fn new(manager: &ServiceRootSchema) -> Result<Option<Self>, Error<B>> {
if let Some(oem) = manager
.base
.base
.oem
.as_ref()
.and_then(|oem| oem.additional_properties.get("Hpe"))
{
let data = Arc::new(serde_json::from_value(oem.clone()).map_err(Error::Json)?);
Ok(Some(Self {
data,
_bmc: PhantomData,
}))
} else {
Ok(None)
}
}
#[must_use]
pub fn raw(&self) -> Arc<HpeiLoServiceExtSchema> {
self.data.clone()
}
#[must_use]
pub fn manager_type(&self) -> Option<ManagerType<'_>> {
self.data.manager.iter().flatten().find_map(|v| {
v.manager_type.as_ref()?.as_deref().map(|v| {
if let Some(("iLO", n)) = v.split_once(' ') {
n.parse::<u16>()
.map_or(ManagerType::Other(v), ManagerType::Ilo)
} else {
ManagerType::Other(v)
}
})
})
}
}
#[derive(Clone, Copy)]
pub enum ManagerType<'a> {
Ilo(u16),
Other(&'a str),
}