use super::traits::ParseBytes;
use crate::{impl_name, result::SQLiteResult};
use core::ops::Deref;
#[derive(Debug)]
pub struct FreeListPages {
first: FreeListPagesFirstTrunkPage,
total: FreeListPagesTotalPages,
}
impl FreeListPages {
pub fn first(&self) -> &FreeListPagesFirstTrunkPage {
&self.first
}
pub fn total(&self) -> &FreeListPagesTotalPages {
&self.total
}
}
impl_name! {FreeListPages}
impl ParseBytes for FreeListPages {
const LENGTH_BYTES: usize = 8;
fn parsing_handler(bytes: &[u8]) -> SQLiteResult<Self> {
let first = FreeListPagesFirstTrunkPage::parse_bytes(&bytes[0..=3])?;
let total = FreeListPagesTotalPages::parse_bytes(&bytes[4..=7])?;
Ok(Self { first, total })
}
}
#[derive(Debug)]
pub struct FreeListPagesFirstTrunkPage(u32);
impl Deref for FreeListPagesFirstTrunkPage {
type Target = u32;
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl_name! {FreeListPagesFirstTrunkPage}
impl ParseBytes for FreeListPagesFirstTrunkPage {
const LENGTH_BYTES: usize = 4;
fn parsing_handler(bytes: &[u8]) -> SQLiteResult<Self> {
let buf: [u8; Self::LENGTH_BYTES] = bytes.try_into()?;
let first_page_trunk = u32::from_be_bytes(buf);
Ok(Self(first_page_trunk))
}
}
#[derive(Debug)]
pub struct FreeListPagesTotalPages(u32);
impl Deref for FreeListPagesTotalPages {
type Target = u32;
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl_name! {FreeListPagesTotalPages}
impl ParseBytes for FreeListPagesTotalPages {
const LENGTH_BYTES: usize = 4;
fn parsing_handler(bytes: &[u8]) -> SQLiteResult<Self> {
let buf: [u8; Self::LENGTH_BYTES] = bytes.try_into()?;
let total_pages = u32::from_be_bytes(buf);
Ok(Self(total_pages))
}
}