use std::io;
use crate::Key;
use crate::types::{PageId, TableId};
#[derive(thiserror::Error, Debug)]
pub enum StoreError {
#[error("filesystem error: {0}")]
Io(#[from] io::Error),
#[error(
"page {page_id} corrupted: CRC mismatch (expected {expected:#010x}, got {actual:#010x})"
)]
PageCorrupted {
page_id: PageId,
expected: u32,
actual: u32,
},
#[error("key too long: {len} bytes exceeds maximum {max}")]
KeyTooLong { len: usize, max: usize },
#[error("value too large: {len} bytes exceeds maximum {max}")]
ValueTooLarge { len: usize, max: usize },
#[error("invalid page magic: expected {expected:#010x}, got {actual:#010x}")]
InvalidPageMagic { expected: u32, actual: u32 },
#[error("unsupported page version: {0}")]
UnsupportedPageVersion(u8),
#[error("invalid superblock magic")]
InvalidSuperblockMagic,
#[error("superblock corrupted: CRC mismatch")]
SuperblockCorrupted,
#[error("non-sequential batch: expected position {expected}, got {actual}")]
NonSequentialBatch { expected: u64, actual: u64 },
#[error("table {0:?} not found")]
TableNotFound(TableId),
#[error("page overflow: need {needed} bytes, have {available}")]
PageOverflow { needed: usize, available: usize },
#[error("B+tree invariant violation: {0}")]
BTreeInvariant(String),
#[error("duplicate key in batch: {0:?}")]
DuplicateKey(Key),
#[error("page {0} not found")]
PageNotFound(PageId),
#[error("store is read-only")]
ReadOnly,
}