#![cfg_attr(test, allow(clippy::unwrap_used, clippy::expect_used))]
pub mod common;
pub mod error;
pub mod menuitem;
pub mod proto;
pub mod segb1;
pub mod segb2;
use std::io::{Read, Seek};
pub use common::EntryState;
pub use error::{Result, SegbError};
pub use segb1::SegbV1Record;
pub use segb2::SegbV2Record;
#[derive(Debug, Clone)]
pub enum SegbRecord {
V1(SegbV1Record),
V2(SegbV2Record),
}
impl SegbRecord {
pub fn state(&self) -> EntryState {
match self {
Self::V1(r) => r.state,
Self::V2(r) => r.state,
}
}
pub fn timestamp_unix(&self) -> Option<f64> {
match self {
Self::V1(r) => r.timestamp1_unix,
Self::V2(r) => r.timestamp_unix,
}
}
pub fn payload(&self) -> &[u8] {
match self {
Self::V1(r) => &r.payload,
Self::V2(r) => &r.payload,
}
}
pub fn data_offset(&self) -> u64 {
match self {
Self::V1(r) => r.data_offset,
Self::V2(r) => r.data_offset,
}
}
pub fn stored_crc32(&self) -> u32 {
match self {
Self::V1(r) => r.stored_crc32,
Self::V2(r) => r.stored_crc32,
}
}
pub fn computed_crc32(&self) -> u32 {
match self {
Self::V1(r) => r.computed_crc32,
Self::V2(r) => r.computed_crc32,
}
}
pub fn crc_ok(&self) -> bool {
self.stored_crc32() == self.computed_crc32()
}
}
pub fn read_segb<R: Read + Seek>(r: &mut R) -> Result<Vec<SegbRecord>> {
r.seek(std::io::SeekFrom::Start(0))?;
if segb1::is_segb_v1(r) {
r.seek(std::io::SeekFrom::Start(0))?;
let records = segb1::read_v1(r)?;
return Ok(records.into_iter().map(SegbRecord::V1).collect());
}
r.seek(std::io::SeekFrom::Start(0))?;
if segb2::is_segb_v2(r) {
r.seek(std::io::SeekFrom::Start(0))?;
let records = segb2::read_v2(r)?;
return Ok(records.into_iter().map(SegbRecord::V2).collect());
}
Err(SegbError::BadMagic {
found: "not SEGB v1 or v2".to_owned(),
})
}