use std::{error::Error as StdError, io, path::PathBuf, result};
use thiserror::Error;
#[derive(Error, Debug)]
pub enum Error {
#[error(transparent)]
Io(#[from] io::Error),
#[error(transparent)]
Json(#[from] sonic_rs::Error),
#[error("Checkpoint 元数据 bitcode 编解码失败: {0}")]
Bitcode(#[from] bitcode::Error),
#[error(transparent)]
Device(#[from] wdev::Error),
#[error(transparent)]
Index(#[from] windex::Error),
#[error(transparent)]
Hlog(#[from] whlog::Error),
#[error(transparent)]
Epoch(#[from] wepoch::Error),
#[error(transparent)]
Host(#[from] Box<dyn StdError + Send + Sync>),
#[error("未找到 Checkpoint 元数据文件: {0}")]
MetaNotFound(PathBuf),
#[error("目录中不存在有效的 Checkpoint: {0}")]
NoValidCheckpoint(PathBuf),
#[error("未找到 Index 快照文件: {0}")]
IndexCkptNotFound(PathBuf),
#[error("Index 快照文件损坏或格式无效: {0}")]
InvalidIndexCkpt(String),
#[error("Token 不匹配: 期望 {expected:#x},实际 {actual:#x}")]
TokenMismatch { expected: u128, actual: u128 },
#[error("快照校验和不匹配: 期望 {expected:#x},实际 {actual:#x}")]
ChecksumMismatch { expected: u32, actual: u32 },
#[error("Checkpoint 元数据完整性校验失败: 期望 {expected:#x},实际 {actual:#x}")]
MetaChecksumMismatch { expected: u32, actual: u32 },
#[error("恢复地址校验异常: {0}")]
InvalidRecoveryAddress(String),
#[error("不支持的 Checkpoint 元数据格式版本: {actual}(当前支持最高版本 {supported})")]
UnsupportedMetaVersion { actual: u32, supported: u32 },
#[error(
"调用方处于纪元保护区,禁止发起 Checkpoint:自持纪元使排空屏障永远无法完成(丢失更新窗口),请退出会话/纪元作用域后再驱动检查点"
)]
CheckpointWhileEpochProtected,
}
pub type Result<T> = result::Result<T, Error>;