Skip to content

Commit c8fe4b9

Browse files
committed
Make creating a HVector from raw bytes a failable operation
1 parent 5ba192a commit c8fe4b9

File tree

5 files changed

+14
-10
lines changed

5 files changed

+14
-10
lines changed

helix-db/src/helix_engine/vector_core/mod.rs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -230,10 +230,13 @@ impl<'arena> HVector<'arena> {
230230
pub fn raw_vector_data_to_vec<'txn>(
231231
raw_vector_data: &'txn [u8],
232232
arena: &'arena bumpalo::Bump,
233-
) -> bumpalo::collections::Vec<'arena, f32> {
233+
) -> VectorCoreResult<bumpalo::collections::Vec<'arena, f32>> {
234234
let mut bump_vec = bumpalo::collections::Vec::<'arena, f32>::new_in(arena);
235-
bump_vec.extend_from_slice(bytemuck::cast_slice(raw_vector_data));
236-
bump_vec
235+
bump_vec.extend_from_slice(bytemuck::try_cast_slice(raw_vector_data).map_err(|err| {
236+
VectorError::ConversionError(format!("Error casting raw bytes to &[f32]: {}", err))
237+
})?);
238+
239+
Ok(bump_vec)
237240
}
238241

239242
pub fn from_raw_vector_data<'txn>(

helix-db/src/protocol/custom_serde/error_handling_tests.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ mod error_handling_tests {
228228
fn test_vector_cast_empty_raw_data_panics() {
229229
let arena = Bump::new();
230230
let empty_data: &[u8] = &[];
231-
HVector::raw_vector_data_to_vec(empty_data, &arena);
231+
HVector::raw_vector_data_to_vec(empty_data, &arena).unwrap();
232232
}
233233

234234
#[test]
@@ -260,12 +260,12 @@ mod error_handling_tests {
260260
}
261261

262262
#[test]
263-
#[should_panic(expected = "is not a multiple of size_of::<f32>()")]
263+
#[should_panic]
264264
fn test_vector_misaligned_data_bytes_panics() {
265265
let arena = Bump::new();
266266
// 7 bytes is not a multiple of 4 (size of f32)
267267
let misaligned: &[u8] = &[0, 1, 2, 3, 4, 5, 6];
268-
HVector::raw_vector_data_to_vec(misaligned, &arena);
268+
HVector::raw_vector_data_to_vec(misaligned, &arena).unwrap();
269269
}
270270

271271
#[test]

helix-db/src/protocol/custom_serde/property_based_tests.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -344,7 +344,7 @@ mod property_based_tests {
344344

345345
// Convert to bytes and back
346346
let bytes = create_vector_bytes(&data);
347-
let restored = HVector::raw_vector_data_to_vec( &bytes,&arena);
347+
let restored = HVector::raw_vector_data_to_vec( &bytes,&arena).unwrap();
348348

349349
prop_assert_eq!(restored.len(), data.len());
350350

helix-db/src/protocol/custom_serde/vector_serde.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,8 @@ impl<'de, 'txn, 'arena> serde::de::DeserializeSeed<'de> for VectorDeSeed<'txn, '
9494
.next_element_seed(OptionPropertiesMapDeSeed { arena: self.arena })?
9595
.ok_or_else(|| serde::de::Error::custom("Expected properties field"))?;
9696

97-
let data = HVector::raw_vector_data_to_vec(self.raw_vector_data, self.arena);
97+
let data = HVector::raw_vector_data_to_vec(self.raw_vector_data, self.arena)
98+
.map_err(|err| serde::de::Error::custom(err))?;
9899

99100
Ok(HVector {
100101
id: self.id,

helix-db/src/protocol/custom_serde/vector_serde_tests.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ mod vector_serialization_tests {
175175
let original_data: Vec<f32> = (0..128).map(|i| i as f32).collect();
176176
let raw_bytes = create_vector_bytes(&original_data);
177177

178-
let casted_data = HVector::raw_vector_data_to_vec(&raw_bytes, &arena);
178+
let casted_data = HVector::raw_vector_data_to_vec(&raw_bytes, &arena).unwrap();
179179

180180
assert_eq!(casted_data.len(), 128);
181181
for (i, &val) in casted_data.iter().enumerate() {
@@ -189,7 +189,7 @@ mod vector_serialization_tests {
189189
let original_data = vec![3.14159, 2.71828, 1.41421, 1.73205];
190190
let raw_bytes = create_vector_bytes(&original_data);
191191

192-
let casted_data = HVector::raw_vector_data_to_vec(&raw_bytes, &arena);
192+
let casted_data = HVector::raw_vector_data_to_vec(&raw_bytes, &arena).unwrap();
193193

194194
assert_eq!(casted_data.len(), original_data.len());
195195
for (orig, casted) in original_data.iter().zip(casted_data.iter()) {

0 commit comments

Comments
 (0)