use thiserror::Error;
#[derive(Debug, Error, Clone)]
pub enum ApplyError {
#[error("invalid diff format")]
InvalidFormat,
#[error("diff version mismatch: expected {expected}, got {actual}")]
VersionMismatch {
expected: u64,
actual: u64,
},
#[error("state corruption detected")]
StateCorruption,
}
#[derive(Debug, Error, Clone)]
pub enum DecodeError {
#[error("invalid encoding: {0}")]
InvalidEncoding(String),
#[error("unexpected end of data")]
UnexpectedEof,
#[error("unsupported version: {0}")]
UnsupportedVersion(u8),
}
#[derive(Debug, Error)]
pub enum CryptoError {
#[error("handshake failed: {0}")]
HandshakeFailed(String),
#[error("AEAD encryption failed")]
EncryptionFailed,
#[error("AEAD decryption failed (invalid tag or corrupted)")]
DecryptionFailed,
#[error("nonce counter exhausted - session must terminate")]
CounterExhaustion,
#[error("epoch exhausted - session must terminate")]
EpochExhaustion,
#[error("replay detected")]
ReplayDetected,
#[error("key derivation failed")]
KeyDerivationFailed,
}
#[derive(Debug, Error)]
pub enum SyncError {
#[error("apply error: {0}")]
Apply(#[from] ApplyError),
#[error("decode error: {0}")]
Decode(#[from] DecodeError),
}
#[derive(Debug, Error)]
pub enum NomadError {
#[error("sync error: {0}")]
Sync(#[from] SyncError),
#[error("crypto error: {0}")]
Crypto(#[from] CryptoError),
#[error("configuration error: {0}")]
Config(String),
#[error("i/o error: {0}")]
Io(#[from] std::io::Error),
}