use crate::oem::supermicro::kcs_interface::KcsInterface;
use crate::oem::supermicro::schema::smc_manager_extensions::Manager as SupermicroManagerSchema;
use crate::oem::supermicro::sys_lockdown::SysLockdown;
use crate::schema::manager::Manager as ManagerSchema;
use crate::Error;
use crate::NvBmc;
use nv_redfish_core::Bmc;
use std::sync::Arc;
pub struct SupermicroManager<B: Bmc> {
bmc: NvBmc<B>,
data: Arc<SupermicroManagerSchema>,
}
impl<B: Bmc> SupermicroManager<B> {
pub(crate) fn new(bmc: &NvBmc<B>, manager: &ManagerSchema) -> Result<Option<Self>, Error<B>> {
if let Some(oem) = manager
.base
.base
.oem
.as_ref()
.and_then(|oem| oem.additional_properties.get("Supermicro"))
{
let data = Arc::new(serde_json::from_value(oem.clone()).map_err(Error::Json)?);
Ok(Some(Self {
bmc: bmc.clone(),
data,
}))
} else {
Ok(None)
}
}
#[must_use]
pub fn raw(&self) -> Arc<SupermicroManagerSchema> {
self.data.clone()
}
pub async fn kcs_interface(&self) -> Result<Option<KcsInterface<B>>, Error<B>> {
if let Some(p) = &self.data.kcs_interface {
KcsInterface::new(&self.bmc, p).await.map(Some)
} else {
Ok(None)
}
}
pub async fn sys_lockdown(&self) -> Result<Option<SysLockdown<B>>, Error<B>> {
if let Some(p) = &self.data.sys_lockdown {
SysLockdown::new(&self.bmc, p).await.map(Some)
} else {
Ok(None)
}
}
}