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}