Skip to main content

kojacoord_protocol/versions/v1_19_4/handshake/
mod.rs

1use bytes::{Bytes, BytesMut};
2
3use crate::codec::{Decode, Encode, PacketId};
4use crate::error::ProtocolError;
5use crate::types::VarInt;
6
7#[derive(Debug, Clone, PartialEq)]
8pub struct ServerboundHandshake {
9    pub protocol_version: VarInt,
10
11    pub server_address: String,
12
13    pub server_port: u16,
14
15    pub next_state: VarInt,
16}
17
18impl PacketId for ServerboundHandshake {
19    fn packet_id(_ver: u32) -> u8 {
20        0x00
21    }
22}
23
24impl Encode for ServerboundHandshake {
25    fn encode(&self, dst: &mut BytesMut) -> Result<(), ProtocolError> {
26        self.protocol_version.encode(dst)?;
27        self.server_address.encode(dst)?;
28        self.server_port.encode(dst)?;
29        self.next_state.encode(dst)
30    }
31}
32
33impl Decode for ServerboundHandshake {
34    fn decode(src: &mut Bytes) -> Result<Self, ProtocolError> {
35        let protocol_version = VarInt::decode(src)?;
36        let server_address = String::decode(src)?;
37        let server_port = u16::decode(src)?;
38        let next_state = VarInt::decode(src)?;
39        Ok(Self {
40            protocol_version,
41            server_address,
42            server_port,
43            next_state,
44        })
45    }
46}
47
48#[cfg(test)]
49mod tests {
50    use super::*;
51
52    #[test]
53    fn roundtrip() {
54        let p = ServerboundHandshake {
55            protocol_version: VarInt(762),
56            server_address: "mc.example.com".to_string(),
57            server_port: 25565,
58            next_state: VarInt(2),
59        };
60        let mut buf = BytesMut::new();
61        p.encode(&mut buf).unwrap();
62        let mut b = buf.freeze();
63        assert_eq!(ServerboundHandshake::decode(&mut b).unwrap(), p);
64    }
65}