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 { let disconnect_string = String::azalea_read(buf)?; trace!("Got disconnect packet with string: {disconnect_string:?}"); let disconnect_json = match serde_json::from_str::(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(()) } }