voice_toolkit/error.rs
1//! 统一错误处理模块
2//!
3//! 该模块为整个语音工具库提供统一的错误处理机制。通过将各个子模块的错误类型
4//! 统一封装,使得调用者可以使用单一的错误类型来处理所有可能的错误情况。
5//!
6//! ## 设计理念
7//!
8//! - **统一接口**: 所有子模块的错误都转换为统一的 `Error` 枚举
9//! - **类型安全**: 使用 `thiserror` 宏确保类型安全的错误处理
10//! - **可扩展性**: 支持动态添加新的错误类型
11//! - **错误上下文**: 保持原始错误信息,便于调试和错误追踪
12//!
13//! ## 使用示例
14//!
15//! ```rust
16//! use voice_toolkit::{Error, Result};
17//!
18//! fn process_audio() -> Result<()> {
19//! // 你的处理逻辑
20//! Ok(())
21//! }
22//!
23//! fn main() {
24//! match process_audio() {
25//! Ok(_) => println!("处理成功"),
26//! Err(Error::Audio(e)) => println!("音频处理错误: {}", e),
27//! Err(Error::Stt(e)) => println!("语音识别错误: {}", e),
28//! Err(Error::Io(e)) => println!("IO错误: {}", e),
29//! Err(Error::Other(e)) => println!("其他错误: {}", e),
30//! }
31//! }
32//! ```
33//!
34//! ## 错误类型
35//!
36//! - `Audio`: 音频处理相关的错误(格式转换、重采样等)
37//! - `Stt`: 语音转文本相关的错误(模型加载、转录等)
38//! - `Tts`: 文本转语音相关的错误(合成、引擎等)
39//! - `Io`: 文件操作相关的错误
40//! - `Other`: 其他未分类的错误
41//!
42//! ## 错误转换
43//!
44//! 该模块提供了自动的错误转换实现,使得子模块的错误可以自动转换为
45//! 统一的错误类型,简化了错误处理代码。
46
47use thiserror::Error;
48
49/// 统一错误类型
50///
51/// 这是整个语音工具库的主要错误类型,封装了所有可能的错误情况。
52/// 使用特性标志来控制不同错误类型的可用性。
53#[derive(Error, Debug)]
54pub enum Error {
55 /// 音频处理错误
56 ///
57 /// 当音频格式转换、重采样或元数据提取失败时返回此错误。
58 /// 需要 `audio` 特性标志。
59 ///
60 /// # 示例
61 ///
62 /// ```rust
63 /// #[cfg(feature = "audio")]
64 /// fn handle_audio_error(err: voice_toolkit::Error) {
65 /// if let voice_toolkit::Error::Audio(audio_err) = err {
66 /// println!("音频处理失败: {}", audio_err);
67 /// }
68 /// }
69 /// ```
70 #[cfg(feature = "audio")]
71 #[error("音频错误: {0}")]
72 Audio(rs_voice_toolkit_audio::AudioError),
73
74 /// 语音转文本错误
75 ///
76 /// 当 Whisper 模型加载、文件转录或流式处理失败时返回此错误。
77 /// 需要 `stt` 特性标志。
78 ///
79 /// # 示例
80 ///
81 /// ```rust
82 /// #[cfg(feature = "stt")]
83 /// fn handle_stt_error(err: voice_toolkit::Error) {
84 /// if let voice_toolkit::Error::Stt(stt_err) = err {
85 /// println!("语音识别失败: {}", stt_err);
86 /// }
87 /// }
88 /// ```
89 #[cfg(feature = "stt")]
90 #[error("语音识别错误: {0}")]
91 Stt(rs_voice_toolkit_stt::SttError),
92
93 /// 文本转语音错误
94 ///
95 /// 当 TTS 引擎初始化、语音合成或输出处理失败时返回此错误。
96 /// 需要 `tts` 特性标志。
97 ///
98 /// # 示例
99 ///
100 /// ```rust
101 /// #[cfg(feature = "tts")]
102 /// fn handle_tts_error(err: voice_toolkit::Error) {
103 /// if let voice_toolkit::Error::Tts(tts_err) = err {
104 /// println!("语音合成失败: {}", tts_err);
105 /// }
106 /// }
107 /// ```
108 #[cfg(feature = "tts")]
109 #[error("语音合成错误: {0}")]
110 Tts(rs_voice_toolkit_tts::TtsError),
111
112 /// IO错误
113 ///
114 /// 当文件读取、写入或其他 IO 操作失败时返回此错误。
115 /// 这是常见的错误类型,通常由文件不存在、权限不足等原因引起。
116 ///
117 /// # 示例
118 ///
119 /// ```rust
120 /// fn handle_io_error(err: voice_toolkit::Error) {
121 /// if let voice_toolkit::Error::Io(io_err) = err {
122 /// match io_err.kind() {
123 /// std::io::ErrorKind::NotFound => println!("文件不存在"),
124 /// std::io::ErrorKind::PermissionDenied => println!("权限不足"),
125 /// _ => println!("IO错误: {}", io_err),
126 /// }
127 /// }
128 /// }
129 /// ```
130 #[error("IO错误: {0}")]
131 Io(#[from] std::io::Error),
132
133 /// 其他错误
134 ///
135 /// 用于处理未分类的其他错误情况。通常用于包装字符串错误消息
136 /// 或其他不常见的情况。
137 ///
138 /// # 示例
139 ///
140 /// ```rust
141 /// fn handle_other_error(err: voice_toolkit::Error) {
142 /// if let voice_toolkit::Error::Other(msg) = err {
143 /// println!("其他错误: {}", msg);
144 /// }
145 /// }
146 /// ```
147 #[error("其他错误: {0}")]
148 Other(String),
149}
150
151/// 统一结果类型别名
152///
153/// 这是整个语音工具库的标准结果类型。所有公共函数都返回这个类型,
154/// 确保错误处理的一致性。
155///
156/// # 示例
157///
158/// ```rust
159/// use voice_toolkit::Result;
160///
161/// fn process_data() -> Result<String> {
162/// // 处理逻辑
163/// Ok("处理完成".to_string())
164/// }
165///
166/// fn main() {
167/// match process_data() {
168/// Ok(result) => println!("{}", result),
169/// Err(e) => println!("错误: {}", e),
170/// }
171/// }
172/// ```
173pub type Result<T> = std::result::Result<T, Error>;
174
175/// 错误辅助函数
176impl Error {
177 /// 创建其他错误
178 ///
179 /// 这是一个便利函数,用于创建 `Error::Other` 变体。
180 /// 适用于需要从字符串或其他可转换为字符串的类型创建错误的情况。
181 ///
182 /// # 参数
183 ///
184 /// * `msg` - 错误消息,可以是任何可转换为 `String` 的类型
185 ///
186 /// # 返回值
187 ///
188 /// 返回 `Error::Other` 变体,包含提供的错误消息。
189 ///
190 /// # 示例
191 ///
192 /// ```rust
193 /// use voice_toolkit::Error;
194 ///
195 /// fn validate_input(input: &str) -> Result<(), Error> {
196 /// if input.is_empty() {
197 /// return Err(Error::other("输入不能为空"));
198 /// }
199 /// Ok(())
200 /// }
201 ///
202 /// // 也可以直接使用字符串字面量
203 /// let error = Error::other("自定义错误消息");
204 /// ```
205 ///
206 /// # 使用场景
207 ///
208 /// - 验证输入参数
209 /// - 业务逻辑错误
210 /// - 不适合归类到其他错误类型的情况
211 pub fn other<S: Into<String>>(msg: S) -> Self {
212 Error::Other(msg.into())
213 }
214}
215
216/// 从字符串转换
217impl From<String> for Error {
218 fn from(err: String) -> Self {
219 Error::Other(err)
220 }
221}
222
223/// 从&str转换
224impl From<&str> for Error {
225 fn from(err: &str) -> Self {
226 Error::Other(err.to_string())
227 }
228}
229
230/// 从STT错误转换
231#[cfg(feature = "stt")]
232impl From<rs_voice_toolkit_stt::SttError> for Error {
233 fn from(err: rs_voice_toolkit_stt::SttError) -> Self {
234 Error::Stt(err)
235 }
236}
237
238/// 从音频错误转换
239#[cfg(feature = "audio")]
240impl From<rs_voice_toolkit_audio::AudioError> for Error {
241 fn from(err: rs_voice_toolkit_audio::AudioError) -> Self {
242 Error::Audio(err)
243 }
244}
245
246/// 从TTS错误转换
247#[cfg(feature = "tts")]
248impl From<rs_voice_toolkit_tts::TtsError> for Error {
249 fn from(err: rs_voice_toolkit_tts::TtsError) -> Self {
250 Error::Tts(err)
251 }
252}