nv_redfish/chassis/
network_adapter.rs1use crate::hardware_id::HardwareIdRef;
20use crate::hardware_id::Manufacturer as HardwareIdManufacturer;
21use crate::hardware_id::Model as HardwareIdModel;
22use crate::hardware_id::PartNumber as HardwareIdPartNumber;
23use crate::hardware_id::SerialNumber as HardwareIdSerialNumber;
24use crate::schema::redfish::network_adapter::NetworkAdapter as NetworkAdapterSchema;
25use crate::schema::redfish::network_adapter_collection::NetworkAdapterCollection as NetworkAdapterCollectionSchema;
26use crate::Error;
27use crate::NvBmc;
28use crate::Resource;
29use crate::ResourceSchema;
30use nv_redfish_core::Bmc;
31use nv_redfish_core::NavProperty;
32use std::marker::PhantomData;
33use std::sync::Arc;
34
35pub struct NetworkAdapterCollection<B: Bmc> {
39 bmc: NvBmc<B>,
40 collection: Arc<NetworkAdapterCollectionSchema>,
41}
42
43impl<B: Bmc> NetworkAdapterCollection<B> {
44 pub(crate) async fn new(
46 bmc: &NvBmc<B>,
47 nav: &NavProperty<NetworkAdapterCollectionSchema>,
48 ) -> Result<Self, Error<B>> {
49 let collection = bmc.expand_property(nav).await?;
50 Ok(Self {
51 bmc: bmc.clone(),
52 collection,
53 })
54 }
55
56 pub async fn members(&self) -> Result<Vec<NetworkAdapter<B>>, Error<B>> {
62 let mut members = Vec::new();
63 for m in &self.collection.members {
64 members.push(NetworkAdapter::new(&self.bmc, m).await?);
65 }
66 Ok(members)
67 }
68}
69
70#[doc(hidden)]
71pub enum NetworkAdapterTag {}
72
73pub type Manufacturer<T> = HardwareIdManufacturer<T, NetworkAdapterTag>;
75
76pub type Model<T> = HardwareIdModel<T, NetworkAdapterTag>;
78
79pub type PartNumber<T> = HardwareIdPartNumber<T, NetworkAdapterTag>;
81
82pub type SerialNumber<T> = HardwareIdSerialNumber<T, NetworkAdapterTag>;
84
85pub struct NetworkAdapter<B: Bmc> {
89 data: Arc<NetworkAdapterSchema>,
90 _marker: PhantomData<B>,
91}
92
93impl<B: Bmc> NetworkAdapter<B> {
94 pub(crate) async fn new(
96 bmc: &NvBmc<B>,
97 nav: &NavProperty<NetworkAdapterSchema>,
98 ) -> Result<Self, Error<B>> {
99 nav.get(bmc.as_ref())
100 .await
101 .map_err(crate::Error::Bmc)
102 .map(|data| Self {
103 data,
104 _marker: PhantomData,
105 })
106 }
107
108 #[must_use]
110 pub fn raw(&self) -> Arc<NetworkAdapterSchema> {
111 self.data.clone()
112 }
113
114 #[must_use]
116 pub fn hardware_id(&self) -> HardwareIdRef<'_, NetworkAdapterTag> {
117 HardwareIdRef {
118 manufacturer: self
119 .data
120 .manufacturer
121 .as_ref()
122 .and_then(Option::as_ref)
123 .map(Manufacturer::new),
124 model: self
125 .data
126 .model
127 .as_ref()
128 .and_then(Option::as_ref)
129 .map(Model::new),
130 part_number: self
131 .data
132 .part_number
133 .as_ref()
134 .and_then(Option::as_ref)
135 .map(PartNumber::new),
136 serial_number: self
137 .data
138 .serial_number
139 .as_ref()
140 .and_then(Option::as_ref)
141 .map(SerialNumber::new),
142 }
143 }
144}
145
146impl<B: Bmc> Resource for NetworkAdapter<B> {
147 fn resource_ref(&self) -> &ResourceSchema {
148 &self.data.as_ref().base
149 }
150}