use crate::hardware_id::HardwareIdRef;
use crate::hardware_id::Manufacturer as HardwareIdManufacturer;
use crate::hardware_id::Model as HardwareIdModel;
use crate::hardware_id::PartNumber as HardwareIdPartNumber;
use crate::hardware_id::SerialNumber as HardwareIdSerialNumber;
use crate::schema::redfish::assembly::Assembly as AssemblySchema;
use crate::schema::redfish::assembly::AssemblyData as AssemblyDataSchema;
use crate::Error;
use crate::NvBmc;
use crate::Resource;
use crate::ResourceSchema;
use nv_redfish_core::Bmc;
use nv_redfish_core::NavProperty;
use std::marker::PhantomData;
use std::sync::Arc;
#[doc(hidden)]
pub enum AssemblyTag {}
pub type Manufacturer<T> = HardwareIdManufacturer<T, AssemblyTag>;
pub type Model<T> = HardwareIdModel<T, AssemblyTag>;
pub type PartNumber<T> = HardwareIdPartNumber<T, AssemblyTag>;
pub type SerialNumber<T> = HardwareIdSerialNumber<T, AssemblyTag>;
pub struct Assembly<B: Bmc> {
bmc: NvBmc<B>,
data: Arc<AssemblySchema>,
}
impl<B: Bmc> Assembly<B> {
pub(crate) async fn new(
bmc: &NvBmc<B>,
nav: &NavProperty<AssemblySchema>,
) -> Result<Self, Error<B>> {
bmc.expand_property(nav).await.map(|data| Self {
bmc: bmc.clone(),
data,
})
}
#[must_use]
pub fn raw(&self) -> Arc<AssemblySchema> {
self.data.clone()
}
pub async fn assemblies(&self) -> Result<Vec<AssemblyData<B>>, Error<B>> {
let mut result = Vec::new();
if let Some(assemblies) = &self.data.assemblies {
for m in assemblies {
result.push(AssemblyData::new(&self.bmc, m).await?);
}
}
Ok(result)
}
}
impl<B: Bmc> Resource for Assembly<B> {
fn resource_ref(&self) -> &ResourceSchema {
&self.data.as_ref().base
}
}
pub struct AssemblyData<B: Bmc> {
data: Arc<AssemblyDataSchema>,
_marker: PhantomData<B>,
}
impl<B: Bmc> AssemblyData<B> {
pub(crate) async fn new(
bmc: &NvBmc<B>,
nav: &NavProperty<AssemblyDataSchema>,
) -> Result<Self, Error<B>> {
nav.get(bmc.as_ref())
.await
.map_err(crate::Error::Bmc)
.map(|data| Self {
data,
_marker: PhantomData,
})
}
#[must_use]
pub fn raw(&self) -> Arc<AssemblyDataSchema> {
self.data.clone()
}
#[must_use]
pub fn hardware_id(&self) -> HardwareIdRef<'_, AssemblyTag> {
HardwareIdRef {
manufacturer: self
.data
.producer
.as_ref()
.and_then(Option::as_deref)
.map(Manufacturer::new),
model: self
.data
.model
.as_ref()
.and_then(Option::as_deref)
.map(Model::new),
part_number: self
.data
.part_number
.as_ref()
.and_then(Option::as_deref)
.map(PartNumber::new),
serial_number: self
.data
.serial_number
.as_ref()
.and_then(Option::as_deref)
.map(SerialNumber::new),
}
}
}