#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
#[repr(u16)]
pub enum PexErrorCode {
BadMessage = 1,
UnsupportedVersion = 2,
RateViolation = 3,
Oversized = 4,
NetworkMismatch = 5,
ProtocolViolation = 6,
}
impl PexErrorCode {
#[must_use]
pub fn as_u16(self) -> u16 {
self as u16
}
#[must_use]
pub fn message(self) -> &'static str {
match self {
PexErrorCode::BadMessage => "bad message",
PexErrorCode::UnsupportedVersion => "unsupported version",
PexErrorCode::RateViolation => "rate violation",
PexErrorCode::Oversized => "oversized",
PexErrorCode::NetworkMismatch => "network mismatch",
PexErrorCode::ProtocolViolation => "protocol violation",
}
}
#[must_use]
pub fn is_strike(self) -> bool {
matches!(
self,
PexErrorCode::BadMessage
| PexErrorCode::RateViolation
| PexErrorCode::Oversized
| PexErrorCode::ProtocolViolation
)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum EntrySkip {
BadPeerId,
SelfOrPartner,
BadAddress,
TooManyAddresses,
TooManyFlags,
NetworkMismatch,
BadVia,
TooOld,
OversizePayment,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn codes_match_spec_table() {
assert_eq!(PexErrorCode::BadMessage.as_u16(), 1);
assert_eq!(PexErrorCode::UnsupportedVersion.as_u16(), 2);
assert_eq!(PexErrorCode::RateViolation.as_u16(), 3);
assert_eq!(PexErrorCode::Oversized.as_u16(), 4);
assert_eq!(PexErrorCode::NetworkMismatch.as_u16(), 5);
assert_eq!(PexErrorCode::ProtocolViolation.as_u16(), 6);
}
#[test]
fn strike_classification() {
assert!(PexErrorCode::BadMessage.is_strike());
assert!(PexErrorCode::RateViolation.is_strike());
assert!(PexErrorCode::Oversized.is_strike());
assert!(PexErrorCode::ProtocolViolation.is_strike());
assert!(!PexErrorCode::UnsupportedVersion.is_strike());
assert!(!PexErrorCode::NetworkMismatch.is_strike());
}
#[test]
fn messages_are_stable() {
assert_eq!(PexErrorCode::RateViolation.message(), "rate violation");
}
}