aboutsummaryrefslogtreecommitdiff
path: root/azalea-protocol/src/packets/login/c_login_disconnect.rs
blob: e6e6b33a0047079c2f44de9f6e222fdd5b8bf0eb (plain)
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
use std::io::{self, Cursor, Write};

use azalea_buf::{AzBuf, BufReadError};
use azalea_chat::FormattedText;
use azalea_protocol_macros::ClientboundLoginPacket;
use serde::{Deserialize, Serialize};
use tracing::trace;

#[derive(ClientboundLoginPacket, Clone, Debug, PartialEq)]
pub struct ClientboundLoginDisconnect {
    pub reason: FormattedText,
}

impl AzBuf for ClientboundLoginDisconnect {
    fn azalea_read(buf: &mut Cursor<&[u8]>) -> Result<ClientboundLoginDisconnect, BufReadError> {
        let disconnect_string = String::azalea_read(buf)?;
        trace!("Got disconnect packet with string: {disconnect_string:?}");
        let disconnect_json =
            match serde_json::from_str::<serde_json::Value>(disconnect_string.as_str()) {
                Ok(json) => json,
                Err(err) => {
                    return Err(BufReadError::Custom(format!(
                        "Failed to deserialize disconnect JSON {disconnect_string:?}: {err}"
                    )));
                }
            };

        Ok(ClientboundLoginDisconnect {
            reason: FormattedText::deserialize(disconnect_json)?,
        })
    }
    fn azalea_write(&self, buf: &mut impl Write) -> io::Result<()> {
        let status_string = FormattedText::serialize(&self.reason, serde_json::value::Serializer)
            .unwrap()
            .to_string();
        status_string.azalea_write(buf)?;
        Ok(())
    }
}