use crate::schema::drive::Drive as DriveSchema;
use crate::schema::drive_metrics::DriveMetrics;
use crate::Error;
use crate::NvBmc;
use crate::Resource;
use crate::ResourceSchema;
use nv_redfish_core::Bmc;
use nv_redfish_core::NavProperty;
use std::sync::Arc;
#[cfg(feature = "sensors")]
use crate::sensor::extract_environment_sensors;
#[cfg(feature = "sensors")]
use crate::sensor::SensorLink;
pub struct Drive<B: Bmc> {
bmc: NvBmc<B>,
data: Arc<DriveSchema>,
}
impl<B: Bmc> Drive<B> {
pub(crate) async fn new(
bmc: &NvBmc<B>,
nav: &NavProperty<DriveSchema>,
) -> Result<Self, Error<B>> {
nav.get(bmc.as_ref())
.await
.map_err(Error::Bmc)
.map(|data| Self {
bmc: bmc.clone(),
data,
})
}
#[must_use]
pub fn raw(&self) -> Arc<DriveSchema> {
self.data.clone()
}
pub async fn metrics(&self) -> Result<Option<Arc<DriveMetrics>>, Error<B>> {
if let Some(metrics_ref) = &self.data.metrics {
metrics_ref
.get(self.bmc.as_ref())
.await
.map_err(Error::Bmc)
.map(Some)
} else {
Ok(None)
}
}
#[cfg(feature = "sensors")]
pub async fn environment_sensor_links(&self) -> Result<Vec<SensorLink<B>>, Error<B>> {
let sensor_refs = if let Some(env_ref) = &self.data.environment_metrics {
extract_environment_sensors(env_ref, self.bmc.as_ref()).await?
} else {
Vec::new()
};
Ok(sensor_refs
.into_iter()
.map(|r| SensorLink::new(&self.bmc, r))
.collect())
}
}
impl<B: Bmc> Resource for Drive<B> {
fn resource_ref(&self) -> &ResourceSchema {
&self.data.as_ref().base
}
}