use crate::oem::delta::schema::delta_energy_systems_power_supply::PowerSupply as DeltaPowerSupplySchema;
use crate::schema::resource::Oem as ResourceOemSchema;
use crate::Error;
use nv_redfish_core::Bmc;
use serde::Deserialize;
use std::convert::identity;
use std::marker::PhantomData;
use std::sync::Arc;
pub const OEM_KEY: &str = "deltaenergysystems";
pub struct DeltaPowerSupply<B: Bmc> {
data: Arc<DeltaPowerSupplySchema>,
_marker: PhantomData<B>,
}
impl<B: Bmc> DeltaPowerSupply<B> {
pub(crate) fn new(oem: &ResourceOemSchema) -> Result<Option<Self>, Error<B>> {
if oem.additional_properties.get(OEM_KEY).is_none() {
return Ok(None);
}
let oem: DeltaOem =
serde_json::from_value(oem.additional_properties.clone()).map_err(Error::Json)?;
Ok(Some(Self {
data: oem.deltaenergysystems.into(),
_marker: PhantomData,
}))
}
#[must_use]
pub fn power(&self) -> Option<bool> {
self.data.power.and_then(identity)
}
#[must_use]
pub fn fan_speed_target(&self) -> Option<i64> {
self.data.fan_speed_target.and_then(identity)
}
#[must_use]
pub fn raw(&self) -> Arc<DeltaPowerSupplySchema> {
self.data.clone()
}
}
#[derive(Deserialize)]
struct DeltaOem {
deltaenergysystems: DeltaPowerSupplySchema,
}