From 9a7f47dae75299ec847420d08fd44784c18306fb Mon Sep 17 00:00:00 2001 From: linnefromice Date: Tue, 30 Jan 2024 10:31:18 +0900 Subject: [PATCH 1/6] update: storable - support bool --- src/storable.rs | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/storable.rs b/src/storable.rs index bbd59a66..87612756 100644 --- a/src/storable.rs +++ b/src/storable.rs @@ -344,6 +344,27 @@ impl Storable for u8 { }; } +impl Storable for bool { + fn to_bytes(&self) -> Cow<[u8]> { + let num: u8 = if *self { 1 } else { 0 }; + Cow::Owned(num.to_be_bytes().to_vec()) + } + + fn from_bytes(bytes: Cow<[u8]>) -> Self { + let num = u8::from_be_bytes(bytes.as_ref().try_into().unwrap()); + match num { + 0 => false, + 1 => true, + _ => panic!("Invalid bool encoding: expected 0 or 1, found {}", num) + } + } + + const BOUND: Bound = Bound::Bounded { + max_size: 1, + is_fixed_size: true, + }; +} + impl Storable for [u8; N] { fn to_bytes(&self) -> Cow<[u8]> { Cow::Borrowed(&self[..]) From 1cfe2bf82353493e31c05cb0a528f9fe22c045c1 Mon Sep 17 00:00:00 2001 From: linnefromice Date: Tue, 30 Jan 2024 10:35:26 +0900 Subject: [PATCH 2/6] test: storable bool --- src/storable.rs | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/storable.rs b/src/storable.rs index 87612756..afd52f60 100644 --- a/src/storable.rs +++ b/src/storable.rs @@ -605,3 +605,20 @@ pub(crate) const fn bytes_to_store_size(bounds: &Bounds) -> u32 { 4 } } + +#[cfg(test)] +mod unit_tests { + use super::*; + + #[test] + fn test_storable_for_bool() { + let assert_storable = |b: bool| { + let bytes = b.to_bytes(); + assert_eq!(bytes.len(), 1); + assert_eq!(b, bool::from_bytes(bytes)); + }; + + assert_storable(true); + assert_storable(false); + } +} From 490e9650427ab2dd3c0499ab511d487874c8f73f Mon Sep 17 00:00:00 2001 From: linnefromice Date: Wed, 31 Jan 2024 18:10:36 +0900 Subject: [PATCH 3/6] clean: storable bool - refactor & assert bytes.len Co-authored-by: Islam El-Ashi --- src/storable.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/storable.rs b/src/storable.rs index afd52f60..54968126 100644 --- a/src/storable.rs +++ b/src/storable.rs @@ -351,11 +351,11 @@ impl Storable for bool { } fn from_bytes(bytes: Cow<[u8]>) -> Self { - let num = u8::from_be_bytes(bytes.as_ref().try_into().unwrap()); - match num { + assert_eq!(bytes.len(), 1); + match bytes[0] { 0 => false, 1 => true, - _ => panic!("Invalid bool encoding: expected 0 or 1, found {}", num) + other => panic!("Invalid bool encoding: expected 0 or 1, found {}", other), } } From 28cf93e9f1f35342d1b535fd1d288e14e06b2520 Mon Sep 17 00:00:00 2001 From: linnefromice Date: Wed, 31 Jan 2024 18:11:05 +0900 Subject: [PATCH 4/6] test: storable bool - refactor Co-authored-by: Islam El-Ashi --- src/storable.rs | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/storable.rs b/src/storable.rs index 54968126..87a4948e 100644 --- a/src/storable.rs +++ b/src/storable.rs @@ -612,13 +612,7 @@ mod unit_tests { #[test] fn test_storable_for_bool() { - let assert_storable = |b: bool| { - let bytes = b.to_bytes(); - assert_eq!(bytes.len(), 1); - assert_eq!(b, bool::from_bytes(bytes)); - }; - - assert_storable(true); - assert_storable(false); + assert_eq!(false, Storable::from_bytes(false.to_bytes())); + assert_eq!(true, Storable::from_bytes(true.to_bytes())); } } From 95e3e21c4f68eb71dbe9dbbe81cbb1e7e9cf256b Mon Sep 17 00:00:00 2001 From: linnefromice Date: Wed, 31 Jan 2024 18:15:54 +0900 Subject: [PATCH 5/6] clean: move test for storable bool to src/storable/tests.rs --- src/storable.rs | 11 ----------- src/storable/tests.rs | 6 ++++++ 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/src/storable.rs b/src/storable.rs index 87a4948e..dfcb55e8 100644 --- a/src/storable.rs +++ b/src/storable.rs @@ -605,14 +605,3 @@ pub(crate) const fn bytes_to_store_size(bounds: &Bounds) -> u32 { 4 } } - -#[cfg(test)] -mod unit_tests { - use super::*; - - #[test] - fn test_storable_for_bool() { - assert_eq!(false, Storable::from_bytes(false.to_bytes())); - assert_eq!(true, Storable::from_bytes(true.to_bytes())); - } -} diff --git a/src/storable/tests.rs b/src/storable/tests.rs index 47c2fe5d..4ac7f878 100644 --- a/src/storable/tests.rs +++ b/src/storable/tests.rs @@ -169,3 +169,9 @@ fn to_bytes_checked_fixed_element_correct_size_no_panic() { assert_eq!(X.to_bytes_checked(), Cow::Borrowed(&[1, 2, 3, 4, 5])); } + +#[test] +fn storable_for_bool() { + assert_eq!(false, Storable::from_bytes(false.to_bytes())); + assert_eq!(true, Storable::from_bytes(true.to_bytes())); +} From f11d61e3188fdacc0c7e3f3636574095e485b16c Mon Sep 17 00:00:00 2001 From: linnefromice Date: Wed, 31 Jan 2024 21:02:51 +0900 Subject: [PATCH 6/6] clean: test for storable bool - clippy --- src/storable/tests.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/storable/tests.rs b/src/storable/tests.rs index 4ac7f878..e04c55e5 100644 --- a/src/storable/tests.rs +++ b/src/storable/tests.rs @@ -172,6 +172,6 @@ fn to_bytes_checked_fixed_element_correct_size_no_panic() { #[test] fn storable_for_bool() { - assert_eq!(false, Storable::from_bytes(false.to_bytes())); - assert_eq!(true, Storable::from_bytes(true.to_bytes())); + assert!(!bool::from_bytes(false.to_bytes())); + assert!(bool::from_bytes(true.to_bytes())); }