nv_redfish/oem/lenovo/
computer_system.rs1use crate::core::Bmc;
19use crate::oem::lenovo::schema::redfish::lenovo_computer_system::LenovoSystemProperties as LenovoSystemPropertiesSchema;
20use crate::schema::redfish::computer_system::ComputerSystem as ComputerSystemSchema;
21use crate::Error;
22use crate::NvBmc;
23use std::convert::identity;
24use std::marker::PhantomData;
25use std::sync::Arc;
26
27#[doc(inline)]
28pub use crate::oem::lenovo::schema::redfish::lenovo_computer_system::FpMode;
29#[doc(inline)]
30pub use crate::oem::lenovo::schema::redfish::lenovo_computer_system::PortSwitchingTo;
31
32pub struct LenovoComputerSystem<B: Bmc> {
34 data: Arc<LenovoSystemPropertiesSchema>,
35 _marker: PhantomData<B>,
36}
37
38impl<B: Bmc> LenovoComputerSystem<B> {
39 pub(crate) fn new(
47 _bmc: &NvBmc<B>,
48 computer_system: &ComputerSystemSchema,
49 ) -> Result<Option<Self>, Error<B>> {
50 if let Some(oem) = computer_system
51 .base
52 .base
53 .oem
54 .as_ref()
55 .and_then(|oem| oem.additional_properties.get("Lenovo"))
56 {
57 let data = Arc::new(serde_json::from_value(oem.clone()).map_err(Error::Json)?);
58 Ok(Some(Self {
59 data,
60 _marker: PhantomData,
61 }))
62 } else {
63 Ok(None)
64 }
65 }
66
67 #[must_use]
72 pub fn raw(&self) -> Arc<LenovoSystemPropertiesSchema> {
73 self.data.clone()
74 }
75
76 pub fn front_panel_mode(&self) -> Option<FpMode> {
78 self.data
79 .usb_management_port_assignment
80 .as_ref()
81 .or_else(|| self.data.front_panel_usb.as_ref())
82 .and_then(Option::as_ref)
83 .and_then(|v| v.fp_mode)
84 .and_then(identity)
85 }
86
87 pub fn port_switching_to(&self) -> Option<PortSwitchingTo> {
89 self.data
90 .usb_management_port_assignment
91 .as_ref()
92 .or_else(|| self.data.front_panel_usb.as_ref())
93 .and_then(Option::as_ref)
94 .and_then(|v| v.port_switching_to)
95 .and_then(identity)
96 }
97}