doip_definitions/error.rs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283
use thiserror::Error;
/// The root of all error types within this crate.
///
/// Built purely for descriptive errors during tracebacks and development
/// the `ParseError` houses the error types down to the individual possible errors
/// each `PayloadType` can come across.
#[derive(Error, Debug, PartialEq)]
pub enum ParseError {
/// When an empty buffer is passed into a `DoipMessage::parse_from_bytes`.
#[error("empty input")]
EmptyInput,
/// When a buffer contains an invalid protocol response from the server.
#[error("invalid protocol version")]
InvalidProtocolVersion,
/// When the Inverse Protocol Version is not the inverse byte of the protocol
/// version.
#[error("failed protocol check")]
FailedProtocolCheck,
/// When the `DoipMessage::parse_from_bytes` attemps to get a byte in which
/// there is no index available.
#[error("index failure")]
IndexFailure,
/// When the length of the buffer minus the header size is less than the
/// `Payload Length` in the header.
#[error("incomplete payload")]
IncompletePayload,
/// Error parsing a specific payload.
#[error("payload parse error")]
PayloadParse(#[from] PayloadError),
}
/// Specific payload type errors.
///
/// Most of these errors are derived from the failure paths of parsing the buffer
/// into a `DoipMessage`
#[derive(Error, Debug, PartialEq)]
pub enum PayloadError {
/// Parse error for Alive Check Response payload type.
#[error("alive check payload parse failure")]
AliveCheckResponseParseError(#[from] AliveCheckResponseError),
/// Parse error for Diagnostic Message Nack payload type.
#[error("diuagnostic message negative acknolwedgement payload parse failure")]
DiagnosticMessageNackParseError(#[from] DiagnosticMessageNackError),
/// Parse error for Diagnostic Message Ack payload type.
#[error("diagnostic message acknowledgement payload parse failure")]
DiagnosticMessageAckError(#[from] DiagnosticMessageAckError),
/// Parse error for Diagnostic Message payload type.
#[error("diagnostic message payload parse failure")]
DiagnosticMessageError(#[from] DiagnosticMessageError),
/// Parse error for Entity Status Response payload type.
#[error("entity status response payload parse failure")]
EntityStatusResponseError(#[from] EntityStatusResponseError),
/// Parse error for Generic Nack payload type.
#[error("generic nack payload parse failure")]
GenericNackError(#[from] GenericNackError),
/// Parse error for Power Information Response payload type.
#[error("power information response payload parse failure")]
PowerInformationResponseError(#[from] PowerInformationResponseError),
/// Parse error for Routing Activation Request payload type.
#[error("routing activation request payload parse failure")]
RoutingActivationRequestError(#[from] RoutingActivationRequestError),
/// Parse error for Routing Activation Response payload type.
#[error("routing activation response payload parse failure")]
RoutingActivationResponseError(#[from] RoutingActivationResponseError),
/// Parse error for Vehicle Announcement Message payload type.
#[error("vehicle announcement message payload parse failure")]
VehicleAnnouncementMessageError(#[from] VehicleAnnouncementMessageError),
/// Parse error for Vehicle Identification Request Eid payload type.
#[error("vehicle identification request with eid payload parse failure")]
VehicleIdentificationRequestEidError(#[from] VehicleIdentificationRequestEidError),
/// Parse error for Vehicle Identification Request Vin payload type.
#[error("vehicle identification request with vin payload parse failure")]
VehicleIdentificationRequestVinError(#[from] VehicleIdentificationRequestVinError),
/// Urecognised payload type in buffer.
#[error("invalid payload type")]
InvalidPayloadType,
}
/// Parse error for Alive Check Response payload type.
#[derive(Error, Debug, PartialEq)]
pub enum AliveCheckResponseError {
/// The length of the buffer passed is too short to be parsed into this payload
/// type.
#[error("length of bytes is too short")]
InvalidLength,
/// The parser attempted to access a byte which was not present.
#[error("invalid index range supplied")]
InvalidIndexRange,
}
/// Parse error for Diagnostic Message Ack payload type.
#[derive(Error, Debug, PartialEq)]
pub enum DiagnosticMessageAckError {
/// The length of the buffer passed is too short to be parsed into this payload
/// type.
#[error("length of bytes is too short")]
InvalidLength,
/// The parser attempted to access a byte which was not present.
#[error("invalid index range supplied")]
InvalidIndexRange,
/// Invalid Ack Code passed to the parser.
#[error("invalid acknowledgement code")]
InvalidAckCode,
}
/// Parse error for Diagnostic Message Nack payload type.
#[derive(Error, Debug, PartialEq)]
pub enum DiagnosticMessageNackError {
/// The length of the buffer passed is too short to be parsed into this payload
/// type.
#[error("length of bytes is too short")]
InvalidLength,
/// The parser attempted to access a byte which was not present.
#[error("invalid index range supplied")]
InvalidIndexRange,
/// Invalid Nack Code passed to the parser.
#[error("invalid negative acknowledgement code")]
InvalidNackCode,
}
/// Parse error for Diagnostic Message payload type.
#[derive(Error, Debug, PartialEq)]
pub enum DiagnosticMessageError {
/// The length of the buffer passed is too short to be parsed into this payload
/// type.
#[error("length of bytes is too short")]
InvalidLength,
/// The parser attempted to access a byte which was not present.
#[error("invalid index range supplied")]
InvalidIndexRange,
}
/// Parse error for Entity Status Response payload type.
#[derive(Error, Debug, PartialEq)]
pub enum EntityStatusResponseError {
/// The length of the buffer passed is too short to be parsed into this payload
/// type.
#[error("length of bytes is too short")]
InvalidLength,
/// The parser attempted to access a byte which was not present.
#[error("invalid index range supplied")]
InvalidIndexRange,
/// Invalid Node Type passed to the parser.
#[error("invalid node type")]
InvalidNodeType,
}
/// Parse error for Generic Nack payload type.
#[derive(Error, Debug, PartialEq)]
pub enum GenericNackError {
/// The length of the buffer passed is too short to be parsed into this payload
/// type.
#[error("length of bytes is too short")]
InvalidLength,
/// The parser attempted to access a byte which was not present.
#[error("invalid index range supplied")]
InvalidIndexRange,
/// Invalid Nack Code passed to the parser.
#[error("invalid nack code")]
InvalidNackCode,
}
/// Parse error for Power Information Response payload type.
#[derive(Error, Debug, PartialEq)]
pub enum PowerInformationResponseError {
/// The length of the buffer passed is too short to be parsed into this payload
/// type.
#[error("length of bytes is too short")]
InvalidLength,
/// The parser attempted to access a byte which was not present.
#[error("invalid index range supplied")]
InvalidIndexRange,
/// Invalid Power Mode passed to the parser.
#[error("powermode not supported")]
InvalidPowerMode,
}
/// Parse error for Routing Activation Request payload type.
#[derive(Error, Debug, PartialEq)]
pub enum RoutingActivationRequestError {
/// The length of the buffer passed is too short to be parsed into this payload
/// type.
#[error("length of bytes is too short")]
InvalidLength,
/// The parser attempted to access a byte which was not present.
#[error("invalid index range supplied")]
InvalidIndexRange,
/// Invalid Activation Type passed to the parser.
#[error("activation type not supported")]
InvalidActivationType,
}
/// Parse error for Routing Activation Response payload type.
#[derive(Error, Debug, PartialEq)]
pub enum RoutingActivationResponseError {
/// The length of the buffer passed is too short to be parsed into this payload
/// type.
#[error("length of bytes is too short")]
InvalidLength,
/// The parser attempted to access a byte which was not present.
#[error("invalid index range supplied")]
InvalidIndexRange,
/// Invalid Activation Code passed to the parser.
#[error("activation code not supported")]
InvalidActivationCode,
}
/// Parse error for Vehicle Announcement Message payload type.
#[derive(Error, Debug, PartialEq)]
pub enum VehicleAnnouncementMessageError {
/// The length of the buffer passed is too short to be parsed into this payload
/// type.
#[error("length of bytes is too short")]
InvalidLength,
/// The parser attempted to access a byte which was not present.
#[error("invalid index range supplied")]
InvalidIndexRange,
/// Invalid Action Code passed to the parser.
#[error("action code not supported")]
InvalidActionCode,
}
/// Parse error for Vehicle Identification Request Eid payload type.
#[derive(Error, Debug, PartialEq)]
pub enum VehicleIdentificationRequestEidError {
/// The length of the buffer passed is too short to be parsed into this payload
/// type.
#[error("length of bytes is too short")]
InvalidLength,
/// The parser attempted to access a byte which was not present.
#[error("invalid index range supplied")]
InvalidIndexRange,
}
/// Parse error for Vehicle Identification Request Vin payload type.
#[derive(Error, Debug, PartialEq)]
pub enum VehicleIdentificationRequestVinError {
/// The length of the buffer passed is too short to be parsed into this payload
/// type.
#[error("length of bytes is too short")]
InvalidLength,
/// The parser attempted to access a byte which was not present.
#[error("invalid index range supplied")]
InvalidIndexRange,
}