use crate::oem::lenovo::schema::lenovo_manager::v0_1_0::LenovoManagerProperties as LenovoManagerV0_1Schema;
use crate::oem::lenovo::schema::lenovo_manager::v1_0_0::LenovoManagerProperties as LenovoManagerV1_0Schema;
use crate::oem::lenovo::schema::lenovo_manager::LenovoManagerProperties as LenovoManagerPropertiesSchema;
use crate::oem::lenovo::security_service::LenovoSecurityService;
use crate::schema::manager::Manager as ManagerSchema;
use crate::Error;
use crate::NvBmc;
use nv_redfish_core::Bmc;
use serde::Deserialize;
use std::sync::Arc;
#[doc(inline)]
pub use crate::oem::lenovo::schema::lenovo_manager::KcsState;
#[derive(Deserialize)]
#[serde(untagged)]
pub enum LenovoManagerSchema {
V0_1(LenovoManagerV0_1Schema),
V1_0(LenovoManagerV1_0Schema),
}
pub struct LenovoManager<B: Bmc> {
bmc: NvBmc<B>,
data: Arc<LenovoManagerSchema>,
}
impl<B: Bmc> LenovoManager<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("Lenovo"))
{
let data = Arc::new(serde_json::from_value(oem.clone()).map_err(Error::Json)?);
Ok(Some(Self {
data,
bmc: bmc.clone(),
}))
} else {
Ok(None)
}
}
#[must_use]
pub fn raw(&self) -> Arc<LenovoManagerSchema> {
self.data.clone()
}
#[must_use]
pub fn kcs_enabled(&self) -> Option<KcsState> {
match self.data.as_ref() {
LenovoManagerSchema::V0_1(data) => data.kcs_enabled.map(|v| {
if v {
KcsState::Enabled
} else {
KcsState::Disabled
}
}),
LenovoManagerSchema::V1_0(data) => data.kcs_enabled,
}
}
pub async fn security(&self) -> Result<Option<LenovoSecurityService<B>>, Error<B>> {
if let Some(p) = &self.base().security {
LenovoSecurityService::new(&self.bmc, p).await.map(Some)
} else {
Ok(None)
}
}
#[must_use]
pub fn base(&self) -> &LenovoManagerPropertiesSchema {
match self.data.as_ref() {
LenovoManagerSchema::V0_1(data) => &data.base,
LenovoManagerSchema::V1_0(data) => &data.base,
}
}
}