use std::error::Error;
use strum_macros::{Display, EnumString};

#[repr(u8)]
#[derive(Debug, Display, EnumString, Clone, Copy, Eq, PartialEq)]
pub enum DatError{
    // certificate
    InvalidCertificateFormat,
    UnknownSignatureAlgorithm,
    UnknownCryptoAlgorithm,
    InvalidSignatureKey,
    InvalidCryptoKey,
    GenerateSigningKeyError,
    VerifyOnlyCertificate,
    EncryptError,
    DecryptError,
    SignError,
    CidNotFound,

    // manager
    SigningKeyNotExists,
    DuplicatedCid,

    // util
    InvalidBase64Format,
    Utf8EncodeError,
    IoError,

    // Dat
    InvalidDat,
}

impl DatError {
    /// 이 에러가 시스템을 중단해야 할 정도로 심각한지 여부를 반환합니다.
    #[inline] // 성능 최적화를 위해 인라인 힌트 제공
    pub fn is_critical(&self) -> bool {
        use DatError::*;
        match self {
            InvalidDat => false,
            _ => true,
        }
    }
}

impl Error for DatError {}

