Add in proc macro decoder generation

This commit is contained in:
vagola 2020-01-04 11:12:05 +03:00
parent 61fff6fcf7
commit 73528233eb
3 changed files with 64 additions and 20 deletions

View File

@ -37,23 +37,16 @@ fn impl_encoder_trait(name: &Ident, fields: &Fields) -> TokenStream2 {
let unparsed_meta = get_packet_field_meta(field); let unparsed_meta = get_packet_field_meta(field);
let parsed_meta = parse_packet_field_meta(&unparsed_meta); let parsed_meta = parse_packet_field_meta(&unparsed_meta);
match parsed_meta.module { let module = parsed_meta.module.as_deref().unwrap_or("Encoder");
Some(module) => { let module_ident = Ident::new(&module, Span::call_site());
let module_ident = Ident::new(&module, Span::call_site());
quote! { quote! {
crate::#module_ident::encode(&self.#name, writer)?; crate::#module_ident::encode(&self.#name, writer)?;
}
}
None => {
quote! {
crate::Encoder::encode(&self.#name, writer)?;
}
}
} }
}); });
quote! { quote! {
#[automatically_derived]
impl crate::Encoder for #name { impl crate::Encoder for #name {
fn encode<W: std::io::Write>(&self, writer: &mut W) -> Result<(), crate::EncodeError> { fn encode<W: std::io::Write>(&self, writer: &mut W) -> Result<(), crate::EncodeError> {
#encode #encode
@ -65,18 +58,48 @@ fn impl_encoder_trait(name: &Ident, fields: &Fields) -> TokenStream2 {
} }
fn impl_decoder_trait(name: &Ident, fields: &Fields) -> TokenStream2 { fn impl_decoder_trait(name: &Ident, fields: &Fields) -> TokenStream2 {
let decode = quote_field(fields, |_field| { let decode = quote_field(fields, |field| {
let name = &field.ident;
let ty = &field.ty;
let unparsed_meta = get_packet_field_meta(field);
let parsed_meta = parse_packet_field_meta(&unparsed_meta);
match parsed_meta.module {
Some(module) => {
let module_ident = Ident::new(&module, Span::call_site());
quote! {
let #name = crate::#module_ident::decode(reader)?;
}
}
None => {
quote! {
let #name = <#ty as crate::Decoder>::decode(reader)?;
}
}
}
});
let create = quote_field(fields, |field| {
let name = &field.ident;
quote! { quote! {
todo!(); #name,
} }
}); });
quote! { quote! {
#[automatically_derived]
impl crate::Decoder for #name { impl crate::Decoder for #name {
type Output = Self; type Output = Self;
fn decode<R: std::io::Read>(reader: &mut R) -> Result<Self::Output, crate::DecodeError> { fn decode<R: std::io::Read>(reader: &mut R) -> Result<Self::Output, crate::DecodeError> {
#decode #decode
Ok(#name {
#create
})
} }
} }
} }

View File

@ -480,7 +480,7 @@ macro_rules! impl_json_encoder_decoder (
); );
mod var_int { mod var_int {
use crate::{DecodeError, EncodeError, Encoder}; use crate::{DecodeError, EncodeError};
use mc_varint::{VarIntRead, VarIntWrite}; use mc_varint::{VarIntRead, VarIntWrite};
use std::io::{Read, Write}; use std::io::{Read, Write};
@ -496,7 +496,7 @@ mod var_int {
} }
mod var_long { mod var_long {
use crate::{DecodeError, EncodeError, Encoder}; use crate::{DecodeError, EncodeError};
use mc_varint::{VarIntRead, VarIntWrite}; use mc_varint::{VarIntRead, VarIntWrite};
use std::io::{Read, Write}; use std::io::{Read, Write};
@ -512,7 +512,7 @@ mod var_long {
} }
mod rest { mod rest {
use crate::{DecodeError, Decoder, EncodeError, Encoder}; use crate::{DecodeError, EncodeError};
use std::io::{Read, Write}; use std::io::{Read, Write};
pub fn encode<W: Write>(value: &[u8], writer: &mut W) -> Result<(), EncodeError> { pub fn encode<W: Write>(value: &[u8], writer: &mut W) -> Result<(), EncodeError> {
@ -531,8 +531,7 @@ mod rest {
mod uuid_hyp_str { mod uuid_hyp_str {
use crate::{ use crate::{
DecodeError, Decoder, DecoderReadExt, EncodeError, Encoder, EncoderWriteExt, DecodeError, DecoderReadExt, EncodeError, EncoderWriteExt, HYPHENATED_UUID_LENGTH,
HYPHENATED_UUID_LENGTH,
}; };
use std::io::{Read, Write}; use std::io::{Read, Write};
use uuid::Uuid; use uuid::Uuid;

View File

@ -115,7 +115,7 @@ impl LoginStart {
} }
} }
#[derive(Packet, Debug)] #[derive(Debug)]
pub struct EncryptionResponse { pub struct EncryptionResponse {
pub shared_secret: Vec<u8>, pub shared_secret: Vec<u8>,
pub verify_token: Vec<u8>, pub verify_token: Vec<u8>,
@ -132,6 +132,28 @@ impl EncryptionResponse {
} }
} }
impl crate::Encoder for EncryptionResponse {
fn encode<W: std::io::Write>(&self, writer: &mut W) -> Result<(), crate::EncodeError> {
crate::Encoder::encode(&self.shared_secret, writer)?;
crate::Encoder::encode(&self.verify_token, writer)?;
Ok(())
}
}
impl crate::Decoder for EncryptionResponse {
type Output = Self;
fn decode<R: std::io::Read>(reader: &mut R) -> Result<Self::Output, crate::DecodeError> {
let shared_secret = <Vec<u8> as crate::Decoder>::decode(reader)?;
let verify_token = <Vec<u8> as crate::Decoder>::decode(reader)?;
Ok(EncryptionResponse {
shared_secret,
verify_token,
})
}
}
#[derive(Packet, Debug)] #[derive(Packet, Debug)]
pub struct LoginPluginResponse { pub struct LoginPluginResponse {
#[packet(with = "var_int")] #[packet(with = "var_int")]