use thiserror::Error;
#[derive(Error, Debug)]
pub enum FsdMessageParseError {
#[error("invalid field count. Expected {0}, found {1}.")]
InvalidFieldCount(usize, usize),
#[error("{0} is not a valid rating")]
InvalidRating(String),
#[error("{0} is not a valid protocol revision")]
InvalidProtocolRevison(String),
#[error("{0} is not a valid flight rules")]
InvalidFlightRules(String),
#[error("{0} is not a valid simulator type")]
InvalidSimulatorType(String),
#[error("{0} is not a valid ATC type")]
InvalidAtcType(String),
#[error("{0} is not a valid time")]
InvalidTime(String),
#[error("{0} is not a valid minute")]
InvalidMinute(String),
#[error("{0} is not a valid index")]
InvalidIndex(String),
#[error("{0} is not a valid ATC frequency")]
InvalidFrequency(String),
#[error("{0} is not a valid visibility range")]
InvalidVisRange(String),
#[error("{0} is not a valid lat / long coordinate")]
InvalidCoordinate(String),
#[error("{0} is not a transponder mode")]
InvalidTransponderMode(String),
#[error("{0} is not a transponder code")]
InvalidTransponderCode(String),
#[error("Unable to parse aircraft config: {0}")]
InvalidAircraftConfig(String),
#[error("{0} is not a valid pitch / bank / heading number")]
InvalidPitchBankHeading(String),
#[error("{0} is not a valid altitude")]
InvalidAltitude(String),
#[error("{0} is not a valid altitude difference")]
InvalidAltitudeDifference(String),
#[error("{0} is not a valid voice capability")]
InvalidVoiceCapability(String),
#[error("{0} is not a valid speed")]
InvalidSpeed(String),
#[error("{0} is not a valid client ID")]
InvalidClientID(String),
#[error("{0} is not a valid version number part")]
InvalidVersionNumber(String),
#[error("{0} is not a valid nosewheel angle")]
InvalidNosewheelAngle(String),
#[error("{0} is not a valid position velocity")]
InvalidPositionVelocity(String),
#[error("Unknown message type: {0}")]
UnknownMessageType(String),
#[error("{0} is not a valid ping time")]
InvalidPingTime(String),
#[error("{0} is not a valid server error")]
InvalidServerError(String),
#[error("{0} is not a valid client query type")]
InvalidClientQueryType(String),
#[error("{0} is not a valid new ATIS message")]
InvalidNewAtisMessage(String),
#[error("{0} is not a valid valid ATC status")]
InvalidValidAtcStatus(String),
#[error("{0} is not a valid valid ATIS line")]
InvalidATISLine(String),
#[error("{0} is not a valid valid shared state type")]
InvalidSharedStateType(String),
#[error("{0} is not a valid client capability")]
InvalidClientCapability(String),
}
#[derive(Debug, Clone, Error)]
pub enum FsdError {
#[error("Callsign in use")]
CallsignInUse,
#[error("Invalid callsign")]
InvalidCallsign,
#[error("Already registered")]
AlreadyRegistered,
#[error("Syntax error")]
SyntaxError,
#[error("Invalid source callsign")]
InvalidSourceCallsign,
#[error("Invalid CID / password")]
InvalidCidPassword,
#[error("No such callsign as {0}")]
NoSuchCallsign(String),
#[error("No flight plan for {0}")]
NoFlightPlan(String),
#[error("No weather profile for {0}")]
NoWeatherProfile(String),
#[error("Invalid protocol revision")]
InvalidProtocolRevision,
#[error("Requested level too high")]
RequestedLevelTooHigh,
#[error("Server full")]
ServerFull,
#[error("CID has been suspended")]
CertificateSuspended,
#[error("Invalid control")]
InvalidControl,
#[error("Invalid position for rating")]
InvalidPositionForRating,
#[error("Unauthorised client")]
UnauthorisedClient,
#[error("Authentication time out")]
AuthTimeOut,
#[error("Other: {0}")]
Other(String),
}
impl FsdError {
pub fn error_number(&self) -> u8 {
match *self {
FsdError::CallsignInUse => 1,
FsdError::InvalidCallsign => 2,
FsdError::AlreadyRegistered => 3,
FsdError::SyntaxError => 4,
FsdError::InvalidSourceCallsign => 5,
FsdError::InvalidCidPassword => 6,
FsdError::NoSuchCallsign(_) => 7,
FsdError::NoFlightPlan(_) => 8,
FsdError::NoWeatherProfile(_) => 9,
FsdError::InvalidProtocolRevision => 10,
FsdError::RequestedLevelTooHigh => 11,
FsdError::ServerFull => 12,
FsdError::CertificateSuspended => 13,
FsdError::InvalidControl => 14,
FsdError::InvalidPositionForRating => 15,
FsdError::UnauthorisedClient => 16,
FsdError::AuthTimeOut => 17,
FsdError::Other(_) => 18,
}
}
}