aboutsummaryrefslogtreecommitdiff
path: root/azalea-protocol/packet-macros/src
diff options
context:
space:
mode:
authormat <27899617+mat-1@users.noreply.github.com>2022-08-06 07:22:19 +0000
committerGitHub <noreply@github.com>2022-08-06 02:22:19 -0500
commit5a9fca0ca9cdb46f4b866781f219756c89e2293a (patch)
treeb006e28b91a181734fb9702bb6ec510f5b2af3df /azalea-protocol/packet-macros/src
parent1d48c3fe34edd4e2295f54bd3d79f81f58c38a8e (diff)
downloadazalea-drasl-5a9fca0ca9cdb46f4b866781f219756c89e2293a.tar.xz
Better errors (#14)
* make reading use thiserror * finish implementing all the error things * clippy warnings related to ok_or * fix some errors in other places * thiserror in more places * don't use closures in a couple places * errors in writing packet * rip backtraces * change some BufReadError::Custom to UnexpectedEnumVariant * Errors say what packet is bad * error on leftover data and fix it wasn't reading the properties for gameprofile
Diffstat (limited to 'azalea-protocol/packet-macros/src')
-rw-r--r--[-rwxr-xr-x]azalea-protocol/packet-macros/src/lib.rs33
1 files changed, 25 insertions, 8 deletions
diff --git a/azalea-protocol/packet-macros/src/lib.rs b/azalea-protocol/packet-macros/src/lib.rs
index ea4db210..f96a85c7 100755..100644
--- a/azalea-protocol/packet-macros/src/lib.rs
+++ b/azalea-protocol/packet-macros/src/lib.rs
@@ -30,7 +30,7 @@ fn as_packet_derive(input: TokenStream, state: proc_macro2::TokenStream) -> Toke
pub fn read(
buf: &mut impl std::io::Read,
- ) -> Result<#state, String> {
+ ) -> Result<#state, azalea_buf::BufReadError> {
use azalea_buf::McBufReadable;
Ok(Self::read_from(buf)?.get())
}
@@ -206,6 +206,7 @@ pub fn declare_state_packets(input: TokenStream) -> TokenStream {
let mut clientbound_read_match_contents = quote!();
for PacketIdPair { id, module, name } in input.serverbound.packets {
+ let name_litstr = syn::LitStr::new(&name.to_string(), name.span());
serverbound_enum_contents.extend(quote! {
#name(#module::#name),
});
@@ -216,11 +217,19 @@ pub fn declare_state_packets(input: TokenStream) -> TokenStream {
#serverbound_state_name::#name(packet) => packet.write(buf),
});
serverbound_read_match_contents.extend(quote! {
- #id => #module::#name::read(buf)?,
+ #id => {
+ let data = #module::#name::read(buf).map_err(|e| crate::read::ReadPacketError::Parse { source: e, packet_id: #id, packet_name: #name_litstr.to_string() })?;
+ let mut leftover = Vec::new();
+ let _ = buf.read_to_end(&mut leftover);
+ if !leftover.is_empty() {
+ return Err(crate::read::ReadPacketError::LeftoverData { packet_name: #name_litstr.to_string(), data: leftover });
+ }
+ data
+ },
});
}
for PacketIdPair { id, module, name } in input.clientbound.packets {
- // let name_litstr = syn::LitStr::new(&name.to_string(), name.span());
+ let name_litstr = syn::LitStr::new(&name.to_string(), name.span());
clientbound_enum_contents.extend(quote! {
#name(#module::#name),
});
@@ -231,7 +240,15 @@ pub fn declare_state_packets(input: TokenStream) -> TokenStream {
#clientbound_state_name::#name(packet) => packet.write(buf),
});
clientbound_read_match_contents.extend(quote! {
- #id => #module::#name::read(buf)?,
+ #id => {
+ let data = #module::#name::read(buf).map_err(|e| crate::read::ReadPacketError::Parse { source: e, packet_id: #id, packet_name: #name_litstr.to_string() })?;
+ let mut leftover = Vec::new();
+ let _ = buf.read_to_end(&mut leftover);
+ if !leftover.is_empty() {
+ return Err(crate::read::ReadPacketError::LeftoverData { packet_name: #name_litstr.to_string(), data: leftover });
+ }
+ data
+ },
});
}
@@ -288,13 +305,13 @@ pub fn declare_state_packets(input: TokenStream) -> TokenStream {
fn read(
id: u32,
buf: &mut impl std::io::Read,
- ) -> Result<#serverbound_state_name, String>
+ ) -> Result<#serverbound_state_name, crate::read::ReadPacketError>
where
Self: Sized,
{
Ok(match id {
#serverbound_read_match_contents
- _ => return Err(format!("Unknown Serverbound {} packet id: {}", #state_name_litstr, id)),
+ _ => return Err(crate::read::ReadPacketError::UnknownPacketId { state_name: #state_name_litstr.to_string(), id }),
})
}
}
@@ -319,13 +336,13 @@ pub fn declare_state_packets(input: TokenStream) -> TokenStream {
fn read(
id: u32,
buf: &mut impl std::io::Read,
- ) -> Result<#clientbound_state_name, String>
+ ) -> Result<#clientbound_state_name, crate::read::ReadPacketError>
where
Self: Sized,
{
Ok(match id {
#clientbound_read_match_contents
- _ => return Err(format!("Unknown Clientbound {} packet id: {}", #state_name_litstr, id)),
+ _ => return Err(crate::read::ReadPacketError::UnknownPacketId { state_name: #state_name_litstr.to_string(), id }),
})
}
}