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}