From 8078904de659dbd1a26b85e5c0edac929c138e54 Mon Sep 17 00:00:00 2001 From: Anton Harniakou Date: Sat, 7 Jun 2025 09:51:56 +0300 Subject: [PATCH 1/5] Implement TryFrom<&'a RefValue> for i64 --- core/types.rs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/core/types.rs b/core/types.rs index 227084035..2103dbee3 100644 --- a/core/types.rs +++ b/core/types.rs @@ -657,6 +657,17 @@ impl<'a> FromValue<'a> for &'a str { } } +impl<'a> TryFrom<&'a RefValue> for i64 { + type Error = LimboError; + + fn try_from(value: &'a RefValue) -> Result { + match value { + RefValue::Integer(i) => Ok(*i), + _ => Err(LimboError::ConversionError("Expected integer value".into())), + } + } +} + /// This struct serves the purpose of not allocating multiple vectors of bytes if not needed. /// A value in a record that has already been serialized can stay serialized and what this struct offsers /// is easy acces to each value which point to the payload. From c48557a009d6ba6aadc4b0e88229dbe43b2bec3e Mon Sep 17 00:00:00 2001 From: Anton Harniakou Date: Sat, 7 Jun 2025 09:54:05 +0300 Subject: [PATCH 2/5] Implement TryFrom<&'a RefValue> for String --- core/types.rs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/core/types.rs b/core/types.rs index 2103dbee3..65868e665 100644 --- a/core/types.rs +++ b/core/types.rs @@ -668,6 +668,17 @@ impl<'a> TryFrom<&'a RefValue> for i64 { } } +impl<'a> TryFrom<&'a RefValue> for String { + type Error = LimboError; + + fn try_from(value: &'a RefValue) -> Result { + match value { + RefValue::Text(s) => Ok(s.as_str().to_string()), + _ => Err(LimboError::ConversionError("Expected text value".into())), + } + } +} + /// This struct serves the purpose of not allocating multiple vectors of bytes if not needed. /// A value in a record that has already been serialized can stay serialized and what this struct offsers /// is easy acces to each value which point to the payload. From 62309485449193976689d259d80f1bfc3717879b Mon Sep 17 00:00:00 2001 From: Anton Harniakou Date: Sat, 7 Jun 2025 09:55:55 +0300 Subject: [PATCH 3/5] Implement TryFrom<&'a RefValue> for 'a &str --- core/types.rs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/core/types.rs b/core/types.rs index 65868e665..5deb2d16d 100644 --- a/core/types.rs +++ b/core/types.rs @@ -679,6 +679,17 @@ impl<'a> TryFrom<&'a RefValue> for String { } } +impl<'a> TryFrom<&'a RefValue> for &'a str { + type Error = LimboError; + + fn try_from(value: &'a RefValue) -> Result { + match value { + RefValue::Text(s) => Ok(s.as_str()), + _ => Err(LimboError::ConversionError("Expected text value".into())), + } + } +} + /// This struct serves the purpose of not allocating multiple vectors of bytes if not needed. /// A value in a record that has already been serialized can stay serialized and what this struct offsers /// is easy acces to each value which point to the payload. From f424bf0f461739e7101d6c43bc23116e4f0fbdee Mon Sep 17 00:00:00 2001 From: Anton Harniakou Date: Sat, 7 Jun 2025 10:03:49 +0300 Subject: [PATCH 4/5] Replace FromValue with TryFrom in ImmutableRecord method --- core/types.rs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/core/types.rs b/core/types.rs index 5deb2d16d..9d0975b97 100644 --- a/core/types.rs +++ b/core/types.rs @@ -776,12 +776,15 @@ impl ImmutableRecord { } } - pub fn get<'a, T: FromValue<'a> + 'a>(&'a self, idx: usize) -> Result { + pub fn get<'a, T: TryFrom<&'a RefValue, Error = LimboError> + 'a>( + &'a self, + idx: usize, + ) -> Result { let value = self .values .get(idx) .ok_or(LimboError::InternalError("Index out of bounds".into()))?; - T::from_value(value) + T::try_from(value) } pub fn count(&self) -> usize { From 41b5959724727f6e4f8e5ac6c682eba78ad4fb54 Mon Sep 17 00:00:00 2001 From: Anton Harniakou Date: Sat, 7 Jun 2025 10:11:47 +0300 Subject: [PATCH 5/5] Remove the FromValue trait --- core/types.rs | 33 --------------------------------- 1 file changed, 33 deletions(-) diff --git a/core/types.rs b/core/types.rs index 9d0975b97..544af0523 100644 --- a/core/types.rs +++ b/core/types.rs @@ -624,39 +624,6 @@ impl std::ops::DivAssign for Value { } } -pub trait FromValue<'a> { - fn from_value(value: &'a RefValue) -> Result - where - Self: Sized + 'a; -} - -impl<'a> FromValue<'a> for i64 { - fn from_value(value: &'a RefValue) -> Result { - match value { - RefValue::Integer(i) => Ok(*i), - _ => Err(LimboError::ConversionError("Expected integer value".into())), - } - } -} - -impl<'a> FromValue<'a> for String { - fn from_value(value: &'a RefValue) -> Result { - match value { - RefValue::Text(s) => Ok(s.as_str().to_string()), - _ => Err(LimboError::ConversionError("Expected text value".into())), - } - } -} - -impl<'a> FromValue<'a> for &'a str { - fn from_value(value: &'a RefValue) -> Result { - match value { - RefValue::Text(s) => Ok(s.as_str()), - _ => Err(LimboError::ConversionError("Expected text value".into())), - } - } -} - impl<'a> TryFrom<&'a RefValue> for i64 { type Error = LimboError;