azalea_protocol/packets/login/
c_login_disconnect.rs1use 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}