1use std::{error, fmt, io};
2
3use crate::{token::TokenGenerationError, DisconnectReason, NETCODE_MAX_PAYLOAD_BYTES};
4use chacha20poly1305::aead::Error as CryptoError;
5
6#[derive(Debug)]
8pub enum NetcodeError {
9 UnavailablePrivateKey,
11 InvalidPacketType,
13 InvalidProtocolID,
15 InvalidVersion,
17 PacketTooSmall,
19 PayloadAboveLimit,
21 DuplicatedSequence,
23 NoMoreServers,
25 Expired,
27 Disconnected(DisconnectReason),
29 CryptoError,
31 NotInHostList,
33 ClientNotFound,
35 ClientNotConnected,
37 IoError(io::Error),
39 TokenGenerationError(TokenGenerationError),
41}
42
43impl fmt::Display for NetcodeError {
44 fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
45 use NetcodeError::*;
46
47 match *self {
48 UnavailablePrivateKey => write!(fmt, "no private key was found for this address"),
49 InvalidPacketType => write!(fmt, "invalid packet type"),
50 InvalidProtocolID => write!(fmt, "invalid protocol id"),
51 InvalidVersion => write!(fmt, "invalid version info"),
52 PacketTooSmall => write!(fmt, "packet is too small"),
53 PayloadAboveLimit => write!(fmt, "payload is above the {} bytes limit", NETCODE_MAX_PAYLOAD_BYTES),
54 Expired => write!(fmt, "connection expired"),
55 DuplicatedSequence => write!(fmt, "sequence already received"),
56 Disconnected(reason) => write!(fmt, "disconnected: {}", reason),
57 NoMoreServers => write!(fmt, "client has no more servers to connect"),
58 CryptoError => write!(fmt, "error while encoding or decoding"),
59 NotInHostList => write!(fmt, "token does not contain the server address"),
60 ClientNotFound => write!(fmt, "client was not found"),
61 ClientNotConnected => write!(fmt, "client is disconnected or connecting"),
62 IoError(ref err) => write!(fmt, "{}", err),
63 TokenGenerationError(ref err) => write!(fmt, "{}", err),
64 }
65 }
66}
67
68impl error::Error for NetcodeError {}
69
70impl From<io::Error> for NetcodeError {
71 fn from(inner: io::Error) -> Self {
72 NetcodeError::IoError(inner)
73 }
74}
75
76impl From<TokenGenerationError> for NetcodeError {
77 fn from(inner: TokenGenerationError) -> Self {
78 NetcodeError::TokenGenerationError(inner)
79 }
80}
81
82impl From<CryptoError> for NetcodeError {
83 fn from(_: CryptoError) -> Self {
84 NetcodeError::CryptoError
85 }
86}