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::network_adapter::NetworkAdapter as NetworkAdapterSchema;
use crate::schema::network_adapter_collection::NetworkAdapterCollection as NetworkAdapterCollectionSchema;
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 = "network-device-functions")]
use crate::network_device_function::NetworkDeviceFunctionCollection;
pub struct NetworkAdapterCollection<B: Bmc> {
bmc: NvBmc<B>,
collection: Arc<NetworkAdapterCollectionSchema>,
}
impl<B: Bmc> NetworkAdapterCollection<B> {
pub(crate) async fn new(
bmc: &NvBmc<B>,
nav: &NavProperty<NetworkAdapterCollectionSchema>,
) -> Result<Self, Error<B>> {
let collection = bmc.expand_property(nav).await?;
Ok(Self {
bmc: bmc.clone(),
collection,
})
}
pub async fn members(&self) -> Result<Vec<NetworkAdapter<B>>, Error<B>> {
let mut members = Vec::new();
for m in &self.collection.members {
members.push(NetworkAdapter::new(&self.bmc, m).await?);
}
Ok(members)
}
}
#[doc(hidden)]
pub enum NetworkAdapterTag {}
pub type Manufacturer<T> = HardwareIdManufacturer<T, NetworkAdapterTag>;
pub type Model<T> = HardwareIdModel<T, NetworkAdapterTag>;
pub type PartNumber<T> = HardwareIdPartNumber<T, NetworkAdapterTag>;
pub type SerialNumber<T> = HardwareIdSerialNumber<T, NetworkAdapterTag>;
pub struct NetworkAdapter<B: Bmc> {
#[allow(dead_code)] bmc: NvBmc<B>,
data: Arc<NetworkAdapterSchema>,
}
impl<B: Bmc> NetworkAdapter<B> {
pub(crate) async fn new(
bmc: &NvBmc<B>,
nav: &NavProperty<NetworkAdapterSchema>,
) -> Result<Self, Error<B>> {
nav.get(bmc.as_ref())
.await
.map_err(crate::Error::Bmc)
.map(|data| Self {
bmc: bmc.clone(),
data,
})
}
#[must_use]
pub fn raw(&self) -> Arc<NetworkAdapterSchema> {
self.data.clone()
}
#[must_use]
pub fn hardware_id(&self) -> HardwareIdRef<'_, NetworkAdapterTag> {
HardwareIdRef {
manufacturer: self
.data
.manufacturer
.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),
}
}
#[cfg(feature = "network-device-functions")]
pub async fn network_device_functions(
&self,
) -> Result<Option<NetworkDeviceFunctionCollection<B>>, Error<B>> {
if let Some(p) = &self.data.network_device_functions {
NetworkDeviceFunctionCollection::new(&self.bmc, p)
.await
.map(Some)
} else {
Ok(None)
}
}
}
impl<B: Bmc> Resource for NetworkAdapter<B> {
fn resource_ref(&self) -> &ResourceSchema {
&self.data.as_ref().base
}
}