diff options
| author | mat <27899617+mat-1@users.noreply.github.com> | 2022-08-06 07:22:19 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-08-06 02:22:19 -0500 |
| commit | 5a9fca0ca9cdb46f4b866781f219756c89e2293a (patch) | |
| tree | b006e28b91a181734fb9702bb6ec510f5b2af3df /azalea-protocol/packet-macros/src | |
| parent | 1d48c3fe34edd4e2295f54bd3d79f81f58c38a8e (diff) | |
| download | azalea-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.rs | 33 |
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 }), }) } } |
