use crate::core::Bmc;
use crate::oem::ami::schema::ami_service_root::AmiServiceRoot as AmiServiceRootSchema;
use crate::schema::service_root::ServiceRoot as ServiceRootSchema;
use crate::Error;
use crate::NvBmc;
use std::marker::PhantomData;
use std::sync::Arc;
pub struct AmiServiceRoot<B: Bmc> {
data: Arc<AmiServiceRootSchema>,
_marker: PhantomData<B>,
}
impl<B: Bmc> AmiServiceRoot<B> {
pub(crate) fn new(
_bmc: &NvBmc<B>,
service_root: &ServiceRootSchema,
) -> Result<Option<Self>, Error<B>> {
if let Some(oem) = service_root
.base
.base
.oem
.as_ref()
.and_then(|oem| oem.additional_properties.get("Ami"))
{
let data = Arc::new(serde_json::from_value(oem.clone()).map_err(Error::Json)?);
Ok(Some(Self {
data,
_marker: PhantomData,
}))
} else {
Ok(None)
}
}
#[must_use]
pub fn raw(&self) -> Arc<AmiServiceRootSchema> {
self.data.clone()
}
pub fn rtp_version(&self) -> Option<&str> {
self.data.rtp_version.as_ref().and_then(Option::as_deref)
}
}