Skip to main content

omni_dev/snowflake/client/
error.rs

1//! Error type for the clean-room Snowflake client.
2
3/// Result alias for the clean-room Snowflake client.
4pub type Result<T> = std::result::Result<T, Error>;
5
6/// An error from the clean-room Snowflake client.
7#[derive(Debug, thiserror::Error)]
8pub enum Error {
9    /// HTTP transport failure.
10    #[error("snowflake transport error: {0}")]
11    Transport(#[from] reqwest::Error),
12
13    /// The server returned an unsuccessful response (`success: false`).
14    #[error("snowflake server error ({code}): {message}")]
15    Server {
16        /// The Snowflake response `code` (empty string when absent).
17        code: String,
18        /// The Snowflake response `message`.
19        message: String,
20    },
21
22    /// The session token has expired; renew it or re-authenticate.
23    #[error("snowflake session expired")]
24    SessionExpired,
25
26    /// A request or response body could not be (de)serialized as expected.
27    #[error("snowflake protocol error: {0}")]
28    Protocol(String),
29
30    /// The external-browser SSO flow failed.
31    #[error("snowflake external-browser auth error: {0}")]
32    Auth(String),
33
34    /// A result feature the client does not yet implement was encountered.
35    #[error("unsupported snowflake feature: {0}")]
36    Unsupported(String),
37
38    /// Local I/O failure (e.g. the SSO callback listener or browser launch).
39    #[error("snowflake io error: {0}")]
40    Io(#[from] std::io::Error),
41}
42
43impl Error {
44    /// Whether this is a session-expiry error (drives evict + re-auth).
45    #[must_use]
46    pub fn is_session_expired(&self) -> bool {
47        matches!(self, Self::SessionExpired)
48    }
49}
50
51#[cfg(test)]
52mod tests {
53    use super::*;
54
55    #[test]
56    fn is_session_expired_only_for_session_expired() {
57        assert!(Error::SessionExpired.is_session_expired());
58        assert!(!Error::Auth("x".into()).is_session_expired());
59        assert!(!Error::Unsupported("arrow".into()).is_session_expired());
60        assert!(!Error::Protocol("p".into()).is_session_expired());
61        assert!(!Error::Server {
62            code: "390112".into(),
63            message: "m".into(),
64        }
65        .is_session_expired());
66    }
67
68    #[test]
69    fn display_renders_code_and_message() {
70        assert_eq!(
71            Error::SessionExpired.to_string(),
72            "snowflake session expired"
73        );
74        assert_eq!(
75            Error::Server {
76                code: "001003".into(),
77                message: "boom".into(),
78            }
79            .to_string(),
80            "snowflake server error (001003): boom"
81        );
82        assert_eq!(
83            Error::Unsupported("arrow".into()).to_string(),
84            "unsupported snowflake feature: arrow"
85        );
86    }
87}