rust_openttd_admin/packet/admin/
mod.rs

1//! Provides API for communicating with the OpenTTD admin interface. To read
2//! packets, import [`AdminRead`](crate::packet::admin::AdminRead), which provides [`read_packet`](crate::packet::admin::AdminRead#read_packet).
3//! To write packets, import [`AdminWrite`](crate::packet::admin::AdminWrite), which provides [`write_packet`](crate::packet::admin::AdminRead#write_packet).
4//! The packets themselves are defined in the submodules [`client_packets`](crate::packet::admin::client_packets) and
5//! [`server_packets`](crate::packet::admin::server_packets).
6
7pub mod client_packets;
8pub mod server_packets;
9
10#[cfg(test)]
11mod test;
12
13pub use crate::packet::serde::{PacketRead, PacketWrite, Result};
14
15/// Provides the function [`AdminRead::read_packet`]. It is implemented for any type implementing std::io::Read via PacketRead.
16pub trait AdminRead {
17    fn read_packet(&mut self) -> Result<server_packets::Packet>;
18}
19
20impl<T: PacketRead> AdminRead for T {
21    fn read_packet(&mut self) -> Result<server_packets::Packet> {
22        let (packet_type, buffer) = PacketRead::read_packet(self)?;
23        use crate::packet::serde::from_bytes;
24        use server_packets::Packet::*;
25        Ok(match packet_type {
26            100 => Full,
27            101 => Banned,
28            102 => Error(from_bytes(&buffer)?),
29            103 => Protocol(from_bytes(&buffer)?),
30            104 => Welcome(from_bytes(&buffer)?),
31            105 => Newgame,
32            106 => Shutdown,
33            107 => Date(from_bytes(&buffer)?),
34            108 => ClientJoin(from_bytes(&buffer)?),
35            109 => ClientInfo(from_bytes(&buffer)?),
36            110 => ClientUpdate(from_bytes(&buffer)?),
37            111 => ClientQuit(from_bytes(&buffer)?),
38            112 => ClientError(from_bytes(&buffer)?),
39            113 => CompanyNew(from_bytes(&buffer)?),
40            114 => CompanyInfo(from_bytes(&buffer)?),
41            115 => CompanyUpdate(from_bytes(&buffer)?),
42            116 => CompanyRemove(from_bytes(&buffer)?),
43            117 => CompanyEconomy(from_bytes(&buffer)?),
44            118 => CompanyStats(from_bytes(&buffer)?),
45            119 => Chat(from_bytes(&buffer)?),
46            120 => Rcon(from_bytes(&buffer)?),
47            121 => Console(from_bytes(&buffer)?),
48            122 => CmdNames(from_bytes(&buffer)?),
49            123 => CmdLogging(from_bytes(&buffer)?),
50            124 => Gamescript(from_bytes(&buffer)?),
51            125 => RconEnd(from_bytes(&buffer)?),
52            126 => Pong(from_bytes(&buffer)?),
53            _ => UnknownPacket {
54                packet_type,
55                buffer,
56            },
57        })
58    }
59}
60
61/// Provides the function [`AdminWrite::write_packet`] to a type implementing
62/// [`std::io::Write`].
63pub trait AdminWrite<T: client_packets::Packet> {
64    fn write_packet(&mut self, value: &T) -> Result<()>;
65}
66
67impl<T: client_packets::Packet, W: PacketWrite<T>> AdminWrite<T> for W {
68    fn write_packet(&mut self, value: &T) -> Result<()> {
69        self.write_packet(value)
70    }
71}