1use std::fmt;
3use std::result;
4
5use protobuf;
6use protobuf::wire_format;
7use serde;
8use thiserror::Error;
9
10pub type Result<A> = result::Result<A, Error>;
12
13#[derive(Debug, Error)]
15pub enum Error {
16 #[error("protobuf error")]
18 Protobuf(#[source] protobuf::ProtobufError),
19 #[error("end of stream")]
21 EndOfStream,
22 #[error("unknown enum: {name}")]
24 UnknownEnum {
25 name: String,
27 },
28 #[error("unknown enum value: {value}")]
30 UnknownEnumValue {
31 value: i32,
33 },
34 #[error("unknown message: {name}")]
36 UnknownMessage {
37 name: String,
39 },
40 #[error("bad wire type: {wire_type:?}")]
42 BadWireType {
43 wire_type: wire_format::WireType,
45 },
46 #[error("bad default value: {default_value:?}")]
48 BadDefaultValue {
49 default_value: String,
51 },
52 #[error("{message}")]
54 Custom {
55 message: String,
57 },
58}
59
60pub type CompatResult<A> = result::Result<A, CompatError>;
62
63#[derive(Debug, Error)]
65pub struct CompatError(#[from] Error);
66
67impl From<protobuf::error::ProtobufError> for Error {
68 fn from(e: protobuf::error::ProtobufError) -> Self {
69 Error::Protobuf(e)
70 }
71}
72
73impl CompatError {
74 pub fn into_error(self) -> Error {
76 self.0
77 }
78}
79
80impl fmt::Display for CompatError {
81 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
82 self.0.fmt(f)
83 }
84}
85
86impl serde::de::Error for CompatError {
87 fn custom<T>(msg: T) -> CompatError
88 where
89 T: fmt::Display,
90 {
91 CompatError(Error::Custom {
92 message: msg.to_string(),
93 })
94 }
95}