From fd46c51d7f9ea3c33e0870cc57f0979a20183607 Mon Sep 17 00:00:00 2001 From: Mike Hommey Date: Thu, 23 Feb 2023 01:25:36 +0000 Subject: [PATCH] Bug 1817900 - Update rust_decimal to 1.28.1. r=emilio,supply-chain-reviewers Differential Revision: https://phabricator.services.mozilla.com/D170453 --- Cargo.lock | 4 +- supply-chain/audits.toml | 5 ++ .../rust/rust_decimal/.cargo-checksum.json | 2 +- third_party/rust/rust_decimal/CHANGELOG.md | 24 ++++++++ third_party/rust/rust_decimal/Cargo.toml | 7 ++- third_party/rust/rust_decimal/README.md | 4 +- third_party/rust/rust_decimal/src/decimal.rs | 9 +-- third_party/rust/rust_decimal/src/lib.rs | 1 + .../rust/rust_decimal/src/ops/array.rs | 43 +++++++++----- .../rust/rust_decimal/src/postgres/driver.rs | 14 +++++ third_party/rust/rust_decimal/src/serde.rs | 58 ++++++++++++++++++- .../rust/rust_decimal/tests/decimal_tests.rs | 6 ++ 12 files changed, 147 insertions(+), 30 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a457f6d73cdf..5f349873275a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4659,9 +4659,9 @@ dependencies = [ [[package]] name = "rust_decimal" -version = "1.27.0" +version = "1.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33c321ee4e17d2b7abe12b5d20c1231db708dd36185c8a21e9de5fed6da4dbe9" +checksum = "e13cf35f7140155d02ba4ec3294373d513a3c7baa8364c162b030e33c61520a8" dependencies = [ "arrayvec", "num-traits", diff --git a/supply-chain/audits.toml b/supply-chain/audits.toml index a14bd81dd98a..6b65db82ae4e 100644 --- a/supply-chain/audits.toml +++ b/supply-chain/audits.toml @@ -2049,6 +2049,11 @@ who = "Mike Hommey " criteria = "safe-to-deploy" delta = "1.26.1 -> 1.27.0" +[[audits.rust_decimal]] +who = "Mike Hommey " +criteria = "safe-to-deploy" +delta = "1.27.0 -> 1.28.1" + [[audits.rustc-hash]] who = "Bobby Holley " criteria = "safe-to-deploy" diff --git a/third_party/rust/rust_decimal/.cargo-checksum.json b/third_party/rust/rust_decimal/.cargo-checksum.json index 94e58dfb3aca..3973992719f2 100644 --- a/third_party/rust/rust_decimal/.cargo-checksum.json +++ b/third_party/rust/rust_decimal/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"BUILD.md":"302c5260cb6eb87efc1d968b42f082ea3569cca084c0cbcc1821a8670235c19a","CHANGELOG.md":"e5e9c86930f1e0e939c17d6fb3b24edd35c50cdcbcefc1737ee22ffb854a17ad","CODE_OF_CONDUCT.md":"64765f10290cfce7191b4208cb21698b708a118568f5016602cccc304846a09a","CONTRIBUTING.md":"471d6281fb5038e17e32d3b4450aacf542a396709605aa170e07d3971d70b9c1","Cargo.toml":"0cbab1d6804a7e986912ed474bafd1f2c6481d7da38344340ea66c0b6fc291b6","LICENSE":"f8218253704e32441cafea1b9b3bcb2c6a3c51c5553cd8513d179290202bccb2","Makefile.toml":"d8d548ac651ce87294bafb6f55bedd1e6e78ce6332594963f6d02db9d7452d13","README.md":"7c954859ce5f2e41584a966d919e52e69c0c37c8c5694c321591bca2c35a4fa6","benches/comparison.rs":"e8b14531b129acb8ffca2dd44565d9160f510ec38abd32fc49fd4e2386067e25","benches/lib_benches.rs":"899ecdd258350ab1c49218b8f0213bbbc2ae937093bd0afa46be7eb1a28afd72","build.rs":"ae5b0e60460390f8411e19d7721524f492a8a988132c74f05867a261b513d54e","rustfmt.toml":"f33bda44a494d17c95b7bc1b3dd88c203030b75be766f3a7f9b63ef45d960bb0","src/arithmetic_impls.rs":"87a87bc46214ba7f239dfafcffb6ca05453f2ff07ed36e94792548d508da7a9d","src/constants.rs":"5a31626a234e4bb1f06752d7db6ebb39a543c5e0df1e929dd0032689ef7aaa1f","src/decimal.rs":"b73235b13b1f2c3aeb9dd3893a0127cde14d99856aba5d19c210c62b57426e63","src/error.rs":"27cdf052d2a956b81cfe0bf512354e3e0772fa9fe5a2a9e8b2246a53ed58ad28","src/fuzz.rs":"86c07d8d541b9ee92a51275993b686902712f94c30785ba93f38997f3569e700","src/lib.rs":"0a8ee05028cd74878fda08d40850e75704349b9782bc5ad9462be7127d09312c","src/maths.rs":"f82016c5ae8406103835a3fedebeb1360cfe3cc40ac4ab28e13da89636c6782c","src/mysql.rs":"3352e1d72561b022427539fc5025f5f01f00be65ebf6492761668effc9e1eeeb","src/ops.rs":"4d426a35f73b0b69cbceee6e01c6eff59b8cc09aab7c885570aea52d8f258f66","src/ops/add.rs":"a85b6214be92a5563e8bb4a936275d8de094507d77384c9184d63583a78b3f55","src/ops/array.rs":"17a1af576390c8f33ed6c13e1b62722eeaa24c0c0086fb951def6d5dacfdc1cd","src/ops/cmp.rs":"95437401daf93d60425c388fc243e52ad5570cfe6c5d818b5aa144759a5f2ef1","src/ops/common.rs":"6d48ecfa4796a38cb9d4c48f50ffed5d1ee79ba8e168a175615b6fe97194b7c2","src/ops/div.rs":"6b1e90b383293eb51f20f22846002a61f17211f7791860d4e9d6f82ad940fb87","src/ops/legacy.rs":"08bc45454b1815a592cc2fd02df8c50bec36c831ab7af098018e29dfc81f0ec4","src/ops/mul.rs":"b0bb69461b4934cb53c49e105d21da8aa661e1215e8797b8fdc64564df431d92","src/ops/rem.rs":"125d64e9425effd01d4ff400f811f43ef76bf846b6823195059648fdf004b592","src/postgres.rs":"34e35b73cb55fa5f303251f3e074c4e30509973900810a9f423f80294effcc05","src/postgres/common.rs":"7f52920a83f9c5081f7b7a626ef4cff65bbaef51133c7eaf364318212d4aed15","src/postgres/diesel.rs":"fb2d7783d279730a6c77458c6bb58f839e9b48d8209ed2e8395e2f72d7032c87","src/postgres/driver.rs":"de3081afea1038ff1d69d10b62ea65f97186c7ad949f964db0cdb17979bdd763","src/rand.rs":"382f057f4a8752a6028afbecd3cb27422d530c6aa0142ddc04b698b501f8f9db","src/rocket.rs":"4d05f292281e4d463abeba603b07ea460065cb1b8ec1c6dafdb4e41f7b89e828","src/serde.rs":"dbb622e628b799d556a23a6fe52bd5bc33726e9cb661b48535c61f50bcf12cae","src/str.rs":"ca8ce5a61fc7d940355a8f1154492a62d06a8c2f825061044a1d422354d6c5ea","tests/decimal_tests.rs":"b2d4a497942575acb0b87e87c9cd17b6afb2ce0fb4e8a359f197fa417228b323","tests/macros.rs":"f4e1ade99bf8a7aaf2a2d4ee557df5b0b32266a349daf59b2e8b1ae7bc72599c","tests/version-numbers.rs":"73301b7bfe500eada5ede66f0dce89bd3e354af50a8e7a123b02931cd5eb8e16"},"package":"33c321ee4e17d2b7abe12b5d20c1231db708dd36185c8a21e9de5fed6da4dbe9"} \ No newline at end of file +{"files":{"BUILD.md":"302c5260cb6eb87efc1d968b42f082ea3569cca084c0cbcc1821a8670235c19a","CHANGELOG.md":"f4eab626b23c7a76e17e2601e7e6fc920090134f59411472c0eaab5b06bd62d1","CODE_OF_CONDUCT.md":"64765f10290cfce7191b4208cb21698b708a118568f5016602cccc304846a09a","CONTRIBUTING.md":"471d6281fb5038e17e32d3b4450aacf542a396709605aa170e07d3971d70b9c1","Cargo.toml":"70a6cc3be824c2c135094b3f217262d86d16a3bc613acf9a12c71cb317002bec","LICENSE":"f8218253704e32441cafea1b9b3bcb2c6a3c51c5553cd8513d179290202bccb2","Makefile.toml":"d8d548ac651ce87294bafb6f55bedd1e6e78ce6332594963f6d02db9d7452d13","README.md":"c65eef618921de6d55955f7ec88c5fdde88a2b8ccdcab6e7fd07def01d90ab14","benches/comparison.rs":"e8b14531b129acb8ffca2dd44565d9160f510ec38abd32fc49fd4e2386067e25","benches/lib_benches.rs":"899ecdd258350ab1c49218b8f0213bbbc2ae937093bd0afa46be7eb1a28afd72","build.rs":"ae5b0e60460390f8411e19d7721524f492a8a988132c74f05867a261b513d54e","rustfmt.toml":"f33bda44a494d17c95b7bc1b3dd88c203030b75be766f3a7f9b63ef45d960bb0","src/arithmetic_impls.rs":"87a87bc46214ba7f239dfafcffb6ca05453f2ff07ed36e94792548d508da7a9d","src/constants.rs":"5a31626a234e4bb1f06752d7db6ebb39a543c5e0df1e929dd0032689ef7aaa1f","src/decimal.rs":"f4f9883e1196b1b316dc7fcaaf94f8b06963ab1d26d56274caaf793afca582b2","src/error.rs":"27cdf052d2a956b81cfe0bf512354e3e0772fa9fe5a2a9e8b2246a53ed58ad28","src/fuzz.rs":"86c07d8d541b9ee92a51275993b686902712f94c30785ba93f38997f3569e700","src/lib.rs":"efff31de36fdfd0b8959982e4dc42eda6512f5fa5bb66fe25eb5ba948f0af6f2","src/maths.rs":"f82016c5ae8406103835a3fedebeb1360cfe3cc40ac4ab28e13da89636c6782c","src/mysql.rs":"3352e1d72561b022427539fc5025f5f01f00be65ebf6492761668effc9e1eeeb","src/ops.rs":"4d426a35f73b0b69cbceee6e01c6eff59b8cc09aab7c885570aea52d8f258f66","src/ops/add.rs":"a85b6214be92a5563e8bb4a936275d8de094507d77384c9184d63583a78b3f55","src/ops/array.rs":"8a900c845e52843f34ae19742a5886cd8becf54ddd6d1923fd0fbd9588c605e9","src/ops/cmp.rs":"95437401daf93d60425c388fc243e52ad5570cfe6c5d818b5aa144759a5f2ef1","src/ops/common.rs":"6d48ecfa4796a38cb9d4c48f50ffed5d1ee79ba8e168a175615b6fe97194b7c2","src/ops/div.rs":"6b1e90b383293eb51f20f22846002a61f17211f7791860d4e9d6f82ad940fb87","src/ops/legacy.rs":"08bc45454b1815a592cc2fd02df8c50bec36c831ab7af098018e29dfc81f0ec4","src/ops/mul.rs":"b0bb69461b4934cb53c49e105d21da8aa661e1215e8797b8fdc64564df431d92","src/ops/rem.rs":"125d64e9425effd01d4ff400f811f43ef76bf846b6823195059648fdf004b592","src/postgres.rs":"34e35b73cb55fa5f303251f3e074c4e30509973900810a9f423f80294effcc05","src/postgres/common.rs":"7f52920a83f9c5081f7b7a626ef4cff65bbaef51133c7eaf364318212d4aed15","src/postgres/diesel.rs":"fb2d7783d279730a6c77458c6bb58f839e9b48d8209ed2e8395e2f72d7032c87","src/postgres/driver.rs":"dfc5001e4d6235e8ce535066887a910681581e9e1aedffd73b265c065dbc497c","src/rand.rs":"382f057f4a8752a6028afbecd3cb27422d530c6aa0142ddc04b698b501f8f9db","src/rocket.rs":"4d05f292281e4d463abeba603b07ea460065cb1b8ec1c6dafdb4e41f7b89e828","src/serde.rs":"b3fda74ee7ec9317e074f2d271a59ae6024c2a324beef1169d5df1747dad9ba2","src/str.rs":"ca8ce5a61fc7d940355a8f1154492a62d06a8c2f825061044a1d422354d6c5ea","tests/decimal_tests.rs":"6e06f4f9558e983c1e39875508f5e96341284664e0f245b2b265587c3b5ab3a0","tests/macros.rs":"f4e1ade99bf8a7aaf2a2d4ee557df5b0b32266a349daf59b2e8b1ae7bc72599c","tests/version-numbers.rs":"73301b7bfe500eada5ede66f0dce89bd3e354af50a8e7a123b02931cd5eb8e16"},"package":"e13cf35f7140155d02ba4ec3294373d513a3c7baa8364c162b030e33c61520a8"} \ No newline at end of file diff --git a/third_party/rust/rust_decimal/CHANGELOG.md b/third_party/rust/rust_decimal/CHANGELOG.md index acd397bdd8b7..6844a9af2b25 100644 --- a/third_party/rust/rust_decimal/CHANGELOG.md +++ b/third_party/rust/rust_decimal/CHANGELOG.md @@ -1,5 +1,29 @@ # Version History +## 1.28.1 + +### Fixed + +* Bumped `borsh` and `criterion` dependencies to the latest versions. ([#568](https://github.com/paupino/rust-decimal/pull/568)) +* Removed erroneous debug statements in `serde-with-str` feature. ([#571](https://github.com/paupino/rust-decimal/pull/571)) + +Thanks [@attila-lin](https://github.com/attila-lin) for your help bumping dependencies. + +## 1.28.0 + +### Added + +* Implement `TryFrom<&str>` for `Decimal` ([#560](https://github.com/paupino/rust-decimal/pull/560)) + +### Fixed + +* Explicit string deserialize for `Option` when using `serde-with-str` ([#565](https://github.com/paupino/rust-decimal/pull/565)) +* Fix for `rescale` preventing `Decimal::ZERO` to be rescaled to an invalid precision ([#566](https://github.com/paupino/rust-decimal/pull/566)) + +### Credit + +Thank you to [@c410-f3r](https://github.com/c410-f3r) for your diligent help adding features to this library! + ## 1.27.0 ### Added diff --git a/third_party/rust/rust_decimal/Cargo.toml b/third_party/rust/rust_decimal/Cargo.toml index 8eb8806c24c1..1bbbd9ba57b1 100644 --- a/third_party/rust/rust_decimal/Cargo.toml +++ b/third_party/rust/rust_decimal/Cargo.toml @@ -13,7 +13,7 @@ edition = "2021" rust-version = "1.60" name = "rust_decimal" -version = "1.27.0" +version = "1.28.1" authors = ["Paul Mason "] build = "build.rs" exclude = ["tests/generated/*"] @@ -53,7 +53,7 @@ version = "0.7" default-features = false [dependencies.borsh] -version = "0.9" +version = "0.10.0" optional = true default-features = false @@ -137,7 +137,7 @@ version = "1.0" default-features = false [dev-dependencies.criterion] -version = "0.3" +version = "0.4.0" default-features = false [dev-dependencies.csv] @@ -223,6 +223,7 @@ rkyv-safe = [ ] rocket-traits = ["rocket"] rust-fuzz = ["arbitrary"] +serde = ["dep:serde"] serde-arbitrary-precision = ["serde-with-arbitrary-precision"] serde-bincode = ["serde-str"] serde-float = ["serde-with-float"] diff --git a/third_party/rust/rust_decimal/README.md b/third_party/rust/rust_decimal/README.md index 7a7a6b88d8a9..9620cc38e524 100644 --- a/third_party/rust/rust_decimal/README.md +++ b/third_party/rust/rust_decimal/README.md @@ -29,8 +29,8 @@ Alternatively, you can edit your `Cargo.toml` directly and run `cargo update`: ```toml [dependencies] -rust_decimal = "1.27" -rust_decimal_macros = "1.27" +rust_decimal = "1.28" +rust_decimal_macros = "1.28" ``` ## Usage diff --git a/third_party/rust/rust_decimal/src/decimal.rs b/third_party/rust/rust_decimal/src/decimal.rs index 85fb1883ec0a..e98f7b4e4ec3 100644 --- a/third_party/rust/rust_decimal/src/decimal.rs +++ b/third_party/rust/rust_decimal/src/decimal.rs @@ -1770,7 +1770,7 @@ impl_try_from_decimal!(u128, Decimal::to_u128, integer_docs!(true)); // See https://github.com/rust-lang/rustfmt/issues/5062 for more information. #[rustfmt::skip] macro_rules! impl_try_from_primitive { - ($TFrom:ty, $conversion_fn:path) => { + ($TFrom:ty, $conversion_fn:path $(, $err:expr)?) => { #[doc = concat!( "Try to convert a `", stringify!($TFrom), @@ -1781,14 +1781,15 @@ macro_rules! impl_try_from_primitive { #[inline] fn try_from(t: $TFrom) -> Result { - $conversion_fn(t).ok_or_else(|| Error::ConversionTo("Decimal".into())) + $conversion_fn(t) $( .ok_or_else(|| $err) )? } } }; } -impl_try_from_primitive!(f32, Self::from_f32); -impl_try_from_primitive!(f64, Self::from_f64); +impl_try_from_primitive!(f32, Self::from_f32, Error::ConversionTo("Decimal".into())); +impl_try_from_primitive!(f64, Self::from_f64, Error::ConversionTo("Decimal".into())); +impl_try_from_primitive!(&str, core::str::FromStr::from_str); macro_rules! impl_from { ($T:ty, $from_ty:path) => { diff --git a/third_party/rust/rust_decimal/src/lib.rs b/third_party/rust/rust_decimal/src/lib.rs index 79457585c520..84239fd6a88d 100644 --- a/third_party/rust/rust_decimal/src/lib.rs +++ b/third_party/rust/rust_decimal/src/lib.rs @@ -1,5 +1,6 @@ #![doc = include_str!(concat!(env!("OUT_DIR"), "/README-lib.md"))] #![forbid(unsafe_code)] +#![deny(clippy::print_stdout, clippy::print_stderr)] #![cfg_attr(not(feature = "std"), no_std)] extern crate alloc; diff --git a/third_party/rust/rust_decimal/src/ops/array.rs b/third_party/rust/rust_decimal/src/ops/array.rs index 651ba55d8939..2ab58b4dfbd8 100644 --- a/third_party/rust/rust_decimal/src/ops/array.rs +++ b/third_party/rust/rust_decimal/src/ops/array.rs @@ -1,4 +1,4 @@ -use crate::constants::{POWERS_10, U32_MASK}; +use crate::constants::{MAX_PRECISION_U32, POWERS_10, U32_MASK}; /// Rescales the given decimal to new scale. /// e.g. with 1.23 and new scale 3 rescale the value to 1.230 @@ -10,7 +10,7 @@ pub(crate) fn rescale_internal(value: &mut [u32; 3], value_scale: &mut u32, new_ } if is_all_zero(value) { - *value_scale = new_scale; + *value_scale = new_scale.min(MAX_PRECISION_U32); return; } @@ -299,29 +299,42 @@ mod test { } let tests = &[ - ("1", 0, "1"), - ("1", 1, "1.0"), - ("1", 5, "1.00000"), - ("1", 10, "1.0000000000"), - ("1", 20, "1.00000000000000000000"), - ("0.6386554621848739495798319328", 27, "0.638655462184873949579831933"), + ("1", 0, "1", 0), + ("1", 1, "1.0", 1), + ("1", 5, "1.00000", 5), + ("1", 10, "1.0000000000", 10), + ("1", 20, "1.00000000000000000000", 20), ( - "843.65000000", // Scale 8 - 25, // 25 - "843.6500000000000000000000000", // 25 + "0.6386554621848739495798319328", + 27, + "0.638655462184873949579831933", + 27, ), ( - "843.65000000", // Scale 8 - 30, // 30 - "843.6500000000000000000000000000", // 28 + "843.65000000", // Scale 8 + 25, + "843.6500000000000000000000000", + 25, ), + ( + "843.65000000", // Scale 8 + 30, + "843.6500000000000000000000000", + 25, // Only fits 25 + ), + ("0", 130, "0.000000000000000000000000000000", 28), ]; - for &(value_raw, new_scale, expected_value) in tests { + for &(value_raw, new_scale, expected_value, expected_scale) in tests { let (expected_value, _) = extract(expected_value); let (mut value, mut value_scale) = extract(value_raw); rescale_internal(&mut value, &mut value_scale, new_scale); assert_eq!(value, expected_value); + assert_eq!( + value_scale, expected_scale, + "value: {}, requested scale: {}", + value_raw, new_scale + ); } } diff --git a/third_party/rust/rust_decimal/src/postgres/driver.rs b/third_party/rust/rust_decimal/src/postgres/driver.rs index 15574ee864ff..7d185e3bab06 100644 --- a/third_party/rust/rust_decimal/src/postgres/driver.rs +++ b/third_party/rust/rust_decimal/src/postgres/driver.rs @@ -236,6 +236,20 @@ mod test { assert_eq!(None, result); } + #[test] + fn read_very_small_numeric_type() { + let mut client = match Client::connect(&get_postgres_url(), NoTls) { + Ok(x) => x, + Err(err) => panic!("{:#?}", err), + }; + let result: Decimal = match client.query("SELECT 1e-130::NUMERIC(130, 0)", &[]) { + Ok(x) => x.iter().next().unwrap().get(0), + Err(err) => panic!("error - {:#?}", err), + }; + // We compare this to zero since it is so small that it is effectively zero + assert_eq!(Decimal::ZERO, result); + } + #[test] fn read_numeric_type() { let mut client = match Client::connect(&get_postgres_url(), NoTls) { diff --git a/third_party/rust/rust_decimal/src/serde.rs b/third_party/rust/rust_decimal/src/serde.rs index fa53c74fc9cc..ce876309f9a1 100644 --- a/third_party/rust/rust_decimal/src/serde.rs +++ b/third_party/rust/rust_decimal/src/serde.rs @@ -259,7 +259,7 @@ pub mod str_option { where D: serde::de::Deserializer<'de>, { - deserializer.deserialize_option(OptionDecimalVisitor) + deserializer.deserialize_option(OptionDecimalStrVisitor) } pub fn serialize(value: &Option, serializer: S) -> Result @@ -269,7 +269,7 @@ pub mod str_option { match *value { Some(ref decimal) => { let decimal = crate::str::to_str_internal(decimal, true, None); - serializer.serialize_str(decimal.0.as_ref()) + serializer.serialize_some(decimal.0.as_ref()) } None => serializer.serialize_none(), } @@ -404,6 +404,32 @@ impl<'de> serde::de::Visitor<'de> for OptionDecimalVisitor { } } +#[cfg(feature = "serde-with-str")] +struct OptionDecimalStrVisitor; + +#[cfg(feature = "serde-with-str")] +impl<'de> serde::de::Visitor<'de> for OptionDecimalStrVisitor { + type Value = Option; + + fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + formatter.write_str("a Decimal type representing a fixed-point number") + } + + fn visit_none(self) -> Result, E> + where + E: serde::de::Error, + { + Ok(None) + } + + fn visit_some(self, d: D) -> Result, D::Error> + where + D: serde::de::Deserializer<'de>, + { + d.deserialize_str(DecimalVisitor).map(Some) + } +} + #[cfg(feature = "serde-with-arbitrary-precision")] struct DecimalKey; @@ -744,7 +770,7 @@ mod test { use bincode::{deserialize, serialize}; #[derive(Serialize, Deserialize)] - pub struct BincodeExample { + struct BincodeExample { #[serde(with = "crate::serde::str")] value: Decimal, } @@ -752,6 +778,7 @@ mod test { let data = [ ("0", "0"), ("0.00", "0.00"), + ("1.234", "1.234"), ("3.14159", "3.14159"), ("-3.14159", "-3.14159"), ("1234567890123.4567890", "1234567890123.4567890"), @@ -768,6 +795,31 @@ mod test { } } + #[test] + #[cfg(feature = "serde-with-str")] + fn with_str_bincode_optional() { + use bincode::{deserialize, serialize}; + + #[derive(Serialize, Deserialize)] + struct BincodeExample { + #[serde(with = "crate::serde::str_option")] + value: Option, + } + + // Some(value) + let value = Some(Decimal::new(1234, 3)); + let input = BincodeExample { value }; + let encoded = serialize(&input).unwrap(); + let decoded: BincodeExample = deserialize(&encoded[..]).unwrap(); + assert_eq!(value, decoded.value, "Some(value)"); + + // None + let input = BincodeExample { value: None }; + let encoded = serialize(&input).unwrap(); + let decoded: BincodeExample = deserialize(&encoded[..]).unwrap(); + assert_eq!(None, decoded.value, "None"); + } + #[test] #[cfg(feature = "serde-with-str")] fn with_str_optional() { diff --git a/third_party/rust/rust_decimal/tests/decimal_tests.rs b/third_party/rust/rust_decimal/tests/decimal_tests.rs index b2c9f07a0635..71dcf008560b 100644 --- a/third_party/rust/rust_decimal/tests/decimal_tests.rs +++ b/third_party/rust/rust_decimal/tests/decimal_tests.rs @@ -2859,6 +2859,12 @@ fn it_converts_from_u128() { } } +#[test] +fn it_converts_from_str() { + assert_eq!(Decimal::try_from("1").unwrap(), Decimal::ONE); + assert_eq!(Decimal::try_from("10").unwrap(), Decimal::TEN); +} + #[test] fn it_converts_from_f32() { use num_traits::FromPrimitive;