azalea_protocol/packets/login/
c_login_disconnect.rs

1use std::io::{Cursor, Write};
2
3use azalea_buf::{AzaleaRead, AzaleaWrite, BufReadError};
4use azalea_chat::FormattedText;
5use azalea_protocol_macros::ClientboundLoginPacket;
6use serde::{Deserialize, Serialize};
7use tracing::trace;
8
9#[derive(Clone, Debug, ClientboundLoginPacket)]
10pub struct ClientboundLoginDisconnect {
11    pub reason: FormattedText,
12}
13
14impl AzaleaRead for ClientboundLoginDisconnect {
15    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<ClientboundLoginDisconnect, BufReadError> {
16        let disconnect_string = String::azalea_read(buf)?;
17        trace!("Got disconnect packet with string: {disconnect_string:?}");
18        let disconnect_json =
19            match serde_json::from_str::<serde_json::Value>(disconnect_string.as_str()) {
20                Ok(json) => json,
21                Err(err) => {
22                    return Err(BufReadError::Custom(format!(
23                        "Failed to deserialize disconnect JSON {disconnect_string:?}: {err}"
24                    )))
25                }
26            };
27
28        Ok(ClientboundLoginDisconnect {
29            reason: FormattedText::deserialize(disconnect_json)?,
30        })
31    }
32}
33
34impl AzaleaWrite for ClientboundLoginDisconnect {
35    fn azalea_write(&self, buf: &mut impl Write) -> Result<(), std::io::Error> {
36        let status_string = FormattedText::serialize(&self.reason, serde_json::value::Serializer)
37            .unwrap()
38            .to_string();
39        status_string.azalea_write(buf)?;
40        Ok(())
41    }
42}