1use thiserror::Error;
4
5pub type Result<T> = std::result::Result<T, RealtimeError>;
7
8#[derive(Error, Debug)]
10pub enum RealtimeError {
11 #[error("WebSocket connection error: {0}")]
13 ConnectionError(String),
14
15 #[error("WebSocket message error: {0}")]
17 MessageError(String),
18
19 #[error("Authentication error: {0}")]
21 AuthError(String),
22
23 #[error("Session not connected")]
25 NotConnected,
26
27 #[error("Session already closed")]
29 SessionClosed,
30
31 #[error("Invalid configuration: {0}")]
33 ConfigError(String),
34
35 #[error("Audio format error: {0}")]
37 AudioFormatError(String),
38
39 #[error("Tool execution error: {0}")]
41 ToolError(String),
42
43 #[error("Server error: {code} - {message}")]
45 ServerError {
46 code: String,
48 message: String,
50 },
51
52 #[error("Timeout: {0}")]
54 Timeout(String),
55
56 #[error("Serialization error: {0}")]
58 SerializationError(#[from] serde_json::Error),
59
60 #[error("Provider error: {0}")]
62 ProviderError(String),
63
64 #[error("IO error: {0}")]
66 IoError(#[from] std::io::Error),
67
68 #[error("Opus codec error: {0}")]
70 OpusCodecError(String),
71
72 #[error("WebRTC error: {0}")]
74 WebRTCError(String),
75
76 #[error("LiveKit error: {0}")]
78 LiveKitError(String),
79}
80
81impl RealtimeError {
82 pub fn connection<S: Into<String>>(msg: S) -> Self {
84 Self::ConnectionError(msg.into())
85 }
86
87 pub fn server<S: Into<String>>(code: S, message: S) -> Self {
89 Self::ServerError { code: code.into(), message: message.into() }
90 }
91
92 pub fn provider<S: Into<String>>(msg: S) -> Self {
94 Self::ProviderError(msg.into())
95 }
96
97 pub fn config<S: Into<String>>(msg: S) -> Self {
99 Self::ConfigError(msg.into())
100 }
101
102 pub fn protocol<S: Into<String>>(msg: S) -> Self {
104 Self::MessageError(msg.into())
105 }
106
107 pub fn audio<S: Into<String>>(msg: S) -> Self {
109 Self::AudioFormatError(msg.into())
110 }
111
112 pub fn opus(msg: impl Into<String>) -> Self {
114 Self::OpusCodecError(msg.into())
115 }
116
117 pub fn webrtc(msg: impl Into<String>) -> Self {
119 Self::WebRTCError(msg.into())
120 }
121
122 pub fn livekit(msg: impl Into<String>) -> Self {
124 Self::LiveKitError(msg.into())
125 }
126}