diff --git a/SewUp.wiki b/SewUp.wiki index 663e75e8f..5f3ac3c53 160000 --- a/SewUp.wiki +++ b/SewUp.wiki @@ -1 +1 @@ -Subproject commit 663e75e8f08522566c7993270ba795dbd007ab9d +Subproject commit 5f3ac3c53806cab6fe84f8a548a341d2d64de3a2 diff --git a/sewup/src/kv/traits/key.rs b/sewup/src/kv/traits/key.rs index f0d4a2e0e..06d9e656f 100644 --- a/sewup/src/kv/traits/key.rs +++ b/sewup/src/kv/traits/key.rs @@ -161,3 +161,34 @@ macro_rules! primitive_key { } primitive_key!(u8, u16, u32, u64, usize); + +impl Key for String { + fn from_row_key(x: &Row) -> Result { + Ok(x.to_utf8_string()?) + } + fn to_row_key(&self) -> Result { + Ok(self.into()) + } +} + +macro_rules! sized_string_key { + ( $($n:expr),* ) => { + $( + impl Key for [Raw; $n] { + fn from_row_key(r: &Row) -> Result { + let mut buffer: [Raw; $n] = Default::default(); + buffer.copy_from_slice(&r.inner[0..$n]); + Ok(buffer) + } + fn to_row_key(&self) -> Result { + Ok(self.to_vec().into()) + } + } + )* + } +} + +sized_string_key!( + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32 +); diff --git a/sewup/src/kv/traits/value.rs b/sewup/src/kv/traits/value.rs index 69c981c62..4610bf213 100644 --- a/sewup/src/kv/traits/value.rs +++ b/sewup/src/kv/traits/value.rs @@ -112,7 +112,7 @@ macro_rules! primitive_value { } fn from_row_value(row: &Row) -> Result { - let r: Raw = TryFrom::try_from(row).expect("primitive key should be 1 Raw"); + let r: Raw = TryFrom::try_from(row).expect("primitive value should be 1 Raw"); Ok(r.into()) } } @@ -121,3 +121,34 @@ macro_rules! primitive_value { } primitive_value!(u8, u16, u32, u64, usize); + +impl Value for String { + fn to_row_value(&self) -> Result { + Ok(self.into()) + } + fn from_row_value(row: &Row) -> Result { + Ok(row.to_utf8_string()?) + } +} + +macro_rules! sized_string_value { + ( $($n:expr),* ) => { + $( + impl Value for [Raw; $n] { + fn to_row_value(&self) -> Result { + Ok(self.to_vec().into()) + } + fn from_row_value(row: &Row) -> Result { + let mut buffer: [Raw; $n] = Default::default(); + buffer.copy_from_slice(&row.inner[0..$n]); + Ok(buffer) + } + } + )* + } +} + +sized_string_value!( + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32 +); diff --git a/sewup/src/types/row.rs b/sewup/src/types/row.rs index da58a0d3b..9d10c9c76 100644 --- a/sewup/src/types/row.rs +++ b/sewup/src/types/row.rs @@ -7,7 +7,7 @@ use crate::types::*; /// A list of `Raw`, which helps you store much bigger data than a `Raw` #[derive(Clone, Serialize, Deserialize)] pub struct Row { - pub(super) inner: Vec, + pub(crate) inner: Vec, _buffer: Vec, } @@ -219,3 +219,28 @@ impl std::borrow::Borrow<[u8]> for &Row { self._buffer.as_ref() } } + +macro_rules! from_array { + ($($n:expr),*) => { + $( + impl From<&[Raw; $n]> for Row { + fn from(v: &[Raw; $n]) -> Self { + Self::from(v.to_vec()) + } + } + + impl Into<[Raw; $n]> for Row { + fn into(self) -> [Raw; $n]{ + let mut buffer : [Raw; $n] = Default::default(); + buffer.copy_from_slice(&self.inner[0..$n]); + buffer + } + } + )* + } +} + +from_array!( + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32 +);