serde_protobuf/
error.rs

1//! Common error types for this crate.
2use std::fmt;
3use std::result;
4
5use protobuf;
6use protobuf::wire_format;
7use serde;
8use thiserror::Error;
9
10/// A result whose error type is `Error`.
11pub type Result<A> = result::Result<A, Error>;
12
13/// An error that may occur when dealing with Protobuf.
14#[derive(Debug, Error)]
15pub enum Error {
16    /// A native protobuf error.
17    #[error("protobuf error")]
18    Protobuf(#[source] protobuf::ProtobufError),
19    /// The end of stream was reached.
20    #[error("end of stream")]
21    EndOfStream,
22    /// An unknown enum type was encountered.
23    #[error("unknown enum: {name}")]
24    UnknownEnum {
25        /// The name of the enum.
26        name: String,
27    },
28    /// An unknown enum value was encountered.
29    #[error("unknown enum value: {value}")]
30    UnknownEnumValue {
31        /// The number of the enum value.
32        value: i32,
33    },
34    /// An unknown message type was encountered.
35    #[error("unknown message: {name}")]
36    UnknownMessage {
37        /// The name of the message.
38        name: String,
39    },
40    /// An unexpected wire type was received.
41    #[error("bad wire type: {wire_type:?}")]
42    BadWireType {
43        /// The encountered wire type.
44        wire_type: wire_format::WireType,
45    },
46    /// A default value that can't be parsed was received.
47    #[error("bad default value: {default_value:?}")]
48    BadDefaultValue {
49        /// The default value that couldn't be parsed.
50        default_value: String,
51    },
52    /// Some user-defined error occurred.
53    #[error("{message}")]
54    Custom {
55        /// The user-defined error message.
56        message: String,
57    },
58}
59
60/// A result whose error type is `CompatError`.
61pub type CompatResult<A> = result::Result<A, CompatError>;
62
63/// A compatibility error for use with `serde`.
64#[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    /// Converts this compatibility error into the underlying error.
75    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}