use std::{io, result};
use thiserror::Error;
#[derive(Error, Debug)]
pub enum Error {
#[error(transparent)]
Device(#[from] wdev::Error),
#[error(transparent)]
Record(#[from] wrecord::Error),
#[error(transparent)]
Mem(#[from] wram::Error),
#[error(transparent)]
Epoch(#[from] wepoch::Error),
#[error(transparent)]
Io(#[from] io::Error),
#[error("无效配置: {0}")]
InvalidConfig(String),
#[error("无效逻辑地址: {0}")]
InvalidAddress(u64),
#[error("地址越界: 地址 {addr} 不在有效区间 [{begin}, {tail}) 内")]
AddressOutOfRange { addr: u64, begin: u64, tail: u64 },
#[error("记录过大: 记录大小 {size} 超过页面容量 {page_size}")]
RecordTooLarge { size: usize, page_size: usize },
#[error("访问到换页填充标记: 地址 {0:#x}")]
PadRecord(u64),
#[error("记录数据损坏: 地址 {addr:#x}, 详情: {detail}")]
RecordCorrupted { addr: u64, detail: String },
#[error("页面未就绪: 页号 {0}")]
PageNotReady(u64),
#[error("页面刷盘失败: 页号 {page_id}, 详情: {detail}")]
FlushFailed { page_id: u64, detail: String },
#[error("状态机状态非法: {0}")]
InvalidState(String),
}
pub type Result<T> = result::Result<T, Error>;