/ utilities / src / serialize / helpers.rs
helpers.rs
 1  // Copyright (c) 2019-2025 Alpha-Delta Network Inc.
 2  // This file is part of the alphavm library.
 3  
 4  // Licensed under the Apache License, Version 2.0 (the "License");
 5  // you may not use this file except in compliance with the License.
 6  // You may obtain a copy of the License at:
 7  
 8  // http://www.apache.org/licenses/LICENSE-2.0
 9  
10  // Unless required by applicable law or agreed to in writing, software
11  // distributed under the License is distributed on an "AS IS" BASIS,
12  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  // See the License for the specific language governing permissions and
14  // limitations under the License.
15  
16  use std::io::{Read, Write};
17  
18  pub use crate::{FromBytes, ToBytes};
19  use crate::{SerializationError, serialize::traits::*};
20  
21  /// Serialize a Vector's elements without serializing the Vector's length
22  /// If you want to serialize the full Vector, use `CanonicalSerialize for Vec<T>`
23  pub fn serialize_vec_without_len<'a>(
24      src: impl Iterator<Item = &'a (impl CanonicalSerialize + 'a)>,
25      mut writer: impl Write,
26      compress: Compress,
27  ) -> Result<(), SerializationError> {
28      for elem in src {
29          CanonicalSerialize::serialize_with_mode(elem, &mut writer, compress)?;
30      }
31      Ok(())
32  }
33  
34  /// Serialize a Vector's element sizes without serializing the Vector's length
35  /// If you want to serialize the full Vector, use `CanonicalSerialize for Vec<T>`
36  pub fn serialized_vec_size_without_len(src: &[impl CanonicalSerialize], compress: Compress) -> usize {
37      if src.is_empty() { 0 } else { src.len() * CanonicalSerialize::serialized_size(&src[0], compress) }
38  }
39  
40  /// Deserialize a Vector's elements without deserializing the Vector's length
41  /// If you want to deserialize the full Vector, use `CanonicalDeserialize for Vec<T>`
42  pub fn deserialize_vec_without_len<T: CanonicalDeserialize>(
43      mut reader: impl Read,
44      compress: Compress,
45      validate: Validate,
46      len: usize,
47  ) -> Result<Vec<T>, SerializationError> {
48      (0..len).map(|_| CanonicalDeserialize::deserialize_with_mode(&mut reader, compress, validate)).collect()
49  }