grpc/
error.rs

1use std::error::Error as std_Error;
2use std::fmt;
3use std::io;
4
5use httpbis;
6
7use crate::proto::metadata;
8
9/// Error from gRPC protocol headers.
10#[derive(Debug)]
11pub struct GrpcMessageError {
12    /// Content of `grpc-status` header.
13    pub grpc_status: i32,
14
15    /// Content of `grpc-message` header.
16    pub grpc_message: String,
17}
18
19/// All grpc crate errors.
20#[derive(Debug)]
21pub enum Error {
22    /// I/O error.
23    Io(io::Error),
24    /// rust-http2 error.
25    Http(httpbis::Error),
26    /// Error from gRPC protocol.
27    GrpcMessage(GrpcMessageError),
28    /// Failed to decode megadata.
29    MetadataDecode(metadata::MetadataDecodeError),
30    /// Someone panicked.
31    Panic(String),
32    /// Marshaller error.
33    Marshaller(Box<dyn std_Error + Send + Sync>),
34    /// Other error.
35    // TODO: get rid of it.
36    Other(&'static str),
37}
38
39impl From<httpbis::SendError> for Error {
40    fn from(e: httpbis::SendError) -> Self {
41        Error::Http(httpbis::Error::from(e))
42    }
43}
44
45impl From<httpbis::StreamDead> for Error {
46    fn from(e: httpbis::StreamDead) -> Self {
47        Error::Http(httpbis::Error::from(e))
48    }
49}
50
51fn _assert_debug<D: ::std::fmt::Debug>(_: &D) {}
52
53fn _assert_grpc_error_debug(e: &Error) {
54    _assert_debug(e);
55}
56
57impl std_Error for Error {}
58
59impl fmt::Display for Error {
60    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
61        match self {
62            &Error::Io(ref err) => write!(f, "io error: {}", err),
63            &Error::Http(ref err) => write!(f, "http error: {}", err),
64            &Error::GrpcMessage(ref err) => write!(f, "grpc message error: {}", err.grpc_message),
65            &Error::MetadataDecode(..) => write!(f, "metadata decode error"),
66            &Error::Panic(ref message) => write!(f, "panic: {}", message),
67            &Error::Other(ref message) => write!(f, "other error: {}", message),
68            &Error::Marshaller(ref e) => write!(f, "marshaller error: {}", e),
69        }
70    }
71}
72
73impl From<io::Error> for Error {
74    fn from(err: io::Error) -> Self {
75        Error::Io(err)
76    }
77}
78
79impl From<httpbis::Error> for Error {
80    fn from(err: httpbis::Error) -> Self {
81        Error::Http(err)
82    }
83}
84
85impl From<Error> for io::Error {
86    fn from(err: Error) -> io::Error {
87        match err {
88            Error::Io(e) => e,
89            _ => io::Error::new(io::ErrorKind::Other, err),
90        }
91    }
92}
93
94impl From<metadata::MetadataDecodeError> for Error {
95    fn from(de: metadata::MetadataDecodeError) -> Self {
96        Error::MetadataDecode(de)
97    }
98}
99
100impl From<Error> for httpbis::Error {
101    fn from(err: Error) -> httpbis::Error {
102        httpbis::Error::StdError(Box::new(err))
103    }
104}