use onerom_metadata::{DeviceMemoryView, OneromInfo};
#[cfg(not(feature = "std"))]
use alloc::{format, vec::Vec};
use crate::ParseError;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum FirmwareFormat {
Original,
Schema,
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct OneRom {
info: Option<OneromInfo>,
parse_errors: Vec<ParseError>,
}
impl OneRom {
pub(crate) fn new(info: Option<OneromInfo>, parse_errors: Vec<ParseError>) -> Self {
Self { info, parse_errors }
}
pub fn info(&self) -> Option<&OneromInfo> {
self.info.as_ref()
}
pub fn metadata(&self) -> Option<&onerom_metadata::OneromMetadataHeader> {
self.info.as_ref()?.metadata.as_ref()
}
pub fn runtime(&self) -> Option<&onerom_metadata::OneromRuntimeInfo> {
self.info.as_ref()?.runtime.as_ref()
}
pub fn metadata_mut(&mut self) -> Option<&mut onerom_metadata::OneromMetadataHeader> {
self.info.as_mut()?.metadata.as_mut()
}
pub fn parse_errors(&self) -> &[ParseError] {
&self.parse_errors
}
}
pub(crate) fn parse_onerom_from_view(
view: &DeviceMemoryView<'_>,
info_addr: u32,
mut pre_errors: Vec<ParseError>,
) -> OneRom {
match OneromInfo::parse(view, info_addr) {
Ok(info) => OneRom::new(Some(info), pre_errors),
Err(e) => {
pre_errors.push(ParseError::new("OneromInfo", format!("{e:?}")));
OneRom::new(None, pre_errors)
}
}
}