Skip to main content

gemini_live/
error.rs

1//! Error types for each architectural layer.
2//!
3//! Errors are split by layer so callers can match on the granularity they need:
4//! - [`CodecError`] — JSON serialization / deserialization failures.
5//! - [`ConnectError`] — WebSocket connection establishment failures.
6//! - [`SendError`] / [`RecvError`] — frame-level I/O on an established connection.
7//! - [`SessionError`] — high-level session lifecycle errors (setup, reconnect, etc.).
8
9use std::time::Duration;
10
11// ── Codec layer ──────────────────────────────────────────────────────────────
12
13/// Failure during JSON ↔ Rust conversion.
14#[derive(Debug, thiserror::Error)]
15pub enum CodecError {
16    #[error("JSON serialization failed: {0}")]
17    Serialize(#[source] serde_json::Error),
18    #[error("JSON deserialization failed: {0}")]
19    Deserialize(#[source] serde_json::Error),
20}
21
22// ── Transport layer ──────────────────────────────────────────────────────────
23
24/// Failure while establishing a WebSocket connection.
25#[derive(Debug, thiserror::Error)]
26pub enum ConnectError {
27    #[error("DNS resolution failed: {0}")]
28    Dns(#[source] Box<dyn std::error::Error + Send + Sync>),
29    #[error("TLS handshake failed: {0}")]
30    Tls(#[source] Box<dyn std::error::Error + Send + Sync>),
31    #[error("connection timed out after {0:?}")]
32    Timeout(Duration),
33    #[error("WebSocket handshake rejected: {status}")]
34    Rejected { status: u16 },
35    #[error("WebSocket error: {0}")]
36    Ws(#[source] tokio_tungstenite::tungstenite::Error),
37}
38
39/// Failure while sending a WebSocket frame.
40#[derive(Debug, thiserror::Error)]
41pub enum SendError {
42    #[error("connection closed")]
43    Closed,
44    #[error("WebSocket send failed: {0}")]
45    Ws(#[source] tokio_tungstenite::tungstenite::Error),
46}
47
48/// Failure while receiving a WebSocket frame.
49#[derive(Debug, thiserror::Error)]
50pub enum RecvError {
51    #[error("connection closed")]
52    Closed,
53    #[error("WebSocket receive failed: {0}")]
54    Ws(#[source] tokio_tungstenite::tungstenite::Error),
55}
56
57// ── Session layer ────────────────────────────────────────────────────────────
58
59/// High-level session error covering setup, runtime, and reconnection.
60#[derive(Debug, thiserror::Error)]
61pub enum SessionError {
62    #[error("setup failed: {0}")]
63    SetupFailed(String),
64    #[error("setup timed out after {0:?}")]
65    SetupTimeout(Duration),
66    #[error("API error: {0}")]
67    Api(String),
68    #[error("connection lost and reconnection failed after {attempts} attempts")]
69    ReconnectExhausted { attempts: u32 },
70    #[error("session closed")]
71    Closed,
72    #[error(transparent)]
73    Transport(#[from] SendError),
74    #[error(transparent)]
75    Codec(#[from] CodecError),
76}