From af5a12e8b1e4b99b6c3a2aea492c6de16bfafaa8 Mon Sep 17 00:00:00 2001 From: merlleu Date: Thu, 16 Jun 2022 23:17:16 +0200 Subject: [PATCH 1/7] add suppport for uuid --- Cargo.toml | 1 + README.md | 1 + src/ext_uuid.rs | 48 ++++++++++++++++++++++++++++++++++++ src/lib.rs | 3 +++ tests/serialization_tests.rs | 17 +++++++++++++ 5 files changed, 70 insertions(+) create mode 100644 src/ext_uuid.rs diff --git a/Cargo.toml b/Cargo.toml index 362c0cb..41e2f5c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,6 +18,7 @@ chrono = { version = "0.4", optional = true } glam = { version = ">= 0.15, <= 0.20", optional = true } smallvec = { version = "1", optional = true } regex = { version = "1", optional = true, default-features = false } +uuid = {version = "1", optional = true, default-features = false, features = ["v4"] } indexmap = { version = "1", optional = true } [dev-dependencies] diff --git a/README.md b/README.md index 6e17f3f..8c1f02c 100644 --- a/README.md +++ b/README.md @@ -97,6 +97,7 @@ Out-of-box the following types are supported: | `std::net::IpAddr` | `{is_ipv4: u8, value: {u32 or u128}}` | | `std::time::Duration` | `{secs: u64, subsec_nanos: u32}` | | `std::time::SystemTime` | `std::time::Duration` since `UNIX_EPOCH` | +| `uuid::Uuid` | `[u8; 16]` | These are stable and will not change in the future. diff --git a/src/ext_uuid.rs b/src/ext_uuid.rs new file mode 100644 index 0000000..d818cdc --- /dev/null +++ b/src/ext_uuid.rs @@ -0,0 +1,48 @@ +use std::convert::TryInto; + +use { + crate::{ + Context, + Readable, + Reader, + Writable, + Writer + }, + uuid::Uuid +}; + + +const UUID_SIZE: usize = 16; + +impl< 'a, C > Readable< 'a, C > for Uuid + where C: Context +{ + #[inline] + fn read_from< R: Reader< 'a, C > >( reader: &mut R ) -> Result< Self, C::Error > { + let buffer: Vec = reader.read_vec(16)?; + Ok(Uuid::from_bytes( + buffer.try_into() + .map_err(|_| crate::error::Error::custom( format!( "failed to read a uuid") ).into())? + )) + } + + #[inline] + fn minimum_bytes_needed() -> usize { + UUID_SIZE + } +} + + +impl< C > Writable< C > for Uuid + where C: Context +{ + #[inline] + fn write_to< T: ?Sized + Writer< C > >( &self, writer: &mut T ) -> Result< (), C::Error > { + writer.write_bytes(self.as_bytes()) + } + + #[inline] + fn bytes_needed( &self ) -> Result< usize, C::Error > { + Ok(UUID_SIZE) + } +} diff --git a/src/lib.rs b/src/lib.rs index 8f134ab..26ba12a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -30,6 +30,9 @@ mod ext_regex; #[cfg(feature = "indexmap")] mod ext_indexmap; +#[cfg(feature = "uuid")] +mod ext_uuid; + #[doc(hidden)] pub mod private; diff --git a/tests/serialization_tests.rs b/tests/serialization_tests.rs index 178925f..62cd89c 100644 --- a/tests/serialization_tests.rs +++ b/tests/serialization_tests.rs @@ -2176,6 +2176,23 @@ fn test_regex() { assert_eq!( regex.as_str(), deserialized.as_str() ); } +#[cfg(feature = "uuid")] +#[test] +fn test_uuid() { + use speedy::{ + Readable, + Writable + }; + + let uid = uuid::Uuid::parse_str("99ac1675-12ef-495b-bf56-606ebe5e3e71").unwrap(); + let buffer = uid.write_to_vec().unwrap(); + assert_eq!( buffer, &[0x99, 0xAC, 0x16, 0x75, 0x12, 0xEF, 0x49, 0x5B, 0xBF, 0x56, 0x60, 0x6E, 0xBE, 0x5E, 0x3E, 0x71] ); + + let deserialized = uuid::Uuid::read_from_buffer( &buffer ).unwrap(); + assert_eq!( uid.to_string(), deserialized.to_string() ); +} + + #[test] fn test_derived_struct_with_default_on_eof() { use speedy::{ From 1e153f45e1410ceb2ab159fc443093e3fa86a4fe Mon Sep 17 00:00:00 2001 From: merlleu Date: Thu, 16 Jun 2022 23:19:32 +0200 Subject: [PATCH 2/7] replace vec length by const --- src/ext_uuid.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ext_uuid.rs b/src/ext_uuid.rs index d818cdc..1833b50 100644 --- a/src/ext_uuid.rs +++ b/src/ext_uuid.rs @@ -19,7 +19,7 @@ impl< 'a, C > Readable< 'a, C > for Uuid { #[inline] fn read_from< R: Reader< 'a, C > >( reader: &mut R ) -> Result< Self, C::Error > { - let buffer: Vec = reader.read_vec(16)?; + let buffer: Vec = reader.read_vec(UUID_SIZE)?; Ok(Uuid::from_bytes( buffer.try_into() .map_err(|_| crate::error::Error::custom( format!( "failed to read a uuid") ).into())? From 4e96116d0c0316c94ca5bb295eac5048a5f50f9d Mon Sep 17 00:00:00 2001 From: merlleu Date: Fri, 17 Jun 2022 12:39:42 +0200 Subject: [PATCH 3/7] apply changes before merge --- Cargo.toml | 2 +- src/ext_uuid.rs | 10 ++---- tests/serialization_tests.rs | 60 ++++++++++++------------------------ 3 files changed, 23 insertions(+), 49 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 41e2f5c..44e3f43 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,7 +18,7 @@ chrono = { version = "0.4", optional = true } glam = { version = ">= 0.15, <= 0.20", optional = true } smallvec = { version = "1", optional = true } regex = { version = "1", optional = true, default-features = false } -uuid = {version = "1", optional = true, default-features = false, features = ["v4"] } +uuid = {version = "1", optional = true, default-features = false } indexmap = { version = "1", optional = true } [dev-dependencies] diff --git a/src/ext_uuid.rs b/src/ext_uuid.rs index 1833b50..c6cbdeb 100644 --- a/src/ext_uuid.rs +++ b/src/ext_uuid.rs @@ -1,5 +1,3 @@ -use std::convert::TryInto; - use { crate::{ Context, @@ -19,11 +17,9 @@ impl< 'a, C > Readable< 'a, C > for Uuid { #[inline] fn read_from< R: Reader< 'a, C > >( reader: &mut R ) -> Result< Self, C::Error > { - let buffer: Vec = reader.read_vec(UUID_SIZE)?; - Ok(Uuid::from_bytes( - buffer.try_into() - .map_err(|_| crate::error::Error::custom( format!( "failed to read a uuid") ).into())? - )) + let mut buffer = [0; UUID_SIZE]; + reader.read_bytes(&mut buffer)?; + Ok(Uuid::from_bytes(buffer)) } #[inline] diff --git a/tests/serialization_tests.rs b/tests/serialization_tests.rs index 62cd89c..911c1f7 100644 --- a/tests/serialization_tests.rs +++ b/tests/serialization_tests.rs @@ -1880,18 +1880,18 @@ symmetric_tests_unsized! { be = [72, 101, 108, 108, 111], minimum_bytes = 0 } - derived_vec_until_eof_empty for DerivedVecUntilEof { - in = DerivedVecUntilEof( b"".into() ), - le = [], - be = [], - minimum_bytes = 0 - } - derived_vec_until_eof_non_empty for DerivedVecUntilEof { - in = DerivedVecUntilEof( b"Hello".into() ), - le = [72, 101, 108, 108, 111], - be = [72, 101, 108, 108, 111], - minimum_bytes = 0 - } + // derived_vec_until_eof_empty for DerivedVecUntilEof { + // in = DerivedVecUntilEof( b"".into() ), + // le = [], + // be = [], + // minimum_bytes = 0 + // } + // derived_vec_until_eof_non_empty for DerivedVecUntilEof { + // in = DerivedVecUntilEof( b"Hello".into() ), + // le = [72, 101, 108, 108, 111], + // be = [72, 101, 108, 108, 111], + // minimum_bytes = 0 + // } derived_cow_str_until_eof_empty for DerivedCowStrUntilEof { in = DerivedCowStrUntilEof( "".into() ), le = [], @@ -2160,36 +2160,14 @@ symmetric_tests! { } } -#[cfg(feature = "regex")] -#[test] -fn test_regex() { - use speedy::{ - Readable, - Writable - }; - - let regex = regex::Regex::new( "[a-z]+" ).unwrap(); - let buffer = regex.write_to_vec().unwrap(); - assert_eq!( buffer, &[6, 0, 0, 0, b'[', b'a', b'-', b'z', b']', b'+'] ); - - let deserialized = regex::Regex::read_from_buffer( &buffer ).unwrap(); - assert_eq!( regex.as_str(), deserialized.as_str() ); -} - #[cfg(feature = "uuid")] -#[test] -fn test_uuid() { - use speedy::{ - Readable, - Writable - }; - - let uid = uuid::Uuid::parse_str("99ac1675-12ef-495b-bf56-606ebe5e3e71").unwrap(); - let buffer = uid.write_to_vec().unwrap(); - assert_eq!( buffer, &[0x99, 0xAC, 0x16, 0x75, 0x12, 0xEF, 0x49, 0x5B, 0xBF, 0x56, 0x60, 0x6E, 0xBE, 0x5E, 0x3E, 0x71] ); - - let deserialized = uuid::Uuid::read_from_buffer( &buffer ).unwrap(); - assert_eq!( uid.to_string(), deserialized.to_string() ); +symmetric_tests! { + uuid for uuid::Uuid { + in = uuid::Uuid::parse_str("99ac1675-12ef-495b-bf56-606ebe5e3e71").unwrap(), + le = [0x99, 0xAC, 0x16, 0x75, 0x12, 0xEF, 0x49, 0x5B, 0xBF, 0x56, 0x60, 0x6E, 0xBE, 0x5E, 0x3E, 0x71], + be = [0x99, 0xAC, 0x16, 0x75, 0x12, 0xEF, 0x49, 0x5B, 0xBF, 0x56, 0x60, 0x6E, 0xBE, 0x5E, 0x3E, 0x71], + minimum_bytes = 16 + } } From 1fb2aceee34d0d45fbddbda15addc24fe1def1d1 Mon Sep 17 00:00:00 2001 From: merlleu Date: Fri, 17 Jun 2022 12:41:38 +0200 Subject: [PATCH 4/7] add vec tests back --- tests/serialization_tests.rs | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/tests/serialization_tests.rs b/tests/serialization_tests.rs index 911c1f7..3c991b7 100644 --- a/tests/serialization_tests.rs +++ b/tests/serialization_tests.rs @@ -1880,18 +1880,18 @@ symmetric_tests_unsized! { be = [72, 101, 108, 108, 111], minimum_bytes = 0 } - // derived_vec_until_eof_empty for DerivedVecUntilEof { - // in = DerivedVecUntilEof( b"".into() ), - // le = [], - // be = [], - // minimum_bytes = 0 - // } - // derived_vec_until_eof_non_empty for DerivedVecUntilEof { - // in = DerivedVecUntilEof( b"Hello".into() ), - // le = [72, 101, 108, 108, 111], - // be = [72, 101, 108, 108, 111], - // minimum_bytes = 0 - // } + derived_vec_until_eof_empty for DerivedVecUntilEof { + in = DerivedVecUntilEof( b"".into() ), + le = [], + be = [], + minimum_bytes = 0 + } + derived_vec_until_eof_non_empty for DerivedVecUntilEof { + in = DerivedVecUntilEof( b"Hello".into() ), + le = [72, 101, 108, 108, 111], + be = [72, 101, 108, 108, 111], + minimum_bytes = 0 + } derived_cow_str_until_eof_empty for DerivedCowStrUntilEof { in = DerivedCowStrUntilEof( "".into() ), le = [], From 896a1b63e64b00ded201a0bdfb7662e03d4cc394 Mon Sep 17 00:00:00 2001 From: merlleu Date: Fri, 17 Jun 2022 12:43:00 +0200 Subject: [PATCH 5/7] add regex tests back --- log | Bin 0 -> 326386 bytes tests/serialization_tests.rs | 16 ++++++++++++++++ 2 files changed, 16 insertions(+) create mode 100644 log diff --git a/log b/log new file mode 100644 index 0000000000000000000000000000000000000000..85cc32d7188565b93dab3566cc4ca4901d644bf4 GIT binary patch literal 326386 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 Xwm;|mvy_4DHW-cl|0!*7WdHvIr*kpT literal 0 HcmV?d00001 diff --git a/tests/serialization_tests.rs b/tests/serialization_tests.rs index 3c991b7..52cbbc9 100644 --- a/tests/serialization_tests.rs +++ b/tests/serialization_tests.rs @@ -2160,6 +2160,22 @@ symmetric_tests! { } } +#[cfg(feature = "regex")] +#[test] +fn test_regex() { + use speedy::{ + Readable, + Writable + }; + + let regex = regex::Regex::new( "[a-z]+" ).unwrap(); + let buffer = regex.write_to_vec().unwrap(); + assert_eq!( buffer, &[6, 0, 0, 0, b'[', b'a', b'-', b'z', b']', b'+'] ); + + let deserialized = regex::Regex::read_from_buffer( &buffer ).unwrap(); + assert_eq!( regex.as_str(), deserialized.as_str() ); +} + #[cfg(feature = "uuid")] symmetric_tests! { uuid for uuid::Uuid { From 8ab2c0257d660ef6cd2962f00768670a51141140 Mon Sep 17 00:00:00 2001 From: merlleu Date: Fri, 17 Jun 2022 22:52:10 +0200 Subject: [PATCH 6/7] remove "log" file --- log | Bin 326386 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 log diff --git a/log b/log deleted file mode 100644 index 85cc32d7188565b93dab3566cc4ca4901d644bf4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 326386 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 Xwm;|mvy_4DHW-cl|0!*7WdHvIr*kpT From 763dc98d5a24145f232d8ea2303fe744ea520d0c Mon Sep 17 00:00:00 2001 From: merlleu Date: Fri, 17 Jun 2022 22:54:51 +0200 Subject: [PATCH 7/7] (squashed) add #[speedy(non_exhaustive)] add speedy(non_exhaustive) rename attrs_c to attrs in Struct::new add description to readme switched to varint64 for struct field count && added tests use u7 instead of varint64 when possible remove duplicate checks for non_exhaustive change order of u7 patch --- README.md | 11 ++++ log | Bin 326386 -> 0 bytes speedy-derive/src/lib.rs | 124 ++++++++++++++++++++++++++++++----- tests/serialization_tests.rs | 114 ++++++++++++++++++++++++++++++++ 4 files changed, 234 insertions(+), 15 deletions(-) delete mode 100644 log diff --git a/README.md b/README.md index 8c1f02c..acf925d 100644 --- a/README.md +++ b/README.md @@ -165,6 +165,17 @@ to the default value for its type and the EOF will be ignored. Specifies a static string of bytes which will be written or has to be present when reading before a given field. +## Struct attributes + +### `#[speedy(non_exhaustive)]` + +The number of field in the structure is written before the struct fields. +This allows you to append fields to a struct without losing the ability to read data written with the old struct. +Warning : this is not retroactive, meaning if a struct did not have this tag before, +you won't be able to read serialized data serialized without this attribute. +This features add a varint64 in front of each serialized structs (1 byte if less than 128 fields). + + ## Enum attributes ### `#[speedy(tag_type = $ty)]` diff --git a/log b/log deleted file mode 100644 index 85cc32d7188565b93dab3566cc4ca4901d644bf4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 326386 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 Xwm;|mvy_4DHW-cl|0!*7WdHvIr*kpT diff --git a/speedy-derive/src/lib.rs b/speedy-derive/src/lib.rs index 91ed0f2..2b26d7d 100644 --- a/speedy-derive/src/lib.rs +++ b/speedy-derive/src/lib.rs @@ -47,6 +47,7 @@ mod kw { syn::custom_keyword!( skip ); syn::custom_keyword!( constant_prefix ); syn::custom_keyword!( peek_tag ); + syn::custom_keyword!( non_exhaustive ); syn::custom_keyword!( u7 ); syn::custom_keyword!( u8 ); @@ -354,6 +355,9 @@ enum VariantAttribute { } enum StructAttribute { + NonExhaustive { + key_token: kw::non_exhaustive + } } enum EnumAttribute { @@ -396,11 +400,16 @@ fn parse_variant_attribute( } fn parse_struct_attribute( - _input: &syn::parse::ParseStream, - _lookahead: &syn::parse::Lookahead1 + input: &syn::parse::ParseStream, + lookahead: &syn::parse::Lookahead1 ) -> syn::parse::Result< Option< StructAttribute > > { - Ok( None ) + if lookahead.peek( kw::non_exhaustive ) { + let key_token = input.parse::< kw::non_exhaustive >()?; + Ok( Some( StructAttribute::NonExhaustive { key_token } ) ) + } else { + Ok( None ) + } } fn parse_enum_attribute( @@ -463,6 +472,7 @@ struct VariantAttributes { } struct StructAttributes { + non_exhaustive: bool } struct EnumAttributes { @@ -543,10 +553,21 @@ fn collect_variant_attributes( attrs: Vec< VariantAttribute > ) -> Result< Varia } fn collect_struct_attributes( attrs: Vec< StructAttribute > ) -> Result< StructAttributes, syn::Error > { - for _attr in attrs { + let mut non_exhaustive = false; + for attr in attrs { + match attr { + StructAttribute::NonExhaustive { key_token } => { + if non_exhaustive { + let message = "Duplicate 'non_exhaustive'"; + return Err( syn::Error::new( key_token.span(), message ) ); + } + non_exhaustive = true; + } + } } Ok( StructAttributes { + non_exhaustive }) } @@ -587,33 +608,45 @@ enum StructKind { struct Struct< 'a > { fields: Vec< Field< 'a > >, - kind: StructKind + kind: StructKind, + non_exhaustive: bool } impl< 'a > Struct< 'a > { fn new( fields: &'a syn::Fields, attrs: Vec< StructAttribute > ) -> Result< Self, syn::Error > { - collect_struct_attributes( attrs )?; + let attrs = collect_struct_attributes( attrs )?; let structure = match fields { syn::Fields::Unit => { Struct { fields: Vec::new(), - kind: StructKind::Unit + kind: StructKind::Unit, + non_exhaustive: attrs.non_exhaustive } }, syn::Fields::Named( syn::FieldsNamed { ref named, .. } ) => { Struct { fields: get_fields( named.into_iter() )?, - kind: StructKind::Named + kind: StructKind::Named, + non_exhaustive: attrs.non_exhaustive } }, syn::Fields::Unnamed( syn::FieldsUnnamed { ref unnamed, .. } ) => { Struct { fields: get_fields( unnamed.into_iter() )?, - kind: StructKind::Unnamed + kind: StructKind::Unnamed, + non_exhaustive: attrs.non_exhaustive } } }; + + if structure.non_exhaustive && structure.fields.len() > 127 { + // we forbid structs with more than 127 fields because the MSB could be used to support structs w/ more + // than 127 fields (by reading the next byte if the MSB is 1) + let message = "speedy(non_exhaustive) is not available on structs with more than 127 fields at the moment."; + return Err( syn::Error::new( fields.span(), message ) ); + } + Ok( structure ) } @@ -1240,7 +1273,17 @@ fn default_on_eof_body( body: TokenStream ) -> TokenStream { } } -fn read_field_body( field: &Field ) -> TokenStream { +fn non_exhaustive_field_body( body: TokenStream , num_field: usize) -> TokenStream { + quote! { + if _struct_size_ > #num_field { + #body? + } else { + std::default::Default::default() + } + } +} + +fn read_field_body( field: &Field, is_parent_non_exhaustive: bool, num_field: usize ) -> TokenStream { if field.skip { return quote! { std::default::Default::default() @@ -1477,10 +1520,15 @@ fn read_field_body( field: &Field ) -> TokenStream { body }; - if field.default_on_eof { - default_on_eof_body( body ) + if is_parent_non_exhaustive { + non_exhaustive_field_body( body, num_field ) } else { - quote! { #body? } + // we do not need to handle default_on_eof when parent is non_exhaustive (because default_on_eof is applied on all fields) + if field.default_on_eof { + default_on_eof_body( body ) + } else { + quote! { #body? } + } } } @@ -1488,8 +1536,16 @@ fn readable_body< 'a >( types: &mut Vec< syn::Type >, st: &Struct< 'a > ) -> (To let mut field_names = Vec::new(); let mut field_readers = Vec::new(); let mut minimum_bytes_needed = Vec::new(); + + if st.non_exhaustive { + field_readers.push( quote! { + let _struct_size_: usize = speedy::private::read_length_u64_varint( _reader_ )?; + } ); + } + + let mut num_field = 0; for field in &st.fields { - let read_value = read_field_body( field ); + let read_value = read_field_body( field, st.non_exhaustive, num_field ); let name = field.var_name(); let raw_ty = field.raw_ty; field_readers.push( quote! { let #name: #raw_ty = #read_value; } ); @@ -1499,6 +1555,16 @@ fn readable_body< 'a >( types: &mut Vec< syn::Type >, st: &Struct< 'a > ) -> (To if let Some( minimum_bytes ) = get_minimum_bytes( &field ) { minimum_bytes_needed.push( minimum_bytes ); } + + if !field.skip { + num_field += 1; + } + } + + if st.non_exhaustive && num_field <= 127 { + field_readers[0] = quote! { + let _struct_size_: usize = speedy::private::read_length_u8( _reader_ )?; + }; } let body = quote! { #(#field_readers)* }; @@ -1509,7 +1575,15 @@ fn readable_body< 'a >( types: &mut Vec< syn::Type >, st: &Struct< 'a > ) -> (To StructKind::Named => quote! { { #initializer } } }; - let minimum_bytes_needed = sum( minimum_bytes_needed ); + + + let minimum_bytes_needed = if st.non_exhaustive { + // varint64 is at least 1 byte, everything else is optional + quote! { 1 } + } else { + sum( minimum_bytes_needed ) + }; + (body, initializer, minimum_bytes_needed) } @@ -1617,11 +1691,18 @@ fn write_field_body( field: &Field ) -> TokenStream { fn writable_body< 'a >( types: &mut Vec< syn::Type >, st: &Struct< 'a > ) -> (TokenStream, TokenStream) { let mut field_names = Vec::new(); let mut field_writers = Vec::new(); + let mut field_count: usize = 0; + + if st.non_exhaustive { + field_writers.push(quote! { }); + } for field in &st.fields { if field.skip { continue; } + field_count += 1; + let write_value = write_field_body( &field ); types.extend( field.bound_types() ); @@ -1629,6 +1710,19 @@ fn writable_body< 'a >( types: &mut Vec< syn::Type >, st: &Struct< 'a > ) -> (To field_writers.push( write_value ); } + if st.non_exhaustive { + // we use u7 if less than 128 elements to optimize serialization & deserialization + let writer = if field_count > 127 { + quote! { write_length_u64_varint } + } else { + quote! { write_length_u7 } + }; + + field_writers[0] = quote! { + speedy::private::#writer(#field_count, _writer_ )?; + }; + } + let body = quote! { #(#field_writers)* }; let initializer = quote! { #(ref #field_names),* }; let initializer = match st.kind { diff --git a/tests/serialization_tests.rs b/tests/serialization_tests.rs index 52cbbc9..5bb5c1b 100644 --- a/tests/serialization_tests.rs +++ b/tests/serialization_tests.rs @@ -2399,3 +2399,117 @@ fn test_incomplete_read_into_vec_triggers_drop_for_alread_read_items() { Struct::read_from_stream_unbuffered( &mut &[0, 0, 0, 10, 1, 2][..] ).unwrap_err(); assert_eq!( COUNTER.load( Ordering::SeqCst ), 2 ); } + +#[derive(Writable, Readable, Eq, PartialEq, Debug)] +#[speedy(non_exhaustive)] +struct NonExhaustiveStructBefore { + pub field1: bool, + pub field2: Vec, + pub field3: u32, +} + +#[derive(Writable, Readable, Eq, PartialEq, Debug)] +#[speedy(non_exhaustive)] +struct NonExhaustiveStructChildBefore { + pub field1: u32, + pub field2: bool, +} + +#[derive(Writable, Readable, Eq, PartialEq, Debug)] +#[speedy(non_exhaustive)] +struct NonExhaustiveStructAfter { + pub field1: bool, + pub field2: Vec, + pub field3: u32, +} + +#[derive(Writable, Readable, Eq, PartialEq, Debug)] +#[speedy(non_exhaustive)] +struct NonExhaustiveStructChildAfter { + pub field1: u32, + pub field2: bool, + pub field_added: u8, // should always be 0 + pub field_added_2: Vec +} + +#[test] +fn test_non_exhaustive_field_appended() { + use speedy::{ + Readable, + Writable + }; + + let before = NonExhaustiveStructBefore{ + field1: true, + field2: vec![ + NonExhaustiveStructChildBefore { field1: 1, field2: false}, + NonExhaustiveStructChildBefore { field1: 2, field2: true}, + ], + field3: 9 + }; + + let buffer = before.write_to_vec().unwrap(); + assert_eq!( buffer, &[ + 3, + 1, + 2, 0, 0, 0, + 2, + 1, 0, 0, 0, + 0, + 2, + 2, 0, 0, 0, + 1, + 9, 0, 0, 0 + ]); + + let deserialized = NonExhaustiveStructAfter::read_from_buffer( &buffer ).unwrap(); + + let expectation = NonExhaustiveStructAfter{ + field1: true, + field2: vec![ + NonExhaustiveStructChildAfter { field1: 1, field2: false, field_added: 0, field_added_2: vec![]}, + NonExhaustiveStructChildAfter { field1: 2, field2: true, field_added: 0, field_added_2: vec![]}, + ], + field3: 9 + }; + assert_eq!( deserialized, expectation ); + +} + +symmetric_tests! { + non_exhaustive_struct_1 for NonExhaustiveStructBefore { + in = NonExhaustiveStructBefore{ + field1: true, + field2: vec![ + NonExhaustiveStructChildBefore { field1: 1, field2: false}, + NonExhaustiveStructChildBefore { field1: 2, field2: true}, + ], + field3: 9 + }, + le = [ + 3, + 1, + 2, 0, 0, 0, + 2, + 1, 0, 0, 0, + 0, + 2, + 2, 0, 0, 0, + 1, + 9, 0, 0, 0 + ], + be = [ + 3, + 1, + 0, 0, 0, 2, + 2, + 0, 0, 0, 1, + 0, + 2, + 0, 0, 0, 2, + 1, + 0, 0, 0, 9 + ], + minimum_bytes = 1 + } +} \ No newline at end of file