use thiserror::Error;
#[derive(Debug, Error)]
pub enum Error {
#[error("IO error: {0}")]
Io(#[from] std::io::Error),
#[error("Invalid region: {0}")]
InvalidRegion(String),
#[error("Connection failed to {host}:{port}")]
ConnectionFailed {
host: String,
port: u16,
},
#[error("Connection timed out after {timeout_secs}s to {host}:{port}")]
ConnectionTimeout {
host: String,
port: u16,
timeout_secs: u64,
},
#[error("Failed to send request")]
SendFailed,
#[error("Failed to receive response")]
ReceiveFailed,
#[error("Invalid response format")]
InvalidResponse,
#[error("MIME parsing error: {0}")]
MimeParseError(String),
#[error("Checksum validation failed")]
ChecksumMismatch,
#[error("ASN.1 parsing error: {0}")]
Asn1Error(String),
#[error("Parse error: {0}")]
ParseError(String),
}
pub type Result<T> = std::result::Result<T, Error>;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_error_display() {
let err = Error::InvalidRegion("xyz".to_string());
assert_eq!(err.to_string(), "Invalid region: xyz");
let err = Error::ConnectionFailed {
host: "test.battle.net".to_string(),
port: 1119,
};
assert_eq!(err.to_string(), "Connection failed to test.battle.net:1119");
let err = Error::ConnectionTimeout {
host: "test.battle.net".to_string(),
port: 1119,
timeout_secs: 10,
};
assert_eq!(
err.to_string(),
"Connection timed out after 10s to test.battle.net:1119"
);
let err = Error::SendFailed;
assert_eq!(err.to_string(), "Failed to send request");
let err = Error::ReceiveFailed;
assert_eq!(err.to_string(), "Failed to receive response");
let err = Error::InvalidResponse;
assert_eq!(err.to_string(), "Invalid response format");
let err = Error::MimeParseError("bad format".to_string());
assert_eq!(err.to_string(), "MIME parsing error: bad format");
let err = Error::ChecksumMismatch;
assert_eq!(err.to_string(), "Checksum validation failed");
let err = Error::Asn1Error("invalid ASN.1".to_string());
assert_eq!(err.to_string(), "ASN.1 parsing error: invalid ASN.1");
let err = Error::ParseError("invalid BPSV".to_string());
assert_eq!(err.to_string(), "Parse error: invalid BPSV");
}
#[test]
fn test_error_from_io() {
use std::io::{Error as IoError, ErrorKind};
let io_err = IoError::new(ErrorKind::ConnectionRefused, "refused");
let err: Error = io_err.into();
match err {
Error::Io(_) => {}
_ => panic!("Expected Error::Io variant"),
}
}
}