Skip to main content

brainwires_audio/
error.rs

1use thiserror::Error;
2
3/// Errors that can occur during audio operations.
4#[derive(Debug, Error)]
5pub enum AudioError {
6    /// Audio device not found or unavailable.
7    #[error("device error: {0}")]
8    Device(String),
9
10    /// Audio capture failed.
11    #[error("capture error: {0}")]
12    Capture(String),
13
14    /// Audio playback failed.
15    #[error("playback error: {0}")]
16    Playback(String),
17
18    /// Speech-to-text transcription failed.
19    #[error("transcription error: {0}")]
20    Transcription(String),
21
22    /// Text-to-speech synthesis failed.
23    #[error("synthesis error: {0}")]
24    Synthesis(String),
25
26    /// Audio format conversion failed.
27    #[error("format error: {0}")]
28    Format(String),
29
30    /// API communication error.
31    #[error("api error: {0}")]
32    Api(String),
33
34    /// Audio stream was interrupted or closed.
35    #[error("stream closed: {0}")]
36    StreamClosed(String),
37
38    /// Unsupported configuration requested.
39    #[error("unsupported: {0}")]
40    Unsupported(String),
41
42    /// IO error.
43    #[error("io error: {source}")]
44    Io {
45        /// The underlying IO error.
46        #[from]
47        source: std::io::Error,
48    },
49}
50
51/// Result alias for audio operations.
52pub type AudioResult<T> = Result<T, AudioError>;
53
54#[cfg(test)]
55mod tests {
56    use super::*;
57
58    #[test]
59    fn display_device_error() {
60        let err = AudioError::Device("no mic found".into());
61        assert_eq!(err.to_string(), "device error: no mic found");
62    }
63
64    #[test]
65    fn display_capture_error() {
66        let err = AudioError::Capture("buffer overrun".into());
67        assert_eq!(err.to_string(), "capture error: buffer overrun");
68    }
69
70    #[test]
71    fn display_api_error() {
72        let err = AudioError::Api("401 unauthorized".into());
73        assert_eq!(err.to_string(), "api error: 401 unauthorized");
74    }
75
76    #[test]
77    fn display_format_error() {
78        let err = AudioError::Format("unsupported codec".into());
79        assert_eq!(err.to_string(), "format error: unsupported codec");
80    }
81
82    #[test]
83    fn display_stream_closed_error() {
84        let err = AudioError::StreamClosed("peer hung up".into());
85        assert_eq!(err.to_string(), "stream closed: peer hung up");
86    }
87}