From 1b3ae4f5f1e8ea8b768b47e6347efeebda853adb Mon Sep 17 00:00:00 2001 From: Vincent Herlemont Date: Sun, 29 Oct 2023 09:44:24 +0100 Subject: [PATCH] test: refactor test --- libraries/native_model/Cargo.toml | 2 +- libraries/native_model/justfile | 54 +++ libraries/native_model/src/codec/mod.rs | 3 + libraries/native_model/src/lib.rs | 15 +- libraries/native_model/tests_crate/Cargo.toml | 17 +- .../tests_crate/tests/_experiment.rs | 344 ------------------ .../example/default_codec/bincode_1_3.rs | 1 + .../example/default_codec/bincode_2_rc.rs | 1 + .../tests/example/default_codec/default.rs | 1 + .../example/default_codec/postcard_1_0.rs | 1 + .../tests/example/example_define_model.rs | 1 + .../tests_crate/tests/example/example_main.rs | 27 +- .../native_model/tests_crate/tests/macro.rs | 27 +- .../tests/macro_decode_decode_upgrade.rs | 35 +- .../tests_crate/tests/macro_encode_decode.rs | 28 +- .../tests_crate/tests/native_model_from.rs | 35 +- .../tests/native_model_try_from.rs | 27 +- 17 files changed, 138 insertions(+), 481 deletions(-) create mode 100644 libraries/native_model/justfile delete mode 100644 libraries/native_model/tests_crate/tests/_experiment.rs diff --git a/libraries/native_model/Cargo.toml b/libraries/native_model/Cargo.toml index 6987ecb4..63894fe5 100644 --- a/libraries/native_model/Cargo.toml +++ b/libraries/native_model/Cargo.toml @@ -31,7 +31,7 @@ criterion = { version = "0.5.1" } skeptic = "0.13" [features] -default = ["serde", "bincode_1_3", "bincode_2_rc", "postcard_1_0"] +default = ["serde", "bincode_1_3"] [[bench]] name = "overhead" diff --git a/libraries/native_model/justfile b/libraries/native_model/justfile new file mode 100644 index 00000000..d2f0920e --- /dev/null +++ b/libraries/native_model/justfile @@ -0,0 +1,54 @@ +set shell := ["nu", "-c"] + +default: + @just --list --unsorted; + +build_no_default: + cargo build --no-default-features + +build_default: + cargo build + +build_serde: + cargo build --no-default-features --features serde + +build_bincode_1_3: + cargo build --features bincode_1_3 + +build_no_default_bincode_1_3: + cargo build --no-default-features --features serde --features bincode_1_3 + +build_bincode_2_rc: + cargo build --features bincode_2_rc + +build_no_default_bincode_2_rc: + cargo build --no-default-features --features serde --features bincode_2_rc + +build_postcard_1_0: + cargo build --features postcard_1_0 + +build_no_default_postcard_1_0: + cargo build --no-default-features --features serde --features postcard_1_0 + +build_all: build_no_default build_default build_serde build_bincode_1_3 build_no_default_bincode_1_3 build_bincode_2_rc build_no_default_bincode_2_rc build_postcard_1_0 build_no_default_postcard_1_0 + +_tests_crate args='': + cd tests_crate; \ + cargo test {{args}} + +test_no_default: + @just _tests_crate '--no-default-features' + +test_default: + @just _tests_crate args='' + +test_bincode_1_3: + @just _tests_crate '--features bincode_1_3' + +test_bincode_2_rc: + @just _tests_crate '--features bincode_2_rc' + +test_postcard_1_0: + @just _tests_crate '--features postcard_1_0' + +test_all: test_no_default test_default test_bincode_1_3 test_bincode_2_rc test_postcard_1_0 \ No newline at end of file diff --git a/libraries/native_model/src/codec/mod.rs b/libraries/native_model/src/codec/mod.rs index e58dccc1..1f50b559 100644 --- a/libraries/native_model/src/codec/mod.rs +++ b/libraries/native_model/src/codec/mod.rs @@ -1,5 +1,8 @@ +#[cfg(all(feature = "serde", feature = "bincode_1_3"))] pub mod bincode_1_3; +#[cfg(all(feature = "serde", feature = "bincode_2_rc"))] pub mod bincode_2_rc; +#[cfg(all(feature = "serde", feature = "postcard_1_0"))] pub mod postcard_1_0; /// Encode trait for your own encoding method. diff --git a/libraries/native_model/src/lib.rs b/libraries/native_model/src/lib.rs index eb78d1fe..c3cf9a48 100644 --- a/libraries/native_model/src/lib.rs +++ b/libraries/native_model/src/lib.rs @@ -15,13 +15,26 @@ //! //! See examples in the [README.md](https://github.com/vincent-herlemont/native_model) file. + +#[cfg(any( + feature = "serde", + feature = "bincode_1_3", + feature = "bincode_2_rc", + feature = "postcard_1_0" +))] mod codec; + +#[cfg(any( + feature = "serde", + feature = "bincode_1_3", + feature = "bincode_2_rc", + feature = "postcard_1_0" +))] pub use codec::*; mod header; mod model; pub mod wrapper; -pub use codec::*; pub use model::*; /// Macro to generate a [`native_model`] implementation for a struct. diff --git a/libraries/native_model/tests_crate/Cargo.toml b/libraries/native_model/tests_crate/Cargo.toml index 70237955..c6d07850 100644 --- a/libraries/native_model/tests_crate/Cargo.toml +++ b/libraries/native_model/tests_crate/Cargo.toml @@ -5,9 +5,16 @@ edition = "2021" [workspace] -[dev-dependencies] -native_model = { path = "../" } -serde = { version = "1.0", features = ["derive"] } -bincode = { version = "2.0.0-rc.3", features = ["serde"] } +[dependencies] +native_model = { path = "../", no-default-features = true } +serde = { version = "1.0", features = ["derive"], optional = true } +bincode = { version = "2.0.0-rc.3", features = ["serde"] , optional = true } +postcard = { version = "1.0", features = ["alloc"], optional = true } anyhow = "1.0" -postcard = { version = "1.0", features = ["alloc"] } \ No newline at end of file + + +[features] +default = ["bincode_1_3"] +bincode_1_3 = ["serde", "native_model/bincode_1_3"] +bincode_2_rc = ["serde", "native_model/bincode_2_rc", "bincode"] +postcard_1_0 = ["serde", "native_model/postcard_1_0", "postcard"] diff --git a/libraries/native_model/tests_crate/tests/_experiment.rs b/libraries/native_model/tests_crate/tests/_experiment.rs deleted file mode 100644 index 9e7b71c5..00000000 --- a/libraries/native_model/tests_crate/tests/_experiment.rs +++ /dev/null @@ -1,344 +0,0 @@ -use bincode::{config, Decode, Encode}; -use native_model::Result; -use native_model::{DecodeBodyError, DecodeResult, EncodeBodyError, EncodeResult, Model}; -// Add this function to the macro for custom serialization -fn native_model_encode(obj: &T) -> anyhow::Result> { - let result = bincode::encode_to_vec(obj, config::standard())?; - Ok(result) -} - -// Add this function to the macro for custom deserialization -fn native_model_decode(data: Vec) -> anyhow::Result { - let (result, _) = - bincode::decode_from_slice(&data, config::standard()).map_err(|e| EncodeBodyError { - msg: format!("Decode error: {}", e), - source: e.into(), - })?; - Ok(result) -} - -#[derive(Debug, Encode, Decode)] -struct A {} -impl Model for A { - fn native_model_id() -> u32 { - 1 - } - - fn native_model_version() -> u32 { - 1 - } - - fn native_model_decode_upgrade_body(_data: Vec, _id: u32, version: u32) -> Result { - println!( - "A::deserialization_and_upgrade({}, {})", - version, - Self::native_model_version() - ); - if version == Self::native_model_version() { - Ok(Self {}) - } else if version < Self::native_model_version() { - panic!("The version {} not supported", version); - } else { - panic!("Not implemented"); - } - } - - fn native_model_encode_body(&self) -> EncodeResult> - where - Self: Sized, - { - native_model_encode(self).map_err(|e| EncodeBodyError { - msg: format!("{}", e), - source: e.into(), - }) - } - - fn native_model_decode_body(data: Vec, _id: u32) -> DecodeResult - where - Self: Sized, - { - native_model_decode(data).map_err(|e| DecodeBodyError::DecodeError { - msg: format!("{}", e), - source: e.into(), - }) - } - - fn native_model_encode_downgrade_body(self, version: u32) -> Result> - where - Self: Sized, - { - println!( - "A::serialization_and_downgrade({}, {})", - version, - Self::native_model_version() - ); - if version == Self::native_model_version() { - let result = self.native_model_encode_body()?; - Ok(result) - } else if version < Self::native_model_version() { - panic!("The version {} not supported", version); - } else { - panic!("Not implemented"); - } - } -} - -#[derive(Debug, Encode, Decode)] -struct B {} -impl Model for B { - fn native_model_id() -> u32 { - 1 - } - - fn native_model_version() -> u32 { - 2 - } - - fn native_model_decode_upgrade_body(_data: Vec, id: u32, version: u32) -> Result { - println!( - "B::deserialization_and_upgrade({}, {})", - version, - Self::native_model_version() - ); - if version == Self::native_model_version() { - Ok(Self {}) - } else if version < Self::native_model_version() { - A::native_model_decode_upgrade_body(_data, id, version).map(|a| a.into()) - } else { - panic!("Not implemented"); - } - } - - fn native_model_encode_body(&self) -> EncodeResult> - where - Self: Sized, - { - native_model_encode(self).map_err(|e| EncodeBodyError { - msg: format!("{}", e), - source: e.into(), - }) - } - - fn native_model_decode_body(data: Vec, _id: u32) -> DecodeResult - where - Self: Sized, - { - native_model_decode(data).map_err(|e| DecodeBodyError::DecodeError { - msg: format!("{}", e), - source: e.into(), - }) - } - - fn native_model_encode_downgrade_body(self, version: u32) -> Result> - where - Self: Sized, - { - println!( - "B::serialization_and_downgrade({}, {})", - version, - Self::native_model_version() - ); - if version == Self::native_model_version() { - let result = self.native_model_encode_body()?; - Ok(result) - } else if version < Self::native_model_version() { - A::native_model_encode_downgrade_body(self.into(), version) - } else { - panic!("Not implemented"); - } - } -} - -impl From for A { - fn from(_: B) -> Self { - Self {} - } -} - -impl From for B { - fn from(_: A) -> Self { - Self {} - } -} - -#[derive(Debug, Encode, Decode)] -struct C {} -impl Model for C { - fn native_model_id() -> u32 { - 1 - } - - fn native_model_version() -> u32 { - 3 - } - - fn native_model_decode_upgrade_body(_data: Vec, id: u32, version: u32) -> Result { - println!( - "C::deserialization_and_upgrade({}, {})", - version, - Self::native_model_version() - ); - if version == Self::native_model_version() { - Ok(Self {}) - } else if version < Self::native_model_version() { - let result = B::native_model_decode_upgrade_body(_data, id, version).map(|b| { - b.try_into() - .map_err(|e: anyhow::Error| native_model::UpgradeError { - msg: format!("{}", e), - source: e.into(), - }) - })??; - Ok(result) - } else { - panic!("Not implemented"); - } - } - - fn native_model_encode_body(&self) -> EncodeResult> - where - Self: Sized, - { - native_model_encode(self).map_err(|e| EncodeBodyError { - msg: format!("{}", e), - source: e.into(), - }) - } - - fn native_model_decode_body(data: Vec, _id: u32) -> DecodeResult - where - Self: Sized, - { - native_model_decode(data).map_err(|e| DecodeBodyError::DecodeError { - msg: format!("{}", e), - source: e.into(), - }) - } - - fn native_model_encode_downgrade_body(self, version: u32) -> Result> - where - Self: Sized, - { - println!( - "C::serialization_and_downgrade({}, {})", - version, - Self::native_model_version() - ); - if version == Self::native_model_version() { - let result = self.native_model_encode_body()?; - Ok(result) - } else if version < Self::native_model_version() { - let result = B::native_model_encode_downgrade_body( - self.try_into() - .map_err(|e: anyhow::Error| native_model::DowngradeError { - msg: format!("{}", e), - source: e.into(), - })?, - version, - )?; - Ok(result) - } else { - panic!("Not implemented"); - } - } -} - -impl TryFrom for B { - type Error = anyhow::Error; - - fn try_from(_: C) -> anyhow::Result { - Ok(Self {}) - } -} - -impl TryFrom for C { - type Error = anyhow::Error; - - fn try_from(_: B) -> anyhow::Result { - Ok(Self {}) - } -} - -/** -I want to manage the upgrade and downgrade of native types using From and Into traits. -Let see 3 model A,B,C of a model id 1. -A is the oldest version of the model and is the version 1. -B is the intermediate version of the model and is the version 2. -C is the most recent version of the model and is the version 3. - -We need to imagine that the data are serialized as a vector of bytes. The only things that we know -is the model id 1 and the version of the model. - -I need to found an elegant way to deserialize the data as the most recent version of the model. -**/ - -#[test] -fn test_encode_downgrade() { - let x = 3; - let result = C::native_model_encode_downgrade_body(C {}, x); - dbg!(&result); - - let x = 2; - let result = C::native_model_encode_downgrade_body(C {}, x); - dbg!(&result); - - let x = 1; - let result = C::native_model_encode_downgrade_body(C {}, x); - dbg!(&result); -} - -#[test] -fn test_decode_upgrade() { - let id = 1; - let version = 3; - let result = C::native_model_decode_upgrade_body(vec![], id, version); - dbg!(&result); - - let version = 2; - let result = C::native_model_decode_upgrade_body(vec![], id, version); - dbg!(&result); - - let version = 1; - let result = C::native_model_decode_upgrade_body(vec![], id, version); - dbg!(&result); -} - -fn native_model_decode_upgrade( - _data: Vec, - model_id: u32, - version: u32, -) -> native_model::Result -where - T: Model, -{ - if model_id == T::native_model_id() { - T::native_model_decode_upgrade_body(_data, model_id, version) - } else { - panic!("The model id {} not supported", model_id); - } -} - -#[test] -fn test_decode_upgrade_c() { - let x = 3; - let result: C = native_model_decode_upgrade(vec![], 1, x).unwrap(); - dbg!(&result); - - let x = 2; - let result: C = native_model_decode_upgrade(vec![], 1, x).unwrap(); - dbg!(&result); - - let x = 1; - let result: C = native_model_decode_upgrade(vec![], 1, x).unwrap(); - dbg!(&result); -} - -#[test] -fn test_decode_upgrade_b() { - let x = 2; - let result: B = native_model_decode_upgrade(vec![], 1, x).unwrap(); - dbg!(&result); - - // let x = 2; - // let result: B = native_model_decode_upgrade(vec![], 1, x).unwrap(); - // dbg!(&result); -} diff --git a/libraries/native_model/tests_crate/tests/example/default_codec/bincode_1_3.rs b/libraries/native_model/tests_crate/tests/example/default_codec/bincode_1_3.rs index 3f9b6a16..0472578e 100644 --- a/libraries/native_model/tests_crate/tests/example/default_codec/bincode_1_3.rs +++ b/libraries/native_model/tests_crate/tests/example/default_codec/bincode_1_3.rs @@ -1,3 +1,4 @@ +#![cfg(feature = "bincode_1_3")] use native_model::native_model; use serde::Deserialize; use serde::Serialize; diff --git a/libraries/native_model/tests_crate/tests/example/default_codec/bincode_2_rc.rs b/libraries/native_model/tests_crate/tests/example/default_codec/bincode_2_rc.rs index 90580a53..b9cc8686 100644 --- a/libraries/native_model/tests_crate/tests/example/default_codec/bincode_2_rc.rs +++ b/libraries/native_model/tests_crate/tests/example/default_codec/bincode_2_rc.rs @@ -1,3 +1,4 @@ +#![cfg(feature = "bincode_2_rc")] use native_model::{native_model}; use serde::Deserialize; use serde::Serialize; diff --git a/libraries/native_model/tests_crate/tests/example/default_codec/default.rs b/libraries/native_model/tests_crate/tests/example/default_codec/default.rs index aade18bb..a9d90bce 100644 --- a/libraries/native_model/tests_crate/tests/example/default_codec/default.rs +++ b/libraries/native_model/tests_crate/tests/example/default_codec/default.rs @@ -1,3 +1,4 @@ +#![cfg(feature = "bincode_1_3")] use native_model::native_model; use serde::Deserialize; use serde::Serialize; diff --git a/libraries/native_model/tests_crate/tests/example/default_codec/postcard_1_0.rs b/libraries/native_model/tests_crate/tests/example/default_codec/postcard_1_0.rs index c5813129..114d823f 100644 --- a/libraries/native_model/tests_crate/tests/example/default_codec/postcard_1_0.rs +++ b/libraries/native_model/tests_crate/tests/example/default_codec/postcard_1_0.rs @@ -1,3 +1,4 @@ +#![cfg(feature = "postcard_1_0")] use native_model::{native_model}; use serde::Deserialize; use serde::Serialize; diff --git a/libraries/native_model/tests_crate/tests/example/example_define_model.rs b/libraries/native_model/tests_crate/tests/example/example_define_model.rs index 6556c8f6..fb1d781d 100644 --- a/libraries/native_model/tests_crate/tests/example/example_define_model.rs +++ b/libraries/native_model/tests_crate/tests/example/example_define_model.rs @@ -1,3 +1,4 @@ +#![cfg(feature = "bincode")] use bincode::{config, Decode, Encode}; use native_model::native_model; diff --git a/libraries/native_model/tests_crate/tests/example/example_main.rs b/libraries/native_model/tests_crate/tests/example/example_main.rs index d5374da2..fb7fa69d 100644 --- a/libraries/native_model/tests_crate/tests/example/example_main.rs +++ b/libraries/native_model/tests_crate/tests/example/example_main.rs @@ -1,28 +1,13 @@ -use bincode; -use bincode::{config, Decode, Encode}; +#![cfg(feature = "bincode_1_3")] use native_model::native_model; +use serde::{Deserialize, Serialize}; -pub struct Bincode; -impl native_model::Encode for Bincode { - type Error = bincode::error::EncodeError; - fn encode(obj: &T) -> Result, bincode::error::EncodeError> { - bincode::encode_to_vec(obj, config::standard()) - } -} - -impl native_model::Decode for Bincode { - type Error = bincode::error::DecodeError; - fn decode(data: Vec) -> Result { - bincode::decode_from_slice(&data, config::standard()).map(|(result, _)| result) - } -} - -#[derive(Encode, Decode, PartialEq, Debug)] -#[native_model(id = 1, version = 1, with = Bincode)] +#[derive(Serialize, Deserialize, PartialEq, Debug)] +#[native_model(id = 1, version = 1)] struct DotV1(u32, u32); -#[derive(Encode, Decode, PartialEq, Debug)] -#[native_model(id = 1, version = 2, with = Bincode, from = DotV1)] +#[derive(Serialize, Deserialize, PartialEq, Debug)] +#[native_model(id = 1, version = 2, from = DotV1)] struct DotV2 { name: String, x: u64, diff --git a/libraries/native_model/tests_crate/tests/macro.rs b/libraries/native_model/tests_crate/tests/macro.rs index 21ea3073..4216d103 100644 --- a/libraries/native_model/tests_crate/tests/macro.rs +++ b/libraries/native_model/tests_crate/tests/macro.rs @@ -1,29 +1,16 @@ -use bincode::{config, Decode, Encode}; +#![cfg(feature = "bincode_1_3")] + +use serde::{Deserialize, Serialize}; use native_model::{native_model, Model}; -pub struct Bincode; -impl native_model::Encode for Bincode { - type Error = bincode::error::EncodeError; - fn encode(obj: &T) -> Result, bincode::error::EncodeError> { - bincode::encode_to_vec(obj, config::standard()) - } -} - -impl native_model::Decode for Bincode { - type Error = bincode::error::DecodeError; - fn decode(data: Vec) -> Result { - bincode::decode_from_slice(&data, config::standard()).map(|(result, _)| result) - } -} - -#[derive(Debug, Encode, Decode)] -#[native_model(id = 1, version = 1, with = Bincode)] +#[derive(Debug, Serialize, Deserialize)] +#[native_model(id = 1, version = 1)] struct Foo1 { x: i32, } -#[derive(Debug, Encode, Decode)] -#[native_model(id = 1, version = 2, with = Bincode, from = Foo1)] +#[derive(Debug, Serialize, Deserialize)] +#[native_model(id = 1, version = 2, from = Foo1)] struct Foo2 { x: i32, } diff --git a/libraries/native_model/tests_crate/tests/macro_decode_decode_upgrade.rs b/libraries/native_model/tests_crate/tests/macro_decode_decode_upgrade.rs index 7cd81fa0..d39e9022 100644 --- a/libraries/native_model/tests_crate/tests/macro_decode_decode_upgrade.rs +++ b/libraries/native_model/tests_crate/tests/macro_decode_decode_upgrade.rs @@ -1,31 +1,16 @@ -use bincode::{config, Decode, Encode}; +#![cfg(feature = "bincode_1_3")] use native_model::native_model; use native_model::Model; +use serde::{Deserialize, Serialize}; -pub struct Bincode; - -impl native_model::Encode for Bincode { - type Error = bincode::error::EncodeError; - fn encode(obj: &T) -> Result, bincode::error::EncodeError> { - bincode::encode_to_vec(obj, config::standard()) - } -} - -impl native_model::Decode for Bincode { - type Error = bincode::error::DecodeError; - fn decode(data: Vec) -> Result { - bincode::decode_from_slice(&data, config::standard()).map(|(result, _)| result) - } -} - -#[derive(Debug, Encode, Decode, PartialEq)] -#[native_model(id = 1, version = 1, with = Bincode)] +#[derive(Debug, Serialize, Deserialize, PartialEq)] +#[native_model(id = 1, version = 1)] struct Foo1 { x: i32, } -#[derive(Debug, Encode, Decode, PartialEq)] -#[native_model(id = 1, version = 2, with = Bincode, from = Foo1)] +#[derive(Debug, Serialize, Deserialize, PartialEq)] +#[native_model(id = 1, version = 2, from = Foo1)] struct Foo2 { x: String, } @@ -46,8 +31,8 @@ impl From for Foo1 { } } -#[derive(Debug, Encode, Decode, PartialEq)] -#[native_model(id = 1, version = 3, with = Bincode, from = Foo2)] +#[derive(Debug, Serialize, Deserialize, PartialEq)] +#[native_model(id = 1, version = 3, from = Foo2)] enum Foo3 { X(i32), } @@ -156,8 +141,8 @@ fn test_should_fail_decode_foo2_to_foo1() { )); } -#[derive(Debug, Encode, Decode, PartialEq)] -#[native_model(id = 2, version = 1, with = Bincode)] +#[derive(Debug, Serialize, Deserialize, PartialEq)] +#[native_model(id = 2, version = 1)] struct Foo1Bis { x: i32, } diff --git a/libraries/native_model/tests_crate/tests/macro_encode_decode.rs b/libraries/native_model/tests_crate/tests/macro_encode_decode.rs index bd160f2b..af2eef10 100644 --- a/libraries/native_model/tests_crate/tests/macro_encode_decode.rs +++ b/libraries/native_model/tests_crate/tests/macro_encode_decode.rs @@ -1,31 +1,17 @@ -use bincode::{config, Decode, Encode}; +#![cfg(feature = "bincode_1_3")] + use native_model::native_model; use native_model::Model; +use serde::{Deserialize, Serialize}; -pub struct Bincode; - -impl native_model::Encode for Bincode { - type Error = bincode::error::EncodeError; - fn encode(obj: &T) -> Result, bincode::error::EncodeError> { - bincode::encode_to_vec(obj, config::standard()) - } -} - -impl native_model::Decode for Bincode { - type Error = bincode::error::DecodeError; - fn decode(data: Vec) -> Result { - bincode::decode_from_slice(&data, config::standard()).map(|(result, _)| result) - } -} - -#[derive(Debug, Encode, Decode, PartialEq)] -#[native_model(id = 1, version = 1, with = Bincode)] +#[derive(Debug, Serialize, Deserialize, PartialEq)] +#[native_model(id = 1, version = 1)] struct Foo1 { x: i32, } -#[derive(Debug, Encode, Decode, PartialEq)] -#[native_model(id = 1, version = 2, with = Bincode, from = Foo1)] +#[derive(Debug, Serialize, Deserialize, PartialEq)] +#[native_model(id = 1, version = 2, from = Foo1)] struct Foo2 { x: i32, } diff --git a/libraries/native_model/tests_crate/tests/native_model_from.rs b/libraries/native_model/tests_crate/tests/native_model_from.rs index 0ec5c1c4..2c280e76 100644 --- a/libraries/native_model/tests_crate/tests/native_model_from.rs +++ b/libraries/native_model/tests_crate/tests/native_model_from.rs @@ -1,27 +1,16 @@ -use bincode::{config, Decode, Encode}; -use native_model::native_model; -pub struct Bincode; -impl native_model::Encode for Bincode { - type Error = bincode::error::EncodeError; - fn encode(obj: &T) -> Result, bincode::error::EncodeError> { - bincode::encode_to_vec(obj, config::standard()) - } -} +#![cfg(feature = "bincode_1_3")] -impl native_model::Decode for Bincode { - type Error = bincode::error::DecodeError; - fn decode(data: Vec) -> Result { - bincode::decode_from_slice(&data, config::standard()).map(|(result, _)| result) - } -} -#[derive(Debug, Encode, Decode, PartialEq)] -#[native_model(id = 1, version = 1, with = Bincode)] +use native_model::native_model; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Serialize, Deserialize, PartialEq)] +#[native_model(id = 1, version = 1)] struct Foo1 { x: i32, } -#[derive(Debug, Encode, Decode, PartialEq)] -#[native_model(id = 1, version = 2, with = Bincode, from = Foo1)] +#[derive(Debug, Serialize, Deserialize, PartialEq)] +#[native_model(id = 1, version = 2, from = Foo1)] struct Foo2 { x: i32, c: char, @@ -65,11 +54,11 @@ fn test_decode_foo1_to_foo2() { fn test_encode_foo2_to_foo1() { let foo2 = Foo2 { x: 100, c: 'a' }; let foo2_packed = native_model::encode(&foo2).unwrap(); - assert_eq!(foo2_packed, vec![1, 0, 0, 0, 2, 0, 0, 0, 200, 97]); + assert_eq!(foo2_packed, vec![1, 0, 0, 0, 2, 0, 0, 0, 100, 0, 0, 0, 97]); let (foo2_decoded, _) = native_model::decode::(foo2_packed.clone()).unwrap(); assert_eq!(Foo2 { x: 100, c: 'a' }, foo2_decoded); let foo1_packed = native_model::encode_downgrade(foo2, 1).unwrap(); - assert_eq!(foo1_packed, vec![1, 0, 0, 0, 1, 0, 0, 0, 200]); + assert_eq!(foo1_packed, vec![1, 0, 0, 0, 1, 0, 0, 0, 100, 0, 0, 0]); let (foo1_decoded, _) = native_model::decode::(foo1_packed.clone()).unwrap(); assert_eq!(Foo1 { x: 100 }, foo1_decoded); } @@ -78,11 +67,11 @@ fn test_encode_foo2_to_foo1() { fn test_encode_foo1_to_foo1() { let foo1 = Foo1 { x: 100 }; let foo1_packed = native_model::encode(&foo1).unwrap(); - assert_eq!(foo1_packed, vec![1, 0, 0, 0, 1, 0, 0, 0, 200]); + assert_eq!(foo1_packed, vec![1, 0, 0, 0, 1, 0, 0, 0, 100, 0, 0, 0]); let (foo1_decoded, _) = native_model::decode::(foo1_packed.clone()).unwrap(); assert_eq!(Foo1 { x: 100 }, foo1_decoded); let foo1_packed = native_model::encode_downgrade(foo1, 1).unwrap(); - assert_eq!(foo1_packed, vec![1, 0, 0, 0, 1, 0, 0, 0, 200]); + assert_eq!(foo1_packed, vec![1, 0, 0, 0, 1, 0, 0, 0, 100, 0, 0, 0]); let (foo1_decoded, _) = native_model::decode::(foo1_packed.clone()).unwrap(); assert_eq!(Foo1 { x: 100 }, foo1_decoded); } diff --git a/libraries/native_model/tests_crate/tests/native_model_try_from.rs b/libraries/native_model/tests_crate/tests/native_model_try_from.rs index c84da6a8..04d05445 100644 --- a/libraries/native_model/tests_crate/tests/native_model_try_from.rs +++ b/libraries/native_model/tests_crate/tests/native_model_try_from.rs @@ -1,29 +1,16 @@ -use bincode::{config, Decode, Encode}; +#![cfg(feature = "bincode_1_3")] + use native_model::native_model; +use serde::{Deserialize, Serialize}; -pub struct Bincode; - -impl native_model::Encode for Bincode { - type Error = bincode::error::EncodeError; - fn encode(obj: &T) -> Result, bincode::error::EncodeError> { - bincode::encode_to_vec(obj, config::standard()) - } -} - -impl native_model::Decode for Bincode { - type Error = bincode::error::DecodeError; - fn decode(data: Vec) -> Result { - bincode::decode_from_slice(&data, config::standard()).map(|(result, _)| result) - } -} -#[derive(Debug, Encode, Decode, PartialEq)] -#[native_model(id = 1, version = 1, with = Bincode)] +#[derive(Debug, Serialize, Deserialize, PartialEq)] +#[native_model(id = 1, version = 1)] struct Foo1 { x: i32, } -#[derive(Debug, Encode, Decode, PartialEq)] -#[native_model(id = 1, version = 2, with = Bincode, try_from = (Foo1, anyhow::Error))] +#[derive(Debug, Serialize, Deserialize, PartialEq)] +#[native_model(id = 1, version = 2, try_from = (Foo1, anyhow::Error))] struct Foo2 { x: i32, }