nv_redfish/session_service/
collection.rs1use crate::schema::redfish::session::Session as SessionSchema;
19use crate::schema::redfish::session_collection::SessionCollection as SessionCollectionSchema;
20use crate::session_service::Session;
21use crate::session_service::SessionCreate;
22use crate::Error;
23use crate::NvBmc;
24use nv_redfish_core::Bmc;
25use nv_redfish_core::EntityTypeRef as _;
26use nv_redfish_core::ModificationResponse;
27use nv_redfish_core::NavProperty;
28use std::sync::Arc;
29
30pub struct SessionCollection<B: Bmc> {
34 bmc: NvBmc<B>,
35 collection: Arc<SessionCollectionSchema>,
36}
37
38impl<B: Bmc> SessionCollection<B> {
39 pub(crate) async fn new(
40 bmc: NvBmc<B>,
41 collection_ref: &NavProperty<SessionCollectionSchema>,
42 ) -> Result<Self, Error<B>> {
43 let collection = bmc.expand_property(collection_ref).await?;
44 Ok(Self { bmc, collection })
45 }
46
47 pub async fn members(&self) -> Result<Vec<Session<B>>, Error<B>> {
53 let mut members = Vec::with_capacity(self.collection.members.len());
54 for member in &self.collection.members {
55 members.push(Session::new(&self.bmc, member).await?);
56 }
57 Ok(members)
58 }
59
60 pub async fn create_session(
66 &self,
67 create: &SessionCreate,
68 ) -> Result<Option<Session<B>>, Error<B>> {
69 match self
70 .bmc
71 .as_ref()
72 .create::<_, SessionSchema>(self.collection.as_ref().odata_id(), create)
73 .await
74 .map_err(Error::Bmc)?
75 {
76 ModificationResponse::Entity(data) => {
77 Ok(Some(Session::from_data(self.bmc.clone(), data)))
78 }
79 ModificationResponse::Task(_) | ModificationResponse::Empty => Ok(None),
80 }
81 }
82}