/rust/registry/src/index.crates.io-1949cf8c6b5b557f/protobuf-3.7.2/src/error.rs
Line | Count | Source |
1 | | use std::io; |
2 | | use std::str; |
3 | | |
4 | | use crate::reflect::error::ReflectError; |
5 | | use crate::wire_format::WireType; |
6 | | |
7 | | /// [`Result`] alias for [`Error`]. |
8 | | pub type Result<T> = std::result::Result<T, crate::Error>; |
9 | | |
10 | | /// Enum values added here for diagnostic purposes. |
11 | | /// Users should not depend on specific values. |
12 | | #[derive(Debug, thiserror::Error)] |
13 | | pub(crate) enum WireError { |
14 | | #[error("Unexpected EOF")] |
15 | | UnexpectedEof, |
16 | | #[error("Unexpected wire type")] |
17 | | UnexpectedWireType(WireType), |
18 | | #[error("Incorrect tag")] |
19 | | IncorrectTag(u32), |
20 | | #[error("Incorrect varint")] |
21 | | IncorrectVarint, |
22 | | #[error("Invalid UTF-8 sequence")] |
23 | | Utf8Error, |
24 | | #[error("Invalid enum `{}` value: {}", .0, .1)] |
25 | | InvalidEnumValue(&'static str, i32), |
26 | | #[error("Over recursion limit")] |
27 | | OverRecursionLimit, |
28 | | #[error("Truncated message")] |
29 | | TruncatedMessage, |
30 | | // not really possible |
31 | | #[error("Limit overflow")] |
32 | | LimitOverflow, |
33 | | #[error("New limit must not be greater than current limit")] |
34 | | LimitIncrease, |
35 | | #[error("Encoded message size {0} is too large")] |
36 | | MessageTooLarge(u64), |
37 | | #[error("Value too large for u32: {}", .0)] |
38 | | U32Overflow(u64), |
39 | | #[error("Value too large for i32: {}", .0)] |
40 | | I32Overflow(i64), |
41 | | } |
42 | | |
43 | | /// Generic protobuf error |
44 | | #[derive(Debug, thiserror::Error)] |
45 | | pub(crate) enum ProtobufError { |
46 | | /// I/O error when reading or writing |
47 | | #[error(transparent)] |
48 | | IoError(#[from] io::Error), |
49 | | /// Malformed input |
50 | | #[error(transparent)] |
51 | | WireError(#[from] WireError), |
52 | | #[error(transparent)] |
53 | | Reflect(#[from] ReflectError), |
54 | | /// Protocol contains a string which is not valid UTF-8 string |
55 | | #[error("UTF-8 decode error")] |
56 | | Utf8( |
57 | | #[source] |
58 | | #[from] |
59 | | str::Utf8Error, |
60 | | ), |
61 | | /// Not all required fields of message set. |
62 | | #[error("Message `{}` is missing required fields", .0)] |
63 | | MessageNotInitialized(String), |
64 | | /// Message is too large. |
65 | | #[error("Provided buffer has not enough capacity to write message `{0}`")] |
66 | | BufferHasNotEnoughCapacity(String), |
67 | | /// Protobuf type and runtime types mismatch. |
68 | | #[error("Protobuf type and runtime types are not compatible")] |
69 | | IncompatibleProtobufTypeAndRuntimeType, |
70 | | /// Group field type not implemented. |
71 | | #[error("Group field is not supported")] |
72 | | GroupIsNotImplemented, |
73 | | } |
74 | | |
75 | | /// Error type for protobuf operations. |
76 | | #[derive(Debug, thiserror::Error)] |
77 | | #[error(transparent)] |
78 | | pub struct Error(pub(crate) Box<ProtobufError>); |
79 | | |
80 | | impl From<ProtobufError> for Error { |
81 | | #[cold] |
82 | 0 | fn from(e: ProtobufError) -> Self { |
83 | 0 | Self(Box::new(e)) |
84 | 0 | } |
85 | | } |
86 | | |
87 | | impl From<WireError> for Error { |
88 | | #[cold] |
89 | 0 | fn from(e: WireError) -> Self { |
90 | 0 | Self(Box::new(ProtobufError::WireError(e))) |
91 | 0 | } |
92 | | } |
93 | | |
94 | | impl From<ReflectError> for Error { |
95 | | #[cold] |
96 | 0 | fn from(e: ReflectError) -> Self { |
97 | 0 | Self(Box::new(ProtobufError::Reflect(e))) |
98 | 0 | } |
99 | | } |
100 | | |
101 | | impl From<Error> for io::Error { |
102 | | #[cold] |
103 | 0 | fn from(err: Error) -> Self { |
104 | 0 | match *err.0 { |
105 | 0 | ProtobufError::IoError(e) => e, |
106 | 0 | ProtobufError::WireError(e) => { |
107 | 0 | io::Error::new(io::ErrorKind::InvalidData, ProtobufError::WireError(e)) |
108 | | } |
109 | 0 | ProtobufError::MessageNotInitialized(message) => io::Error::new( |
110 | 0 | io::ErrorKind::InvalidInput, |
111 | 0 | ProtobufError::MessageNotInitialized(message), |
112 | | ), |
113 | 0 | e => io::Error::new(io::ErrorKind::Other, Box::new(e)), |
114 | | } |
115 | 0 | } |
116 | | } |
117 | | |
118 | | impl From<io::Error> for Error { |
119 | | #[cold] |
120 | 0 | fn from(err: io::Error) -> Self { |
121 | 0 | Error(Box::new(ProtobufError::IoError(err))) |
122 | 0 | } |
123 | | } |
124 | | |
125 | | #[cfg(test)] |
126 | | mod test { |
127 | | use std::mem; |
128 | | |
129 | | #[test] |
130 | | fn error_size() { |
131 | | assert_eq!(mem::size_of::<usize>(), mem::size_of::<crate::Error>()); |
132 | | } |
133 | | } |