use crate::error::{Result, SegbError};
pub const MAGIC: &[u8; 4] = b"SEGB";
pub const COCOA_EPOCH_UNIX_SECS: f64 = 978_307_200.0;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[non_exhaustive]
pub enum EntryState {
Written,
Deleted,
Unknown,
}
impl EntryState {
pub fn from_raw(v: i32) -> Result<Self> {
match v {
1 => Ok(Self::Written),
3 => Ok(Self::Deleted),
4 => Ok(Self::Unknown),
_ => Err(SegbError::UnknownState(v)),
}
}
#[inline]
pub fn is_live(self) -> bool {
self == Self::Written
}
}
#[inline]
pub fn cocoa_to_unix_secs(cocoa: f64) -> Option<f64> {
if cocoa.is_finite() {
Some(cocoa + COCOA_EPOCH_UNIX_SECS)
} else {
None
}
}
#[inline]
pub(crate) fn le_i32(data: &[u8], off: usize) -> i32 {
let mut b = [0u8; 4];
if let Some(s) = data.get(off..off + 4) {
b.copy_from_slice(s);
}
i32::from_le_bytes(b)
}
#[inline]
pub(crate) fn le_u32(data: &[u8], off: usize) -> u32 {
let mut b = [0u8; 4];
if let Some(s) = data.get(off..off + 4) {
b.copy_from_slice(s);
}
u32::from_le_bytes(b)
}
#[inline]
pub(crate) fn le_f64(data: &[u8], off: usize) -> f64 {
let mut b = [0u8; 8];
if let Some(s) = data.get(off..off + 8) {
b.copy_from_slice(s);
} else {
return f64::NAN;
}
f64::from_le_bytes(b)
}
#[inline]
pub(crate) fn le_i32_at(data: &[u8], off: usize) -> i32 {
le_i32(data, off)
}