1use std::error::Error as std_Error;
2use std::fmt;
3use std::io;
4
5use httpbis;
6
7use crate::proto::metadata;
8
9#[derive(Debug)]
11pub struct GrpcMessageError {
12 pub grpc_status: i32,
14
15 pub grpc_message: String,
17}
18
19#[derive(Debug)]
21pub enum Error {
22 Io(io::Error),
24 Http(httpbis::Error),
26 GrpcMessage(GrpcMessageError),
28 MetadataDecode(metadata::MetadataDecodeError),
30 Panic(String),
32 Marshaller(Box<dyn std_Error + Send + Sync>),
34 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}