Skip to content

Commit

Permalink
Move byte convertable code to a sub-crate
Browse files Browse the repository at this point in the history
  • Loading branch information
vE5li committed Mar 8, 2024
1 parent 1c2d8d6 commit 183ad2d
Show file tree
Hide file tree
Showing 42 changed files with 1,377 additions and 1,367 deletions.
8 changes: 8 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 9 additions & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,10 +1,18 @@
[workspace]
resolver = "2"
members = ["ragnarok_bytes"]

[workspace.dependencies]
cgmath = { version = "0.18", features = ["serde"] }

[package]
name = "korangar"
version = "0.1.0"
edition = "2021"

[dependencies]
procedural = { path = "procedural" }
ragnarok_bytes = { path = "ragnarok_bytes", features = ["cgmath"] }
rayon = "1.5.3"
rand = "0.8.5"
derive-new = "0.5"
Expand All @@ -14,7 +22,7 @@ vulkano-win = { git = "https://github.com/vulkano-rs/vulkano.git", rev = "db3df4
bytemuck = { version = "1.9", features = ["derive", "extern_crate_std", "min_const_generics"] }
winit = "0.28.7"
num = "*"
cgmath = { version = "0.18", features = ["serde"] }
cgmath = { workspace = true, features = ["serde"] }
serde = "1.0.137"
ron = "0.8.0"
rusttype = { version = "0.9.2", features = ["gpu_cache"] }
Expand Down
22 changes: 11 additions & 11 deletions procedural/src/byte/convertable.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@ fn derive_for_struct(

let from = implement_from.then(|| {
quote! {
impl #impl_generics crate::loaders::FromBytes for #name #type_generics #where_clause {
fn from_bytes<META>(byte_stream: &mut crate::loaders::ByteStream<META>) -> crate::loaders::ConversionResult<Self> {
impl #impl_generics ragnarok_bytes::FromBytes for #name #type_generics #where_clause {
fn from_bytes<META>(byte_stream: &mut ragnarok_bytes::ByteStream<META>) -> ragnarok_bytes::ConversionResult<Self> {
let base_offset = byte_stream.get_offset();
#(#from_bytes_implementations)*
Ok(#instanciate)
Expand All @@ -36,10 +36,10 @@ fn derive_for_struct(

let to = implement_to.then(|| {
quote! {
impl #impl_generics crate::loaders::ToBytes for #name #type_generics #where_clause {
impl #impl_generics ragnarok_bytes::ToBytes for #name #type_generics #where_clause {
// Temporary until serialization is always possible
#[allow(unreachable_code)]
fn to_bytes(&self) -> crate::loaders::ConversionResult<Vec<u8>> {
fn to_bytes(&self) -> ragnarok_bytes::ConversionResult<Vec<u8>> {
Ok([#(#to_bytes_implementations),*].concat())
}
}
Expand Down Expand Up @@ -87,11 +87,11 @@ fn derive_for_enum(

let from = add_from.then(|| {
quote! {
impl #impl_generics crate::loaders::FromBytes for #name #type_generics #where_clause {
fn from_bytes<META>(byte_stream: &mut ByteStream<META>) -> crate::loaders::ConversionResult<Self> {
match crate::loaders::conversion_result::<Self, _>(#numeric_type::from_bytes(byte_stream))? as usize {
impl #impl_generics ragnarok_bytes::FromBytes for #name #type_generics #where_clause {
fn from_bytes<META>(byte_stream: &mut ragnarok_bytes::ByteStream<META>) -> ragnarok_bytes::ConversionResult<Self> {
match ragnarok_bytes::ConversionResultExt::trace::<Self>(#numeric_type::from_bytes(byte_stream))? as usize {
#( #indices => Ok(Self::#values), )*
invalid => Err(crate::loaders::ConversionError::from_message(format!("invalid enum variant {}", invalid))),
invalid => Err(ragnarok_bytes::ConversionError::from_message(format!("invalid enum variant {}", invalid))),
}
}
}
Expand All @@ -100,12 +100,12 @@ fn derive_for_enum(

let to = add_to.then(|| {
quote! {
impl #impl_generics crate::loaders::ToBytes for #name #type_generics #where_clause {
impl #impl_generics ragnarok_bytes::ToBytes for #name #type_generics #where_clause {
// Temporary until serialization is always possible
#[allow(unreachable_code)]
fn to_bytes(&self) -> crate::loaders::ConversionResult<Vec<u8>> {
fn to_bytes(&self) -> ragnarok_bytes::ConversionResult<Vec<u8>> {
match self {
#( #name::#values => crate::loaders::conversion_result::<Self, _>((#indices as #numeric_type).to_bytes()), )*
#( #name::#values => ragnarok_bytes::ConversionResultExt::trace::<Self>((#indices as #numeric_type).to_bytes()), )*
}
}
}
Expand Down
14 changes: 7 additions & 7 deletions procedural/src/byte/helper.rs
Original file line number Diff line number Diff line change
Expand Up @@ -63,14 +63,14 @@ pub fn byte_convertable_helper(data_struct: DataStruct) -> (Vec<TokenStream>, Ve
let from_length_hint = match length_hint.clone() {
Some(length_hint) => {
let length_hint = remove_self_from_stream(length_hint.clone());
quote!(crate::loaders::FromBytesExt::from_n_bytes(byte_stream, #length_hint))
quote!(ragnarok_bytes::FromBytesExt::from_n_bytes(byte_stream, #length_hint))
}
None => quote!(crate::loaders::FromBytes::from_bytes(byte_stream)),
None => quote!(ragnarok_bytes::FromBytes::from_bytes(byte_stream)),
};

let to_length_hint = match length_hint {
Some(length_hint) => quote!(crate::loaders::ToBytesExt::to_n_bytes(&self.#field_identifier, #length_hint)),
None => quote!(crate::loaders::ToBytes::to_bytes(&self.#field_identifier)),
Some(length_hint) => quote!(ragnarok_bytes::ToBytesExt::to_n_bytes(&self.#field_identifier, #length_hint)),
None => quote!(ragnarok_bytes::ToBytes::to_bytes(&self.#field_identifier)),
};

let repeating: Option<TokenStream> = get_unique_attribute(&mut field.attrs, "repeating").map(|attribute| match attribute.meta {
Expand Down Expand Up @@ -104,7 +104,7 @@ pub fn byte_convertable_helper(data_struct: DataStruct) -> (Vec<TokenStream>, Ve
}

// base from bytes implementation
let from_implementation = quote!(crate::loaders::conversion_result::<Self, _>(#from_length_hint)?);
let from_implementation = quote!(ragnarok_bytes::ConversionResultExt::trace::<Self>(#from_length_hint)?);

// wrap base implementation in a loop if the element can appear multiple times
let from_implementation = match repeating {
Expand Down Expand Up @@ -146,7 +146,7 @@ pub fn byte_convertable_helper(data_struct: DataStruct) -> (Vec<TokenStream>, Ve
quote! {
let #field_variable = match byte_stream
.get_metadata::<Self, Option<crate::loaders::InternalVersion>>()?
.ok_or(crate::loaders::ConversionError::from_message("version not set"))?
.ok_or(ragnarok_bytes::ConversionError::from_message("version not set"))?
.#function {
true => Some(#from_implementation),
false => None,
Expand All @@ -163,7 +163,7 @@ pub fn byte_convertable_helper(data_struct: DataStruct) -> (Vec<TokenStream>, Ve
[0u8].as_slice()
}),
false => {
quote!(crate::loaders::conversion_result::<Self, _>(#to_length_hint)?.as_slice())
quote!(ragnarok_bytes::ConversionResultExt::trace::<Self>(#to_length_hint)?.as_slice())
}
};

Expand Down
4 changes: 2 additions & 2 deletions procedural/src/byte/packet.rs
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ pub fn derive_incoming_packet_struct(
const IS_PING: bool = #is_ping;
const HEADER: u16 = #signature;

fn from_bytes(byte_stream: &mut crate::loaders::ByteStream<NetworkMetadata>) -> crate::loaders::ConversionResult<Self> {
fn from_bytes(byte_stream: &mut ragnarok_bytes::ByteStream<NetworkMetadata>) -> ragnarok_bytes::ConversionResult<Self> {
let base_offset = byte_stream.get_offset();
#(#from_bytes_implementations)*
let packet = #instanciate;
Expand Down Expand Up @@ -72,7 +72,7 @@ pub fn derive_outgoing_packet_struct(

// Temporary until serialization is always possible
#[allow(unreachable_code)]
fn to_bytes(&self) -> crate::loaders::ConversionResult<Vec<u8>> {
fn to_bytes(&self) -> ragnarok_bytes::ConversionResult<Vec<u8>> {
Ok(#to_bytes)
}
}
Expand Down
13 changes: 0 additions & 13 deletions procedural/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -94,19 +94,6 @@ pub fn derive_fixed_byte_size(token_stream: InterfaceTokenStream) -> InterfaceTo
}
}

#[proc_macro_derive(Named)]
pub fn derive_named(token_stream: InterfaceTokenStream) -> InterfaceTokenStream {
let DeriveInput { ident, generics, .. } = parse(token_stream).expect("failed to parse token stream");
let (impl_generics, type_generics, where_clause) = generics.split_for_impl();

quote! {
impl #impl_generics crate::loaders::Named for #ident #type_generics #where_clause {
const NAME: &'static str = stringify!(#ident);
}
}
.into()
}

#[proc_macro_derive(
ByteConvertable,
attributes(
Expand Down
10 changes: 10 additions & 0 deletions ragnarok_bytes/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
[package]
name = "ragnarok_bytes"
version = "0.1.0"
edition = "2021"

[dependencies]
cgmath = { workspace = true, optional = true }

[features]
cgmath = [ "dep:cgmath" ]
136 changes: 70 additions & 66 deletions src/loaders/convertable/error.rs → ragnarok_bytes/src/error.rs
Original file line number Diff line number Diff line change
Expand Up @@ -62,69 +62,73 @@ impl std::fmt::Debug for ConversionError {
}
}

#[cfg(test)]
mod instanciate {
use super::{ConversionError, ConversionErrorType};

#[test]
fn from_error_type() {
let error_type = ConversionErrorType::ByteStreamTooShort { type_name: "test" };
let error = ConversionError::from_error_type(error_type.clone());

assert_eq!(error.error_type, error_type);
assert!(error.stack.is_empty());
}

#[test]
fn from_message() {
let message = "test".to_owned();
let error = ConversionError::from_message(message.clone());

assert_eq!(error.error_type, ConversionErrorType::Specific { message });
assert!(error.stack.is_empty());
}
}

#[cfg(test)]
mod add_to_stack {
use super::{ConversionError, ConversionErrorType};

const FIRST: &str = "first";
const SECOND: &str = "second";
const THIRD: &str = "third";

#[test]
fn empty() {
let error_type = ConversionErrorType::ByteStreamTooShort { type_name: "test" };
let mut error = ConversionError::from_error_type(error_type.clone());

error.add_to_stack(FIRST);

assert_eq!(error.stack, vec![FIRST]);
}

#[test]
fn multiple() {
let error_type = ConversionErrorType::ByteStreamTooShort { type_name: "test" };
let mut error = ConversionError::from_error_type(error_type.clone());

error.add_to_stack(THIRD);
error.add_to_stack(SECOND);
error.add_to_stack(FIRST);

assert_eq!(error.stack, vec![FIRST, SECOND, THIRD]);
}
}

#[cfg(test)]
mod type_check {
use super::{ConversionError, ConversionErrorType};

#[test]
fn is_byte_stream_too_short() {
let error_type = ConversionErrorType::ByteStreamTooShort { type_name: "test" };
let error = ConversionError::from_error_type(error_type.clone());

assert!(error.is_byte_stream_too_short());
}
}
// #[cfg(test)]
// mod instanciate {
// use super::{ConversionError, ConversionErrorType};
//
// #[test]
// fn from_error_type() {
// let error_type = ConversionErrorType::ByteStreamTooShort { type_name:
// "test" }; let error =
// ConversionError::from_error_type(error_type.clone());
//
// assert_eq!(error.error_type, error_type);
// assert!(error.stack.is_empty());
// }
//
// #[test]
// fn from_message() {
// let message = "test".to_owned();
// let error = ConversionError::from_message(message.clone());
//
// assert_eq!(error.error_type, ConversionErrorType::Specific { message
// }); assert!(error.stack.is_empty());
// }
// }
//
// #[cfg(test)]
// mod add_to_stack {
// use super::{ConversionError, ConversionErrorType};
//
// const FIRST: &str = "first";
// const SECOND: &str = "second";
// const THIRD: &str = "third";
//
// #[test]
// fn empty() {
// let error_type = ConversionErrorType::ByteStreamTooShort { type_name:
// "test" }; let mut error =
// ConversionError::from_error_type(error_type.clone());
//
// error.add_to_stack(FIRST);
//
// assert_eq!(error.stack, vec![FIRST]);
// }
//
// #[test]
// fn multiple() {
// let error_type = ConversionErrorType::ByteStreamTooShort { type_name:
// "test" }; let mut error =
// ConversionError::from_error_type(error_type.clone());
//
// error.add_to_stack(THIRD);
// error.add_to_stack(SECOND);
// error.add_to_stack(FIRST);
//
// assert_eq!(error.stack, vec![FIRST, SECOND, THIRD]);
// }
// }
//
// #[cfg(test)]
// mod type_check {
// use super::{ConversionError, ConversionErrorType};
//
// #[test]
// fn is_byte_stream_too_short() {
// let error_type = ConversionErrorType::ByteStreamTooShort { type_name:
// "test" }; let error =
// ConversionError::from_error_type(error_type.clone());
//
// assert!(error.is_byte_stream_too_short());
// }
// }
Loading

0 comments on commit 183ad2d

Please sign in to comment.