spanner_rs/
error.rs

1use std::num::TryFromIntError;
2
3use bb8::RunError;
4#[cfg(feature = "temporal")]
5use chrono::ParseError;
6use derive_builder::UninitializedFieldError;
7
8#[derive(thiserror::Error, Debug)]
9pub enum Error {
10    #[error("spanner client error: {0}")]
11    Client(String),
12    #[error("configuration error: {0}")]
13    Config(String),
14    #[error("codec error: {0}")]
15    Codec(String),
16    #[error("authentication error: {0}")]
17    Auth(#[from] gcp_auth::Error),
18
19    #[error("transport error: {0}")]
20    TransportError(#[from] tonic::transport::Error),
21
22    #[error("unexpected gRPC status: {0}")]
23    Status(#[from] tonic::Status),
24}
25
26impl From<RunError<Error>> for Error {
27    fn from(value: RunError<Error>) -> Self {
28        match value {
29            RunError::User(error) => error,
30            RunError::TimedOut => Error::Client("timeout while obtaining new session".to_string()),
31        }
32    }
33}
34
35impl From<TryFromIntError> for Error {
36    fn from(value: TryFromIntError) -> Self {
37        Error::Codec(format!("{}", value))
38    }
39}
40
41impl From<UninitializedFieldError> for Error {
42    fn from(value: UninitializedFieldError) -> Self {
43        Error::Config(format!("{}", value))
44    }
45}
46
47#[cfg(feature = "temporal")]
48impl From<ParseError> for Error {
49    fn from(p: ParseError) -> Self {
50        Error::Codec(format!("unexpected date or datetime format: {}", p))
51    }
52}
53
54#[cfg(feature = "json")]
55impl From<serde_json::Error> for Error {
56    fn from(err: serde_json::Error) -> Self {
57        Error::Codec(format!("unexpected json value: {}", err))
58    }
59}