1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
// SPDX-License-Identifier: LGPL-3.0-only
// SPDX-FileCopyrightText: 2023 Denis Drakhnia <numas13@gmail.com>

#![deny(unsafe_code)]
#![deny(missing_docs)]

//! Xash3D protocol between clients, servers and masters.

#[macro_use]
extern crate log;

mod cursor;
mod server_info;

pub mod admin;
pub mod color;
pub mod filter;
pub mod game;
pub mod master;
pub mod server;
pub mod wrappers;

pub use cursor::Error as CursorError;
pub use server_info::ServerInfo;

use thiserror::Error;

use crate::filter::Version;

/// Current protocol version.
pub const PROTOCOL_VERSION: u8 = 49;
/// Current client version.
pub const CLIENT_VERSION: Version = Version::new(0, 20);

/// The error type for decoding and encoding packets.
#[derive(Error, Debug, PartialEq, Eq)]
pub enum Error {
    /// Failed to decode a packet.
    #[error("Invalid packet")]
    InvalidPacket,
    /// Invalid region.
    #[error("Invalid region")]
    InvalidRegion,
    /// Invalid client announce IP.
    #[error("Invalid client announce IP")]
    InvalidClientAnnounceIp,
    /// Invalid last IP.
    #[error("Invalid last server IP")]
    InvalidQueryServersLast,
    /// Server protocol version is not supported.
    #[error("Invalid protocol version")]
    InvalidProtocolVersion,
    /// Cursor error.
    #[error("{0}")]
    CursorError(#[from] CursorError),
    /// Invalid value for server add packet.
    #[error("Invalid value for server add key `{0}`: {1}")]
    InvalidServerValue(&'static str, #[source] CursorError),
    /// Invalid value for query servers packet.
    #[error("Invalid value for filter key `{0}`: {1}")]
    InvalidFilterValue(&'static str, #[source] CursorError),
}