1use std::{convert::From, fmt};
2
3#[derive(Debug)]
5pub enum ErrorKind {
6 Http(reqwest::Error),
8 HttpStatus(reqwest::StatusCode),
10 Metadata(String),
12 TonicMetadata(tonic::metadata::errors::InvalidMetadataValue),
13 Jwt(jsonwebtoken::errors::Error),
15 TokenSource,
17 CredentialsJson(serde_json::Error),
19 CredentialsFile(std::io::Error),
21 TokenJson(serde_json::Error),
23 TokenData,
25 GrpcStatus(tonic::transport::Error),
26 UrlError(hyper::http::uri::InvalidUri),
27 ExternalCredsSourceError(String),
28 #[doc(hidden)]
29 __Nonexhaustive,
30}
31
32#[derive(Debug)]
34pub struct Error(Box<ErrorKind>);
35
36impl Error {
37 pub fn kind(&self) -> &ErrorKind {
39 &self.0
40 }
41
42 pub fn into_kind(self) -> ErrorKind {
44 *self.0
45 }
46}
47
48impl fmt::Display for Error {
49 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
50 use ErrorKind::*;
51 match *self.0 {
52 Http(ref e) => write!(f, "http error: {}", e),
53 HttpStatus(ref s) => write!(f, "http status error: {}", s),
54 Metadata(ref e) => write!(f, "gce metadata service error: {}", e),
55 Jwt(ref e) => write!(f, "jwt error: {}", e),
56 TokenSource => write!(f, "token source error: not found token source"),
57 CredentialsJson(ref e) => write!(f, "credentials json error: {}", e),
58 CredentialsFile(ref e) => write!(f, "credentials file error: {}", e),
59 TokenJson(ref e) => write!(f, "token json error: {}", e),
60 TokenData => write!(f, "token data error: invalid token response data"),
61 GrpcStatus(ref e) => write!(f, "Tonic/gRPC error: {}", e),
62 TonicMetadata(ref e) => write!(f, "Tonic metadata error: {}", e),
63 UrlError(ref e) => write!(f, "Url error: {}", e),
64 ExternalCredsSourceError(ref e) => write!(f, "External creds source error: {}", e),
65 __Nonexhaustive => write!(f, "unknown error"),
66 }
67 }
68}
69
70impl std::error::Error for Error {}
71
72impl From<reqwest::Error> for Error {
73 fn from(e: reqwest::Error) -> Self {
74 ErrorKind::Http(e).into()
75 }
76}
77
78impl From<jsonwebtoken::errors::Error> for Error {
79 fn from(e: jsonwebtoken::errors::Error) -> Self {
80 ErrorKind::Jwt(e).into()
81 }
82}
83
84impl From<ErrorKind> for Error {
85 fn from(k: ErrorKind) -> Self {
86 Error(Box::new(k))
87 }
88}
89
90impl From<tonic::transport::Error> for Error {
91 fn from(e: tonic::transport::Error) -> Self {
92 ErrorKind::GrpcStatus(e).into()
93 }
94}
95
96impl From<tonic::metadata::errors::InvalidMetadataValue> for Error {
97 fn from(e: tonic::metadata::errors::InvalidMetadataValue) -> Self {
98 ErrorKind::TonicMetadata(e).into()
99 }
100}
101
102impl From<hyper::http::uri::InvalidUri> for Error {
103 fn from(e: hyper::http::uri::InvalidUri) -> Self {
104 ErrorKind::UrlError(e).into()
105 }
106}
107
108pub type Result<T> = std::result::Result<T, Error>;