use onerom_config::fw::FirmwareVersion;
use onerom_config::hw::Board;
use crate::ParseError;
use crate::info::Sdrr;
use crate::onerom::OneRom;
#[derive(Debug, Clone)]
pub enum ParsedDevice {
Original(Sdrr),
Schema(OneRom),
}
impl ParsedDevice {
pub fn is_running(&self) -> bool {
match self {
Self::Original(sdrr) => sdrr.is_running(),
Self::Schema(onerom) => onerom.runtime().is_some(),
}
}
pub fn version(&self) -> Option<FirmwareVersion> {
match self {
Self::Original(sdrr) => sdrr.flash.as_ref().map(|f| f.version),
Self::Schema(onerom) => {
let info = onerom.info()?;
Some(FirmwareVersion::new(
info.major_version,
info.minor_version,
info.patch_version,
info.build_number,
))
}
}
}
pub fn parse_errors(&self) -> &[ParseError] {
match self {
Self::Original(sdrr) => sdrr
.flash
.as_ref()
.map(|f| f.parse_errors.as_slice())
.unwrap_or(&[]),
Self::Schema(onerom) => onerom.parse_errors(),
}
}
pub fn as_original(&self) -> Option<&Sdrr> {
if let Self::Original(sdrr) = self {
Some(sdrr)
} else {
None
}
}
pub fn as_schema(&self) -> Option<&OneRom> {
if let Self::Schema(onerom) = self {
Some(onerom)
} else {
None
}
}
pub fn get_board(&self) -> Option<Board> {
match self {
Self::Original(sdrr) => sdrr.flash.as_ref().and_then(|f| f.board),
Self::Schema(onerom) => {
let hw_rev = &onerom.info()?.metadata.as_ref()?.hw.hw_rev;
Board::try_from_str(hw_rev)
}
}
}
pub fn is_usb_run_capable(&self) -> bool {
match self {
Self::Original(sdrr) => sdrr
.flash
.as_ref()
.map(|f| f.is_usb_run_capable())
.unwrap_or(false),
Self::Schema(onerom) => {
let slot = match onerom.metadata() {
Some(metadata) => match metadata.rom_slots.first() {
Some(slot) => slot,
None => return false,
},
None => return false,
};
let rom_info = match slot.roms.first() {
Some(info) => info,
None => return false,
};
rom_info.rbcp_rom_type
== onerom_config::chip::ChipType::SystemPlugin.rbcp_chip_type()
}
}
}
}