use std::io::{self, ErrorKind};
use thiserror::Error;
#[derive(Error, Debug)]
pub enum MinecraftProtocolError {
#[error("invalid varint data")]
InvalidVarInt,
#[error("invalid state")]
InvalidState,
#[error("invalid status response")]
InvalidStatusResponse,
}
impl From<MinecraftProtocolError> for io::Error {
fn from(err: MinecraftProtocolError) -> Self {
io::Error::new(ErrorKind::InvalidData, err)
}
}
#[derive(Error, Debug)]
pub enum RconProtocolError {
#[error("non-ascii payload")]
NonAsciiPayload,
#[error("authentication failed")]
AuthFailed,
#[error("invalid packet type")]
InvalidPacketType,
#[error("invalid rcon response")]
InvalidRconResponse,
#[error("payload too long")]
PayloadTooLong,
#[error("request id mismatch")]
RequestIdMismatch,
}
impl From<RconProtocolError> for io::Error {
fn from(err: RconProtocolError) -> Self {
io::Error::new(ErrorKind::InvalidData, err)
}
}
#[derive(Error, Debug)]
pub enum QueryProtocolError {
#[error("invalid packet type")]
InvalidPacketType,
#[error("unexpected packet type")]
UnexpectedPacketType,
#[error("session id mismatch")]
SessionIdMismatch,
#[error("invalid challenge token")]
InvalidChallengeToken,
#[error("cannot parse int")]
CannotParseInt,
#[error("invalid UTF-8")]
InvalidUtf8,
#[error("invalid key/value section")]
InvalidKeyValueSection,
}
impl From<QueryProtocolError> for io::Error {
fn from(err: QueryProtocolError) -> Self {
io::Error::new(ErrorKind::InvalidData, err)
}
}
pub(crate) fn timeout_err<T>() -> io::Result<T> {
Err(io::Error::new(ErrorKind::TimedOut, "connection timed out"))
}