1use std::fmt;
2
3use num_derive::FromPrimitive;
4#[derive(FromPrimitive)]
7pub enum ErrorCodeEnum {
8 ErrorCodeBase = 10000,
10 EtcError = ErrorCodeEnum::ErrorCodeBase as isize + 1 * 1000,
12 EncodingError = ErrorCodeEnum::ErrorCodeBase as isize + 2 * 1000,
14 CrypterError = ErrorCodeEnum::ErrorCodeBase as isize + 3 * 1000,
16}
17
18#[derive(FromPrimitive)]
19pub enum EncodingErrorCodeEnum {
20 HexEncodingError = ErrorCodeEnum::EncodingError as isize + 1 * 100,
22 HexBadDecodingSource,
23 BinEncodingError = ErrorCodeEnum::EncodingError as isize + 2 * 100,
25 Base64EncodingError = ErrorCodeEnum::EncodingError as isize + 3 * 100,
27 Base64BadDecodingSource,
28}
29
30#[derive(FromPrimitive)]
31pub enum CrypterErrorCodeEnum {
32 CipherAlgorithmError = ErrorCodeEnum::CrypterError as isize + 1 * 100,
34 CipherAlgorithmUnsatisfiedIVLength,
36 CipherAlgorithmUnsatisfiedKeyLength,
38 StreamGeneratorError = ErrorCodeEnum::CrypterError as isize + 2 * 100,
40 FailedWhenCrypting,
42 FailedWhenFinalizingCryption,
44 FailedWhenFlushingBuffer,
46 StreamCrypterError = ErrorCodeEnum::CrypterError as isize + 3 * 100,
48 CurrentIndexNotAtTheEndOfBufferWhenFlushing,
50 StringCrypterError = ErrorCodeEnum::CrypterError as isize + 4 * 100,
52 FailedWhenCheckingCrc32ValueOfDecryptedContent,
54 FailedWhenEncodingString,
56 FailedWhenDecodingString,
58 CannotDoCryptionToEmptyString,
60 PasswordCannotBeEmpty,
62}
63
64#[derive(FromPrimitive)]
65pub enum EtcErrorCodeEnum {
66 ContainerError = ErrorCodeEnum::EtcError as isize + 1 * 100,
68 SrcAndDstMemoryHasDifferentLength,
70 TwoMemoryHasDifferentLengthWhenXOROperation,
72 MemoryTakerHasNoEnoughContent,
74}
75
76pub type ErrorCode = u32;
78
79#[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
123pub type CiftlResult<T> = Result<T, CiftlError>;
125
126pub mod predef {
127 use super::*;
128
129 pub const SRC_AND_DST_MEMORY_HAS_DIFFERENT_LENGTH: &'static CiftlError = &CiftlError::new(
131 EtcErrorCodeEnum::SrcAndDstMemoryHasDifferentLength as ErrorCode,
132 "拷贝原始内存和目的内存长度不一致",
133 );
134 pub const TWO_MEMORY_HAS_DIFFERENT_LENGTH_WHEN_XOR_OPERATION: &'static CiftlError =
136 &CiftlError::new(
137 EtcErrorCodeEnum::TwoMemoryHasDifferentLengthWhenXOROperation as ErrorCode,
138 "进行异或操作的两段内存长度不一致",
139 );
140 pub const MEMORY_TAKER_HAS_NO_ENOUGH_CONTENT: &'static CiftlError = &CiftlError::new(
142 EtcErrorCodeEnum::MemoryTakerHasNoEnoughContent as ErrorCode,
143 "内存获取器中的内容长度不足",
144 );
145
146 pub const HEX_BAD_DECODING_SOURCE: &'static CiftlError = &CiftlError::new(
148 EncodingErrorCodeEnum::HexBadDecodingSource as ErrorCode,
149 "非法的16进制字符串",
150 );
151 pub const BASE64_BAD_DECODING_SOURCE: &'static CiftlError = &CiftlError::new(
153 EncodingErrorCodeEnum::Base64BadDecodingSource as ErrorCode,
154 "非法的Base64字符串",
155 );
156
157 pub const CIPHER_ALGORITHM_UNSATISFIED_IV_LENGTH: &'static CiftlError = &CiftlError::new(
159 CrypterErrorCodeEnum::CipherAlgorithmUnsatisfiedIVLength as ErrorCode,
160 "不满足要求的IV长度",
161 );
162
163 pub const CIPHER_ALGORITHM_UNSATISFIED_KEY_LENGTH: &'static CiftlError = &CiftlError::new(
165 CrypterErrorCodeEnum::CipherAlgorithmUnsatisfiedKeyLength as ErrorCode,
166 "不满足要求的Key长度",
167 );
168
169 pub const FAILED_WHEN_FLUSHING_BUFFER: &'static CiftlError = &CiftlError::new(
171 CrypterErrorCodeEnum::FailedWhenFlushingBuffer as ErrorCode,
172 "刷新缓冲区时失败",
173 );
174
175 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 pub const FAILED_WHEN_CHECKING_CRC32_VALUE_OF_DECRYPTED_CONTENT: &'static CiftlError =
184 &CiftlError::new(
185 CrypterErrorCodeEnum::FailedWhenCheckingCrc32ValueOfDecryptedContent as ErrorCode,
186 "解密后内容无法通过校验",
187 );
188
189 pub const FAILED_WHEN_DECODING_STRING: &'static CiftlError = &CiftlError::new(
191 CrypterErrorCodeEnum::FailedWhenDecodingString as ErrorCode,
192 "字符串解码时失败",
193 );
194
195 pub const CANNOT_DO_CRYPTION_TO_EMPTY_STRING: &'static CiftlError = &CiftlError::new(
197 CrypterErrorCodeEnum::CannotDoCryptionToEmptyString as ErrorCode,
198 "不能对空串进行密码操作",
199 );
200
201 pub const PASSWORD_CANNOT_BE_EMPTY: &'static CiftlError = &CiftlError::new(
203 CrypterErrorCodeEnum::PasswordCannotBeEmpty as ErrorCode,
204 "密码不能为空",
205 );
206}