nv_redfish/
power_equipment.rs1use crate::core::NavProperty;
22use crate::schema::power_distribution::PowerDistribution as PowerDistributionSchema;
23use crate::schema::power_distribution_collection::PowerDistributionCollection as PowerDistributionCollectionSchema;
24use crate::schema::power_equipment::PowerEquipment as PowerEquipmentSchema;
25use crate::Error;
26use crate::NvBmc;
27use crate::Resource;
28use crate::ResourceSchema;
29use crate::ServiceRoot;
30use nv_redfish_core::Bmc;
31use std::marker::PhantomData;
32use std::sync::Arc;
33
34#[doc(inline)]
35pub use crate::schema::power_distribution::PowerEquipmentType;
36
37pub struct PowerEquipment<B: Bmc> {
41 bmc: NvBmc<B>,
42 data: Arc<PowerEquipmentSchema>,
43}
44
45impl<B: Bmc> PowerEquipment<B> {
46 pub(crate) async fn new(
48 bmc: &NvBmc<B>,
49 root: &ServiceRoot<B>,
50 ) -> Result<Option<Self>, Error<B>> {
51 let Some(nav) = &root.root.power_equipment else {
52 return Ok(None);
53 };
54
55 let data = nav.get(bmc.as_ref()).await.map_err(Error::Bmc)?;
56
57 Ok(Some(Self {
58 bmc: bmc.clone(),
59 data,
60 }))
61 }
62
63 #[must_use]
68 pub fn raw(&self) -> Arc<PowerEquipmentSchema> {
69 self.data.clone()
70 }
71
72 pub async fn power_shelves(&self) -> Result<Option<PowerShelfCollection<B>>, Error<B>> {
80 let Some(collection_ref) = &self.data.power_shelves else {
81 return Ok(None);
82 };
83
84 PowerShelfCollection::new(&self.bmc, collection_ref)
85 .await
86 .map(Some)
87 }
88}
89
90impl<B: Bmc> Resource for PowerEquipment<B> {
91 fn resource_ref(&self) -> &ResourceSchema {
92 &self.data.as_ref().base
93 }
94}
95
96pub struct PowerShelfCollection<B: Bmc> {
100 bmc: NvBmc<B>,
101 collection: Arc<PowerDistributionCollectionSchema>,
102}
103
104impl<B: Bmc> PowerShelfCollection<B> {
105 async fn new(
106 bmc: &NvBmc<B>,
107 nav: &NavProperty<PowerDistributionCollectionSchema>,
108 ) -> Result<Self, Error<B>> {
109 let collection = bmc.expand_property(nav).await?;
110 Ok(Self {
111 bmc: bmc.clone(),
112 collection,
113 })
114 }
115
116 pub async fn members(&self) -> Result<Vec<PowerShelf<B>>, Error<B>> {
122 let mut members = Vec::with_capacity(self.collection.members.len());
123 for member in &self.collection.members {
124 members.push(PowerShelf::new(&self.bmc, member).await?);
125 }
126
127 Ok(members)
128 }
129}
130
131pub struct PowerShelf<B: Bmc> {
136 data: Arc<PowerDistributionSchema>,
137 _marker: PhantomData<B>,
138}
139
140impl<B: Bmc> PowerShelf<B> {
141 async fn new(
142 bmc: &NvBmc<B>,
143 nav: &NavProperty<PowerDistributionSchema>,
144 ) -> Result<Self, Error<B>> {
145 let data = nav.get(bmc.as_ref()).await.map_err(Error::Bmc)?;
146 Ok(Self {
147 data,
148 _marker: PhantomData,
149 })
150 }
151
152 #[must_use]
157 pub fn raw(&self) -> Arc<PowerDistributionSchema> {
158 self.data.clone()
159 }
160}
161
162impl<B: Bmc> Resource for PowerShelf<B> {
163 fn resource_ref(&self) -> &ResourceSchema {
164 &self.data.as_ref().base
165 }
166}