use crate::core::NavProperty;
use crate::schema::power_distribution::PowerDistribution as PowerDistributionSchema;
use crate::schema::power_distribution_collection::PowerDistributionCollection as PowerDistributionCollectionSchema;
use crate::schema::power_equipment::PowerEquipment as PowerEquipmentSchema;
use crate::Error;
use crate::NvBmc;
use crate::Resource;
use crate::ResourceSchema;
use crate::ServiceRoot;
use nv_redfish_core::Bmc;
use std::marker::PhantomData;
use std::sync::Arc;
#[doc(inline)]
pub use crate::schema::power_distribution::PowerEquipmentType;
pub struct PowerEquipment<B: Bmc> {
bmc: NvBmc<B>,
data: Arc<PowerEquipmentSchema>,
}
impl<B: Bmc> PowerEquipment<B> {
pub(crate) async fn new(
bmc: &NvBmc<B>,
root: &ServiceRoot<B>,
) -> Result<Option<Self>, Error<B>> {
let Some(nav) = &root.root.power_equipment else {
return Ok(None);
};
let data = nav.get(bmc.as_ref()).await.map_err(Error::Bmc)?;
Ok(Some(Self {
bmc: bmc.clone(),
data,
}))
}
#[must_use]
pub fn raw(&self) -> Arc<PowerEquipmentSchema> {
self.data.clone()
}
pub async fn power_shelves(&self) -> Result<Option<PowerShelfCollection<B>>, Error<B>> {
let Some(collection_ref) = &self.data.power_shelves else {
return Ok(None);
};
PowerShelfCollection::new(&self.bmc, collection_ref)
.await
.map(Some)
}
}
impl<B: Bmc> Resource for PowerEquipment<B> {
fn resource_ref(&self) -> &ResourceSchema {
&self.data.as_ref().base
}
}
pub struct PowerShelfCollection<B: Bmc> {
bmc: NvBmc<B>,
collection: Arc<PowerDistributionCollectionSchema>,
}
impl<B: Bmc> PowerShelfCollection<B> {
async fn new(
bmc: &NvBmc<B>,
nav: &NavProperty<PowerDistributionCollectionSchema>,
) -> Result<Self, Error<B>> {
let collection = bmc.expand_property(nav).await?;
Ok(Self {
bmc: bmc.clone(),
collection,
})
}
pub async fn members(&self) -> Result<Vec<PowerShelf<B>>, Error<B>> {
let mut members = Vec::with_capacity(self.collection.members.len());
for member in &self.collection.members {
members.push(PowerShelf::new(&self.bmc, member).await?);
}
Ok(members)
}
}
pub struct PowerShelf<B: Bmc> {
data: Arc<PowerDistributionSchema>,
_marker: PhantomData<B>,
}
impl<B: Bmc> PowerShelf<B> {
async fn new(
bmc: &NvBmc<B>,
nav: &NavProperty<PowerDistributionSchema>,
) -> Result<Self, Error<B>> {
let data = nav.get(bmc.as_ref()).await.map_err(Error::Bmc)?;
Ok(Self {
data,
_marker: PhantomData,
})
}
#[must_use]
pub fn raw(&self) -> Arc<PowerDistributionSchema> {
self.data.clone()
}
}
impl<B: Bmc> Resource for PowerShelf<B> {
fn resource_ref(&self) -> &ResourceSchema {
&self.data.as_ref().base
}
}