use crate::oem::nvidia::baseboard::schema::nvidia_chassis::NvidiaCbcChassis as NvidiaCbcChassisSchema;
use crate::schema::resource::Oem as ResourceOemSchema;
use crate::Error;
use nv_redfish_core::odata::ODataType;
use nv_redfish_core::Bmc;
use serde::Deserialize;
use std::convert::identity;
use std::marker::PhantomData;
use std::sync::Arc;
use tagged_types::TaggedType;
pub type RevisionId = TaggedType<i64, RevisionIdTag>;
#[doc(hidden)]
#[derive(tagged_types::Tag)]
#[implement(Clone, Copy, Hash, PartialEq, Eq, PartialOrd, Ord)]
#[transparent(Debug, Display, Serialize, Deserialize)]
#[capability(inner_access, cloned)]
pub enum RevisionIdTag {}
pub type ChassisPhysicalSlotNumber = TaggedType<i64, ChassisPhysicalSlotNumberTag>;
#[doc(hidden)]
#[derive(tagged_types::Tag)]
#[implement(Clone, Copy, Hash, PartialEq, Eq, PartialOrd, Ord)]
#[transparent(Debug, Display, Serialize, Deserialize)]
#[capability(inner_access, cloned)]
pub enum ChassisPhysicalSlotNumberTag {}
pub type ComputeTrayIndex = TaggedType<i64, ComputeTrayIndexTag>;
#[doc(hidden)]
#[derive(tagged_types::Tag)]
#[implement(Clone, Copy, Hash, PartialEq, Eq, PartialOrd, Ord)]
#[transparent(Debug, Display, Serialize, Deserialize)]
#[capability(inner_access, cloned)]
pub enum ComputeTrayIndexTag {}
pub type TopologyId = TaggedType<i64, TopologyIdTag>;
#[doc(hidden)]
#[derive(tagged_types::Tag)]
#[implement(Clone, Copy, Hash, PartialEq, Eq, PartialOrd, Ord)]
#[transparent(Debug, Display, Serialize, Deserialize)]
#[capability(inner_access, cloned)]
pub enum TopologyIdTag {}
pub struct NvidiaCbcChassis<B: Bmc> {
data: Arc<NvidiaCbcChassisSchema>,
_marker: PhantomData<B>,
}
impl<B: Bmc> NvidiaCbcChassis<B> {
pub(crate) fn new(oem: &ResourceOemSchema) -> Result<Option<Self>, Error<B>> {
let is_cbc_chassis = oem
.additional_properties
.get("Nvidia")
.and_then(ODataType::parse_from)
.and_then(|odata_type| {
let type_name = odata_type.type_name;
odata_type
.namespace
.into_iter()
.next()
.map(|ns| (ns, type_name))
})
.map(|(top_ns, t)| top_ns == "NvidiaChassis" && t == "NvidiaCBCChassis");
if is_cbc_chassis.is_some_and(identity) {
let oem: CbcOem =
serde_json::from_value(oem.additional_properties.clone()).map_err(Error::Json)?;
Ok(Some(Self {
data: oem.nvidia.into(),
_marker: PhantomData,
}))
} else {
Ok(None)
}
}
pub fn revision_id(&self) -> Option<RevisionId> {
self.data
.revision_id
.and_then(identity)
.map(RevisionId::new)
}
pub fn chassis_physical_slot_number(&self) -> Option<ChassisPhysicalSlotNumber> {
self.data
.chassis_physical_slot_number
.and_then(identity)
.map(ChassisPhysicalSlotNumber::new)
}
pub fn compute_tray_index(&self) -> Option<ComputeTrayIndex> {
self.data
.compute_tray_index
.and_then(identity)
.map(ComputeTrayIndex::new)
}
pub fn topology_id(&self) -> Option<TopologyId> {
self.data
.topology_id
.and_then(identity)
.map(TopologyId::new)
}
#[must_use]
pub fn raw(&self) -> Arc<NvidiaCbcChassisSchema> {
self.data.clone()
}
}
#[derive(Deserialize)]
struct CbcOem {
#[serde(rename = "Nvidia")]
nvidia: NvidiaCbcChassisSchema,
}