ciftl/etc/
error.rs

1use std::fmt;
2
3use num_derive::FromPrimitive;
4// use num_traits::FromPrimitive;
5
6#[derive(FromPrimitive)]
7pub enum ErrorCodeEnum {
8    /// 错误码起始值
9    ErrorCodeBase = 10000,
10    /// etc错误
11    EtcError = ErrorCodeEnum::ErrorCodeBase as isize + 1 * 1000,
12    /// 编码器错误段
13    EncodingError = ErrorCodeEnum::ErrorCodeBase as isize + 2 * 1000,
14    /// 加密器错误段
15    CrypterError = ErrorCodeEnum::ErrorCodeBase as isize + 3 * 1000,
16}
17
18#[derive(FromPrimitive)]
19pub enum EncodingErrorCodeEnum {
20    /// Hex的错误段
21    HexEncodingError = ErrorCodeEnum::EncodingError as isize + 1 * 100,
22    HexBadDecodingSource,
23    /// Bin的错误段
24    BinEncodingError = ErrorCodeEnum::EncodingError as isize + 2 * 100,
25    /// Base64的错误段
26    Base64EncodingError = ErrorCodeEnum::EncodingError as isize + 3 * 100,
27    Base64BadDecodingSource,
28}
29
30#[derive(FromPrimitive)]
31pub enum CrypterErrorCodeEnum {
32    /// 密码算法错误段
33    CipherAlgorithmError = ErrorCodeEnum::CrypterError as isize + 1 * 100,
34    /// 不满足要求的IV长度
35    CipherAlgorithmUnsatisfiedIVLength,
36    /// 不满足要求的Key长度
37    CipherAlgorithmUnsatisfiedKeyLength,
38    /// 流生成器错误段
39    StreamGeneratorError = ErrorCodeEnum::CrypterError as isize + 2 * 100,
40    /// 执行密码操作时失败
41    FailedWhenCrypting,
42    /// 完成密码操作时失败
43    FailedWhenFinalizingCryption,
44    /// 刷新缓冲区时失败
45    FailedWhenFlushingBuffer,
46    /// 流加密器错误段
47    StreamCrypterError = ErrorCodeEnum::CrypterError as isize + 3 * 100,
48    /// 刷新时当前下标不在缓冲区的最后
49    CurrentIndexNotAtTheEndOfBufferWhenFlushing,
50    /// 字符串加密器错误段
51    StringCrypterError = ErrorCodeEnum::CrypterError as isize + 4 * 100,
52    /// 解密后内容无法通过校验
53    FailedWhenCheckingCrc32ValueOfDecryptedContent,
54    /// 字符串编码时失败
55    FailedWhenEncodingString,
56    /// 字符串解码时失败
57    FailedWhenDecodingString,
58    /// 不能对空串进行密码操作
59    CannotDoCryptionToEmptyString,
60    /// 密码不能为空
61    PasswordCannotBeEmpty,
62}
63
64#[derive(FromPrimitive)]
65pub enum EtcErrorCodeEnum {
66    /// 容器的错误段
67    ContainerError = ErrorCodeEnum::EtcError as isize + 1 * 100,
68    /// 拷贝原始内存和目的内存长度不一致
69    SrcAndDstMemoryHasDifferentLength,
70    /// 进行异或操作的两段内存长度不一致
71    TwoMemoryHasDifferentLengthWhenXOROperation,
72    /// 内存获取器中的内容长度不足
73    MemoryTakerHasNoEnoughContent,
74}
75
76/// 错误码
77pub type ErrorCode = u32;
78
79/// 错误结构
80#[derive(Debug)]
81pub struct CiftlError {
82    m_error_code: ErrorCode,
83    m_error_message: &'static str,
84    m_optional_message: Option<String>,
85}
86
87impl CiftlError {
88    pub const fn new(error_code: ErrorCode, error_message: &'static str) -> CiftlError {
89        CiftlError {
90            m_error_code: error_code,
91            m_error_message: error_message,
92            m_optional_message: None,
93        }
94    }
95
96    pub fn add_opt_mess(&self, optional_message: &str) -> CiftlError {
97        let mut error = self.clone();
98        error.m_optional_message = Some(optional_message.to_owned());
99        error
100    }
101}
102
103impl fmt::Display for CiftlError {
104    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
105        if let Some(ref m) = self.m_optional_message {
106            write!(f, "{}::{}::{}", self.m_error_code, self.m_error_message, m)
107        } else {
108            write!(f, "{}::{}", self.m_error_code, self.m_error_message)
109        }
110    }
111}
112
113impl Clone for CiftlError {
114    fn clone(&self) -> Self {
115        CiftlError {
116            m_error_code: self.m_error_code,
117            m_error_message: self.m_error_message,
118            m_optional_message: self.m_optional_message.clone(),
119        }
120    }
121}
122
123/// 重定义Resul类型
124pub type CiftlResult<T> = Result<T, CiftlError>;
125
126pub mod predef {
127    use super::*;
128
129    // 11101
130    pub const SRC_AND_DST_MEMORY_HAS_DIFFERENT_LENGTH: &'static CiftlError = &CiftlError::new(
131        EtcErrorCodeEnum::SrcAndDstMemoryHasDifferentLength as ErrorCode,
132        "拷贝原始内存和目的内存长度不一致",
133    );
134    // 11102
135    pub const TWO_MEMORY_HAS_DIFFERENT_LENGTH_WHEN_XOR_OPERATION: &'static CiftlError =
136        &CiftlError::new(
137            EtcErrorCodeEnum::TwoMemoryHasDifferentLengthWhenXOROperation as ErrorCode,
138            "进行异或操作的两段内存长度不一致",
139        );
140    // 11103
141    pub const MEMORY_TAKER_HAS_NO_ENOUGH_CONTENT: &'static CiftlError = &CiftlError::new(
142        EtcErrorCodeEnum::MemoryTakerHasNoEnoughContent as ErrorCode,
143        "内存获取器中的内容长度不足",
144    );
145
146    // 12101
147    pub const HEX_BAD_DECODING_SOURCE: &'static CiftlError = &CiftlError::new(
148        EncodingErrorCodeEnum::HexBadDecodingSource as ErrorCode,
149        "非法的16进制字符串",
150    );
151    // 12301
152    pub const BASE64_BAD_DECODING_SOURCE: &'static CiftlError = &CiftlError::new(
153        EncodingErrorCodeEnum::Base64BadDecodingSource as ErrorCode,
154        "非法的Base64字符串",
155    );
156
157    // 13101
158    pub const CIPHER_ALGORITHM_UNSATISFIED_IV_LENGTH: &'static CiftlError = &CiftlError::new(
159        CrypterErrorCodeEnum::CipherAlgorithmUnsatisfiedIVLength as ErrorCode,
160        "不满足要求的IV长度",
161    );
162
163    // 13102
164    pub const CIPHER_ALGORITHM_UNSATISFIED_KEY_LENGTH: &'static CiftlError = &CiftlError::new(
165        CrypterErrorCodeEnum::CipherAlgorithmUnsatisfiedKeyLength as ErrorCode,
166        "不满足要求的Key长度",
167    );
168
169    // 13203
170    pub const FAILED_WHEN_FLUSHING_BUFFER: &'static CiftlError = &CiftlError::new(
171        CrypterErrorCodeEnum::FailedWhenFlushingBuffer as ErrorCode,
172        "刷新缓冲区时失败",
173    );
174
175    // 13301
176    pub const CURRENT_INDEX_NOT_AT_THE_END_OF_BUFFER_WHEN_FLUSHING: &'static CiftlError =
177        &CiftlError::new(
178            CrypterErrorCodeEnum::CurrentIndexNotAtTheEndOfBufferWhenFlushing as ErrorCode,
179            "刷新时当前下标不在缓冲区的最后",
180        );
181
182    // 13401
183    pub const FAILED_WHEN_CHECKING_CRC32_VALUE_OF_DECRYPTED_CONTENT: &'static CiftlError =
184        &CiftlError::new(
185            CrypterErrorCodeEnum::FailedWhenCheckingCrc32ValueOfDecryptedContent as ErrorCode,
186            "解密后内容无法通过校验",
187        );
188
189    // 13403
190    pub const FAILED_WHEN_DECODING_STRING: &'static CiftlError = &CiftlError::new(
191        CrypterErrorCodeEnum::FailedWhenDecodingString as ErrorCode,
192        "字符串解码时失败",
193    );
194
195    // 13404
196    pub const CANNOT_DO_CRYPTION_TO_EMPTY_STRING: &'static CiftlError = &CiftlError::new(
197        CrypterErrorCodeEnum::CannotDoCryptionToEmptyString as ErrorCode,
198        "不能对空串进行密码操作",
199    );
200
201    // 13405
202    pub const PASSWORD_CANNOT_BE_EMPTY: &'static CiftlError = &CiftlError::new(
203        CrypterErrorCodeEnum::PasswordCannotBeEmpty as ErrorCode,
204        "密码不能为空",
205    );
206}