From fe09571d11d026efea546027e664168fcdf9684b Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Thu, 25 Aug 2022 18:27:14 +0200 Subject: [PATCH 1/3] Add visitor to verify_with --- .../tests/fail/invalid_field_type_verify_with.rs | 8 ++------ .../tests/fail/invalid_field_type_verify_with.stderr | 4 ++-- packable/packable-derive-test/tests/pass/verify_with.rs | 7 ++----- packable/packable-derive/src/fragments.rs | 4 ++-- packable/packable/src/packable/bounded.rs | 4 ++-- 5 files changed, 10 insertions(+), 17 deletions(-) diff --git a/packable/packable-derive-test/tests/fail/invalid_field_type_verify_with.rs b/packable/packable-derive-test/tests/fail/invalid_field_type_verify_with.rs index 1ae182a..6bf291d 100644 --- a/packable/packable-derive-test/tests/fail/invalid_field_type_verify_with.rs +++ b/packable/packable-derive-test/tests/fail/invalid_field_type_verify_with.rs @@ -22,7 +22,7 @@ impl From for PickyError { } } -fn verify_value(&value: &u64) -> Result<(), PickyError> { +fn verify_value(&value: &u64, _: &()) -> Result<(), PickyError> { if !VERIFY || value == 42 { Ok(()) } else { @@ -32,10 +32,6 @@ fn verify_value(&value: &u64) -> Result<(), PickyError> { #[derive(Packable)] #[packable(unpack_error = PickyError)] -pub struct Picky( - #[packable(verify_with = verify_value)] - u8 -); +pub struct Picky(#[packable(verify_with = verify_value)] u8); fn main() {} - diff --git a/packable/packable-derive-test/tests/fail/invalid_field_type_verify_with.stderr b/packable/packable-derive-test/tests/fail/invalid_field_type_verify_with.stderr index e87e4ba..47e0678 100644 --- a/packable/packable-derive-test/tests/fail/invalid_field_type_verify_with.stderr +++ b/packable/packable-derive-test/tests/fail/invalid_field_type_verify_with.stderr @@ -12,6 +12,6 @@ error[E0308]: mismatched types note: function defined here --> tests/fail/invalid_field_type_verify_with.rs:25:4 | -25 | fn verify_value(&value: &u64) -> Result<(), PickyError> { - | ^^^^^^^^^^^^ ------------ +25 | fn verify_value(&value: &u64, _: &()) -> Result<(), PickyError> { + | ^^^^^^^^^^^^ ------------ ------ = note: this error originates in the derive macro `Packable` (in Nightly builds, run with -Z macro-backtrace for more info) diff --git a/packable/packable-derive-test/tests/pass/verify_with.rs b/packable/packable-derive-test/tests/pass/verify_with.rs index 25689f0..d255e0d 100644 --- a/packable/packable-derive-test/tests/pass/verify_with.rs +++ b/packable/packable-derive-test/tests/pass/verify_with.rs @@ -22,7 +22,7 @@ impl From for PickyError { } } -fn verify_value(&value: &u8) -> Result<(), PickyError> { +fn verify_value(&value: &u8, _: &()) -> Result<(), PickyError> { if !VERIFY || value == 42 { Ok(()) } else { @@ -32,9 +32,6 @@ fn verify_value(&value: &u8) -> Result<(), PickyError> { #[derive(Packable)] #[packable(unpack_error = PickyError)] -pub struct Picky( - #[packable(verify_with = verify_value)] - u8 -); +pub struct Picky(#[packable(verify_with = verify_value)] u8); fn main() {} diff --git a/packable/packable-derive/src/fragments.rs b/packable/packable-derive/src/fragments.rs index 51816a7..2cf5b22 100644 --- a/packable/packable-derive/src/fragments.rs +++ b/packable/packable-derive/src/fragments.rs @@ -27,8 +27,8 @@ impl Fragments { fields_type, } = info; - let fields_verification = fields_verify_with.into_iter().zip(fields_ident.iter()).map(|(verify_with, field_ident)| match verify_with { - Some(verify_with) => quote!(#verify_with::(&#field_ident).map_err(#crate_name::error::UnpackError::from_packable)?;), + let fields_verification = fields_verify_with.into_iter().zip(fields_ident.iter()).zip(fields_type.iter()).map(|((verify_with, field_ident), field_type)| match verify_with { + Some(verify_with) => quote!(#verify_with::(&#field_ident, Borrow::<<#field_type as #crate_name::Packable>::UnpackVisitor>::borrow(visitor)).map_err(#crate_name::error::UnpackError::from_packable)?;), None => quote!(), }); diff --git a/packable/packable/src/packable/bounded.rs b/packable/packable/src/packable/bounded.rs index 7e3c2df..ce8ebf3 100644 --- a/packable/packable/src/packable/bounded.rs +++ b/packable/packable/src/packable/bounded.rs @@ -44,7 +44,7 @@ macro_rules! bounded { self.0 } - fn verify(&value: &$ty) -> Result<(), $invalid_error> { + fn verify(&value: &$ty, _: &()) -> Result<(), $invalid_error> { if VERIFY && !(MIN..=MAX).contains(&value) { Err($invalid_error(value)) } else { @@ -70,7 +70,7 @@ macro_rules! bounded { type Error = $invalid_error; fn try_from(value: $ty) -> Result { - Self::verify::(&value)?; + Self::verify::(&value, &())?; Ok(Self(value)) } } From 7f62d26eecaaf26ef52ec597ea7dc1ade5fcc949 Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Thu, 25 Aug 2022 18:30:09 +0200 Subject: [PATCH 2/3] Bump versions --- packable/packable-derive-test/Cargo.toml | 4 ++-- packable/packable-derive/Cargo.toml | 2 +- packable/packable/CHANGELOG.md | 6 ++++++ packable/packable/Cargo.toml | 4 ++-- 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/packable/packable-derive-test/Cargo.toml b/packable/packable-derive-test/Cargo.toml index 3737f9a..3e455fe 100644 --- a/packable/packable-derive-test/Cargo.toml +++ b/packable/packable-derive-test/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "packable-derive-test" -version = "0.6.0" +version = "0.6.1" authors = [ "IOTA Stiftung" ] edition = "2021" description = "Test suite for the `packable-derive` crate." @@ -16,7 +16,7 @@ name = "tests" path = "tests/lib.rs" [dev-dependencies] -packable = { version = "=0.6.0", path = "../packable", default-features = false } +packable = { version = "=0.6.1", path = "../packable", default-features = false } rustversion = { version = "1.0.9", default-features = false } trybuild = { version = "1.0.64", default-features = false, features = [ "diff" ] } diff --git a/packable/packable-derive/Cargo.toml b/packable/packable-derive/Cargo.toml index 3d29a0b..4887110 100644 --- a/packable/packable-derive/Cargo.toml +++ b/packable/packable-derive/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "packable-derive" -version = "0.6.0" +version = "0.6.1" authors = [ "IOTA Stiftung" ] edition = "2021" description = "Derive macro for the `packable` crate." diff --git a/packable/packable/CHANGELOG.md b/packable/packable/CHANGELOG.md index fc4a07a..3a0f27f 100644 --- a/packable/packable/CHANGELOG.md +++ b/packable/packable/CHANGELOG.md @@ -19,6 +19,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Security --> +## 0.6.1 - 2022-08-26 + +### Added + +- `verify_with` attribute functions now also take the `visitor` as parameter; + ## 0.6.0 - 2022-08-25 ### Added diff --git a/packable/packable/Cargo.toml b/packable/packable/Cargo.toml index f0abed3..c2ac64e 100644 --- a/packable/packable/Cargo.toml +++ b/packable/packable/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "packable" -version = "0.6.0" +version = "0.6.1" authors = [ "IOTA Stiftung" ] edition = "2021" description = "A crate for packing and unpacking binary representations." @@ -19,7 +19,7 @@ usize = [ ] autocfg = { version = "1.1.0", default-features = false } [dependencies] -packable-derive = { version = "=0.6.0", path = "../packable-derive", default-features = false } +packable-derive = { version = "=0.6.1", path = "../packable-derive", default-features = false } primitive-types = { version = "0.11.1", default-features = false, optional = true } serde = { version = "1.0.144", default-features = false, features = [ "derive", "std" ], optional = true } From 792b7b755c925d57974ad324366e0126dc7174ce Mon Sep 17 00:00:00 2001 From: Thibault Martinez Date: Fri, 26 Aug 2022 10:37:43 +0200 Subject: [PATCH 3/3] Fix tests --- packable/packable-derive-test/tests/lib.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packable/packable-derive-test/tests/lib.rs b/packable/packable-derive-test/tests/lib.rs index 2de28e2..72191df 100644 --- a/packable/packable-derive-test/tests/lib.rs +++ b/packable/packable-derive-test/tests/lib.rs @@ -60,4 +60,8 @@ macro_rules! make_test { #[rustversion::stable] make_test!(); #[rustversion::not(stable)] -make_test!(duplicated_tag_enum, overlapping_discriminant); +make_test!( + duplicated_tag_enum, + invalid_field_type_verify_with, + overlapping_discriminant +);