rust_storage_interface_library/
lib.rs

1//! How to use this crate
2//! # Adding this as a dependency
3//! ```rust, ignore
4//! [dependencies]
5//! rust_storage_interface_library = "^0.1"
6//! ```
7//!
8//! # Bringing this into scope
9//! ```rust, ignore
10//! use rust_storage_interface_library::ssvm_storage;
11//! ```
12//! # Tests
13//! ```bash, ignore
14//! cargo test --lib
15//! ```
16
17pub mod ssvm_storage {
18
19    pub mod ssvm_native {
20        use std::os::raw::c_char;
21
22        #[link(wasm_import_module = "ssvm_native")]
23        extern "C" {
24            pub fn ssvm_storage_createUUID(new_CString_key: *mut c_char);
25            pub fn ssvm_storage_beginStoreTx(new_CString_key: *const c_char);
26            pub fn ssvm_storage_beginLoadTx(new_CString_key: *const c_char);
27            pub fn ssvm_storage_storeI32(_i32_value: i32);
28            pub fn ssvm_storage_loadI32() -> i32;
29            pub fn ssvm_storage_endStoreTx();
30            pub fn ssvm_storage_endLoadTx();
31        }
32    }
33
34    pub mod load {
35        use super::ssvm_native;
36        use bincode;
37        use serialize_deserialize_u8_i32::s_d_u8_i32;
38        use std::char;
39        use std::ffi::CString;
40        use std::str;
41
42        pub fn deserialize_vec_i32_to_unknown<'de, T: serde::de::DeserializeOwned>(
43            _value: Vec<i32>,
44            _t: T,
45        ) -> T {
46            let deserialized_to_u8: Vec<u8> = s_d_u8_i32::deserialize_i32_to_u8(_value);
47            let deserialized_to_unknown: T = bincode::deserialize(&deserialized_to_u8[..]).unwrap();
48            deserialized_to_unknown
49        }
50        pub fn load_as_struct<T: for<'de> serde::de::Deserialize<'de>>(
51            _string_key: &str,
52            _t: T,
53        ) -> T {
54            let mut struct_vec = Vec::new();
55            // Update - start (key as string)
56            let var_c_string = CString::new(_string_key).expect("CString::new failed");
57            let ptr_c_string = var_c_string.into_raw();
58            // Update - end
59            unsafe {
60                // Update - start (key as string)
61                ssvm_native::ssvm_storage_beginLoadTx(ptr_c_string);
62                // Update - end
63                let number_of_i32s: i32 = ssvm_native::ssvm_storage_loadI32();
64                for _i in 0..number_of_i32s {
65                    struct_vec.push(ssvm_native::ssvm_storage_loadI32());
66                }
67                let the_struct: T = deserialize_vec_i32_to_unknown(struct_vec, _t);
68                ssvm_native::ssvm_storage_endLoadTx();
69                // Update - start (key as string)
70                let var_pointer_released = CString::from_raw(ptr_c_string);
71                // Update - end
72                return the_struct;
73            }
74        }
75        pub fn deserialize_vec_i32_to_bool(_value: Vec<i32>) -> bool {
76            let deserialized_to_u8: Vec<u8> = s_d_u8_i32::deserialize_i32_to_u8(_value);
77            let deserialized_to_boolean: bool =
78                bincode::deserialize(&deserialized_to_u8[..]).unwrap();
79            deserialized_to_boolean
80        }
81        pub fn load_as_bool(_string_key: &str) -> bool {
82            let mut bool_vec = Vec::new();
83            // Update - start (key as string)
84            let var_c_string = CString::new(_string_key).expect("CString::new failed");
85            let ptr_c_string = var_c_string.into_raw();
86            // Update - end
87            unsafe {
88                // Update - start (key as string)
89                ssvm_native::ssvm_storage_beginLoadTx(ptr_c_string);
90                // Update - end
91                let number_of_i32s: i32 = ssvm_native::ssvm_storage_loadI32();
92                for _i in 0..number_of_i32s {
93                    bool_vec.push(ssvm_native::ssvm_storage_loadI32());
94                }
95                let boolean: bool = deserialize_vec_i32_to_bool(bool_vec);
96                ssvm_native::ssvm_storage_endLoadTx();
97                // Update - start (key as string)
98                let var_pointer_released = CString::from_raw(ptr_c_string);
99                // Update - end
100                return boolean;
101            }
102        }
103        pub fn deserialize_vec_i32_to_char(_value: Vec<i32>) -> char {
104            let deserialized_to_u8: Vec<u8> = s_d_u8_i32::deserialize_i32_to_u8(_value);
105            let deserialized_to_char: char = bincode::deserialize(&deserialized_to_u8[..]).unwrap();
106            deserialized_to_char
107        }
108        pub fn load_as_char(_string_key: &str) -> char {
109            let mut char_vec = Vec::new();
110            // Update - start (key as string)
111            let var_c_string = CString::new(_string_key).expect("CString::new failed");
112            let ptr_c_string = var_c_string.into_raw();
113            // Update - end
114            unsafe {
115                // Update - start (key as string)
116                ssvm_native::ssvm_storage_beginLoadTx(ptr_c_string);
117                // Update - end
118                let number_of_chars: i32 = ssvm_native::ssvm_storage_loadI32();
119                for _i in 0..number_of_chars {
120                    char_vec.push(ssvm_native::ssvm_storage_loadI32());
121                }
122                let character: char = deserialize_vec_i32_to_char(char_vec);
123                ssvm_native::ssvm_storage_endLoadTx();
124                // Update - start (key as string)
125                let var_pointer_released = CString::from_raw(ptr_c_string);
126                // Update - end
127                return character;
128            }
129        }
130        pub fn deserialize_vec_i32_to_i8(_value: Vec<i32>) -> i8 {
131            let deserialized_to_u8: Vec<u8> = s_d_u8_i32::deserialize_i32_to_u8(_value);
132            let deserialized_to_i8: i8 = bincode::deserialize(&deserialized_to_u8[..]).unwrap();
133            deserialized_to_i8
134        }
135        pub fn load_as_i8(_string_key: &str) -> i8 {
136            let mut i8_vec = Vec::new();
137            // Update - start (key as string)
138            let var_c_string = CString::new(_string_key).expect("CString::new failed");
139            let ptr_c_string = var_c_string.into_raw();
140            // Update - end
141            unsafe {
142                // Update - start (key as string)
143                ssvm_native::ssvm_storage_beginLoadTx(ptr_c_string);
144                // Update - end
145                let number_of_i32s: i32 = ssvm_native::ssvm_storage_loadI32();
146                for _i in 0..number_of_i32s {
147                    i8_vec.push(ssvm_native::ssvm_storage_loadI32());
148                }
149                let i8_value: i8 = deserialize_vec_i32_to_i8(i8_vec);
150                ssvm_native::ssvm_storage_endLoadTx();
151                // Update - start (key as string)
152                let var_pointer_released = CString::from_raw(ptr_c_string);
153                // Update - end
154                return i8_value;
155            }
156        }
157        pub fn deserialize_vec_i32_to_i16(_value: Vec<i32>) -> i16 {
158            let deserialized_to_u8: Vec<u8> = s_d_u8_i32::deserialize_i32_to_u8(_value);
159            let deserialized_to_i16: i16 = bincode::deserialize(&deserialized_to_u8[..]).unwrap();
160            deserialized_to_i16
161        }
162        pub fn load_as_i16(_string_key: &str) -> i16 {
163            let mut i16_vec = Vec::new();
164            // Update - start (key as string)
165            let var_c_string = CString::new(_string_key).expect("CString::new failed");
166            let ptr_c_string = var_c_string.into_raw();
167            // Update - end
168            unsafe {
169                // Update - start (key as string)
170                ssvm_native::ssvm_storage_beginLoadTx(ptr_c_string);
171                // Update - end
172                let number_of_i32s: i32 = ssvm_native::ssvm_storage_loadI32();
173                for _i in 0..number_of_i32s {
174                    i16_vec.push(ssvm_native::ssvm_storage_loadI32());
175                }
176                let i16_value: i16 = deserialize_vec_i32_to_i16(i16_vec);
177                ssvm_native::ssvm_storage_endLoadTx();
178                // Update - start (key as string)
179                let var_pointer_released = CString::from_raw(ptr_c_string);
180                // Update - end
181                return i16_value;
182            }
183        }
184        pub fn deserialize_vec_i32_to_i32(_value: Vec<i32>) -> i32 {
185            let deserialized_to_u8: Vec<u8> = s_d_u8_i32::deserialize_i32_to_u8(_value);
186            let deserialized_to_i32: i32 = bincode::deserialize(&deserialized_to_u8[..]).unwrap();
187            deserialized_to_i32
188        }
189        pub fn load_as_i32(_string_key: &str) -> i32 {
190            let mut i32_vec = Vec::new();
191            // Update - start (key as string)
192            let var_c_string = CString::new(_string_key).expect("CString::new failed");
193            let ptr_c_string = var_c_string.into_raw();
194            // Update - end
195            unsafe {
196                // Update - start (key as string)
197                ssvm_native::ssvm_storage_beginLoadTx(ptr_c_string);
198                // Update - end
199                let number_of_i32s: i32 = ssvm_native::ssvm_storage_loadI32();
200                for _i in 0..number_of_i32s {
201                    i32_vec.push(ssvm_native::ssvm_storage_loadI32());
202                }
203                let i32_value: i32 = deserialize_vec_i32_to_i32(i32_vec);
204                ssvm_native::ssvm_storage_endLoadTx();
205                // Update - start (key as string)
206                let var_pointer_released = CString::from_raw(ptr_c_string);
207                // Update - end
208                return i32_value;
209            }
210        }
211        pub fn deserialize_vec_i32_to_i64(_value: Vec<i32>) -> i64 {
212            let deserialized_to_u8: Vec<u8> = s_d_u8_i32::deserialize_i32_to_u8(_value);
213            let deserialized_to_i64: i64 = bincode::deserialize(&deserialized_to_u8[..]).unwrap();
214            deserialized_to_i64
215        }
216        pub fn load_as_i64(_string_key: &str) -> i64 {
217            let mut i64_vec = Vec::new();
218            // Update - start (key as string)
219            let var_c_string = CString::new(_string_key).expect("CString::new failed");
220            let ptr_c_string = var_c_string.into_raw();
221            // Update - end
222            unsafe {
223                // Update - start (key as string)
224                ssvm_native::ssvm_storage_beginLoadTx(ptr_c_string);
225                // Update - end
226                let number_of_i32s: i32 = ssvm_native::ssvm_storage_loadI32();
227                for _i in 0..number_of_i32s {
228                    i64_vec.push(ssvm_native::ssvm_storage_loadI32());
229                }
230                let i64_value: i64 = deserialize_vec_i32_to_i64(i64_vec);
231                ssvm_native::ssvm_storage_endLoadTx();
232                // Update - start (key as string)
233                let var_pointer_released = CString::from_raw(ptr_c_string);
234                // Update - end
235                return i64_value;
236            }
237        }
238        pub fn deserialize_vec_i32_to_u8(_value: Vec<i32>) -> u8 {
239            let deserialized_to_u8: Vec<u8> = s_d_u8_i32::deserialize_i32_to_u8(_value);
240            let deserialized_to_u8: u8 = bincode::deserialize(&deserialized_to_u8[..]).unwrap();
241            deserialized_to_u8
242        }
243        pub fn load_as_u8(_string_key: &str) -> u8 {
244            let mut u8_vec = Vec::new();
245            // Update - start (key as string)
246            let var_c_string = CString::new(_string_key).expect("CString::new failed");
247            let ptr_c_string = var_c_string.into_raw();
248            // Update - end
249            unsafe {
250                // Update - start (key as string)
251                ssvm_native::ssvm_storage_beginLoadTx(ptr_c_string);
252                // Update - end
253                let number_of_i32s: i32 = ssvm_native::ssvm_storage_loadI32();
254                for _i in 0..number_of_i32s {
255                    u8_vec.push(ssvm_native::ssvm_storage_loadI32());
256                }
257                let u8_value: u8 = deserialize_vec_i32_to_u8(u8_vec);
258                ssvm_native::ssvm_storage_endLoadTx();
259                // Update - start (key as string)
260                let var_pointer_released = CString::from_raw(ptr_c_string);
261                // Update - end
262                return u8_value;
263            }
264        }
265        pub fn deserialize_vec_i32_to_string(_value: Vec<i32>) -> String{
266            let deserialized_to_u8: Vec<u8> = s_d_u8_i32::deserialize_i32_to_u8(_value);
267            let deserialized_to_string: String = bincode::deserialize(&deserialized_to_u8[..]).unwrap();
268            deserialized_to_string
269        }
270        pub fn load_as_string(_string_key: &str) -> String {
271            let mut retrieved_vec = Vec::new();
272            // Update - start (key as string)
273            let var_c_string = CString::new(_string_key).expect("CString::new failed");
274            let ptr_c_string = var_c_string.into_raw();
275            // Update - end
276            unsafe {
277                // Update - start (key as string)
278                ssvm_native::ssvm_storage_beginLoadTx(ptr_c_string);
279                // Update - end
280                let number_of_i32s: i32 = ssvm_native::ssvm_storage_loadI32();
281                // Get all i32s and save them to a vector
282                for _i in 0..number_of_i32s {
283                    retrieved_vec.push(ssvm_native::ssvm_storage_loadI32());
284                }
285                println!{"Deserialize i32 Vec: {:?}", retrieved_vec};
286                // Convert that i32 vector, back into the original u8 vector
287                let the_string = deserialize_vec_i32_to_string(retrieved_vec);
288                // End load
289                ssvm_native::ssvm_storage_endLoadTx();
290                // Update - start (key as string)
291                let var_pointer_released = CString::from_raw(ptr_c_string);
292                // Update - end
293                the_string
294            }
295        }
296        pub fn load_as_i32_vector(_string_key: &str) -> Vec<i32> {
297            // Update - start (key as string)
298            let var_c_string = CString::new(_string_key).expect("CString::new failed");
299            let ptr_c_string = var_c_string.into_raw();
300            // Update - end
301            unsafe {
302                let mut i32_vector = Vec::new();
303                // Update - start (key as string)
304                ssvm_native::ssvm_storage_beginLoadTx(ptr_c_string);
305                // Update - end
306                let number_of_items: i32 = ssvm_native::ssvm_storage_loadI32();
307                for _i in 0..number_of_items {
308                    let single_i32: i32 = ssvm_native::ssvm_storage_loadI32();
309                    i32_vector.push(single_i32);
310                }
311                ssvm_native::ssvm_storage_endLoadTx();
312                // Update - start (key as string)
313                let var_pointer_released = CString::from_raw(ptr_c_string);
314                // Update - end
315                i32_vector
316            }
317        }
318    }
319
320    pub mod store {
321        use super::ssvm_native;
322        use bincode;
323        use serialize_deserialize_u8_i32::s_d_u8_i32;
324        use std::any::type_name;
325        use std::convert::TryInto;
326        use std::ffi::CString;
327
328        pub fn type_of<T>(_: T) -> &'static str {
329            type_name::<T>()
330        }
331
332        pub fn serialize_unknown_to_vec_i32<V: std::clone::Clone + serde::ser::Serialize>(
333            v: V,
334        ) -> Vec<i32> {
335            let encoded_as_u8: Vec<u8> = bincode::serialize(&v).unwrap();
336            println!("Store - orig data is now encoded to u8: {:?}", encoded_as_u8);
337            let encoded_as_i32: Vec<i32> = s_d_u8_i32::serialize_u8_to_i32(encoded_as_u8);
338            println!("Store - u8 data is now encoded to i32: {:?}", encoded_as_i32);
339            encoded_as_i32
340        }
341        ///
342        /// # Store String
343        /// ```rust, ignore
344        /// let my_string = String::from("A string to store");
345        /// let storage_key: i32 = ssvm_storage::store::store(my_string);
346        /// ```
347
348        /// # Store Struct
349        /// Please note, you must implement the serde features as show below. For example the Default feature is used when re-loading this data back from storage.
350        /// ```rust, ignore
351        /// #[derive(Serialize, Deserialize, PartialEq, Debug, Default)]
352        ///     struct TestStruct {
353        ///         a_vec: Vec<u8>,
354        ///         a_i32: i32,
355        ///         a_u8: u8,
356        ///         a_bool: bool,
357        ///     }
358        /// ```
359        pub fn store<V: std::clone::Clone + serde::ser::Serialize>(v: V) -> String {
360            //let type_of_value = type_of(v.clone());
361            //println!("{:?}", type_of_value);
362            // Encode
363            let encoded_as_i32: Vec<i32> = serialize_unknown_to_vec_i32(&v);
364            // Create key as CString data type
365            let var_c_string = CString::new("placeholder-32bytes-aaaaaaaaaaaa").expect("Error: The CString::new constructor has failed");
366            // Convert the key to a pointer which can be modified by external C++ code (requires into_raw() as apposed to as_ptr())
367            let ptr_c_string = var_c_string.into_raw();
368            // Call the createUUID extern C function which allows SSVM to modify the CString's (pointer's) contents
369            unsafe { ssvm_native::ssvm_storage_createUUID(ptr_c_string) }
370            // Take ownership of the CString pointer back
371            let var_c_string_2: CString= unsafe { CString::from_raw(ptr_c_string) };
372            // Create another pointer variable to CString
373            let ptr_c_string_2 = var_c_string_2.into_raw();
374            // Call the beginStoreTx function using the newest pointer
375            unsafe {
376                ssvm_native::ssvm_storage_beginStoreTx(ptr_c_string_2);
377            }
378            let var_c_string_3: CString = unsafe { CString::from_raw(ptr_c_string_2) };
379            // Add data length
380            unsafe {
381                ssvm_native::ssvm_storage_storeI32(encoded_as_i32.len().try_into().unwrap());
382            }
383            // Add the data
384            unsafe {
385                for i in encoded_as_i32.iter() {
386                    ssvm_native::ssvm_storage_storeI32(*i);
387                }
388            }
389            // End the store
390            unsafe {
391                ssvm_native::ssvm_storage_endStoreTx();
392            }
393            var_c_string_3.to_str().unwrap().to_string()
394        }
395
396       /// This function does not use serde or bincode it just takes Vec<i32> and stores it natively
397        /// This is for developers who want to unpack their data ahead of time and make it directly available to the SSVM without conversion/serialization overheads at execution time
398        pub fn store_as_i32_vector(i32_vector: Vec<i32>) -> String {
399            // Create key as CString data type
400            // Create key as CString data type
401            let var_c_string = CString::new("placeholder")
402                .expect("Error: The CString::new constructor has failed");
403            // Convert the key to a pointer which can be modified by external C++ code (requires into_raw() as apposed to as_ptr())
404            let ptr_c_string = var_c_string.into_raw();
405            // Call the createUUID extern C function which allows SSVM to modify the CString's (pointer's) contents
406            unsafe { ssvm_native::ssvm_storage_createUUID(ptr_c_string) }
407            // Take ownership of the CString pointer back
408            let var_c_string_2: CString = unsafe { CString::from_raw(ptr_c_string) };
409            // Create another pointer variable to CString
410            let ptr_c_string_2 = var_c_string_2.into_raw();
411            // Call the beginStoreTx function using the newest pointer
412            unsafe {
413                ssvm_native::ssvm_storage_beginStoreTx(ptr_c_string_2);
414            }
415            // Retakes ownership of the newest pointer
416            let var_c_string_3: CString = unsafe { CString::from_raw(ptr_c_string_2) };
417            // store
418            unsafe {
419                ssvm_native::ssvm_storage_storeI32(i32_vector.len().try_into().unwrap());
420            }
421            // Add the data
422            unsafe {
423                for i in i32_vector.iter() {
424                    ssvm_native::ssvm_storage_storeI32(*i);
425                }
426            }
427            // End the store
428            unsafe {
429                ssvm_native::ssvm_storage_endStoreTx();
430            }
431            var_c_string_3.to_str().unwrap().to_string()
432        }
433
434        pub fn update<V: std::clone::Clone + serde::ser::Serialize>(_string_key: &str, v: V){
435            // Create CString out of the string key 
436            let var_c_string = CString::new(_string_key).expect("CString::new failed");
437            // Create a pointer out of the CString
438            let ptr_c_string = var_c_string.into_raw();
439            // Encode
440            let encoded_as_i32: Vec<i32> = serialize_unknown_to_vec_i32(&v);
441            // Just go ahead and use the existing pointer, no need to create uuid here because we already have it pased in
442            unsafe {
443                ssvm_native::ssvm_storage_beginStoreTx(ptr_c_string);
444            }
445            let var_c_string_2: CString = unsafe { CString::from_raw(ptr_c_string) };
446            // Add data length
447            unsafe {
448                ssvm_native::ssvm_storage_storeI32(encoded_as_i32.len().try_into().unwrap());
449            }
450            // Add the data
451            unsafe {
452                for i in encoded_as_i32.iter() {
453                    ssvm_native::ssvm_storage_storeI32(*i);
454                }
455            }
456            // End the store
457            unsafe {
458                ssvm_native::ssvm_storage_endStoreTx();
459            }
460        }
461
462        /// This function does not use serde or bincode it just takes Vec<i32> and stores it natively
463        /// This is for developers who want to unpack their data ahead of time and make it directly available to the SSVM without conversion/serialization overheads at execution time
464        pub fn update_as_i32_vector(_string_key: &str, i32_vector: Vec<i32>){
465            // Create CString out of the string key 
466            let var_c_string = CString::new(_string_key).expect("CString::new failed");
467            // Create a pointer out of the CString
468            let ptr_c_string = var_c_string.into_raw();
469            // Just go ahead and use the existing pointer, no need to create uuid here because we already have it pased in
470            unsafe {
471                ssvm_native::ssvm_storage_beginStoreTx(ptr_c_string);
472            }
473            let var_c_string_2: CString = unsafe { CString::from_raw(ptr_c_string) };
474            // store
475            unsafe {
476                ssvm_native::ssvm_storage_storeI32(i32_vector.len().try_into().unwrap());
477            }
478            // Add the data
479            unsafe {
480                for i in i32_vector.iter() {
481                    ssvm_native::ssvm_storage_storeI32(*i);
482                }
483            }
484            // End the store
485            unsafe {
486                ssvm_native::ssvm_storage_endStoreTx();
487            }
488        }
489    }
490}
491
492// Test
493// Please use the following command so that the print statements are shown during testing
494// cargo test -- --nocapture
495//
496#[cfg(test)]
497mod tests {
498    use super::ssvm_storage;
499    use serde::{Deserialize, Serialize};
500    // It is a requirement that the user calling the store and load implements the serde Default etc. as shown below.
501    #[derive(Serialize, Deserialize, PartialEq, Debug, Default)]
502    struct TestStruct {
503        a_vec: Vec<u8>,
504        a_i32: i32,
505        a_u8: u8,
506        a_bool: bool,
507    }
508    #[test]
509    fn test_store_as_struct() {
510        let test_struct1 = TestStruct {
511            a_vec: vec![134, 122, 131],
512            a_i32: 4,
513            a_u8: 4,
514            a_bool: true,
515        };
516        let _encoded_as_i32: Vec<i32> =
517            ssvm_storage::store::serialize_unknown_to_vec_i32(&test_struct1);
518        println!("Encoded as Vec<i32>: {:?}", test_struct1);
519        assert_eq!(
520            ssvm_storage::store::type_of(test_struct1),
521            "rust_storage_interface_library::tests::TestStruct"
522        );
523    }
524    #[test]
525    fn test_load_as_struct() {
526        let test_struct1 = TestStruct {
527            a_vec: vec![134, 122, 131],
528            a_i32: 4,
529            a_u8: 4,
530            a_bool: true,
531        };
532        let encoded_as_i32: Vec<i32> =
533            ssvm_storage::store::serialize_unknown_to_vec_i32(&test_struct1);
534        println!("Encoded as Vec<i32>: {:?}", encoded_as_i32);
535        let test_struct2 = TestStruct::default();
536        let test_struct3 =
537            ssvm_storage::load::deserialize_vec_i32_to_unknown(encoded_as_i32, test_struct2);
538        println!("Decoded as unknown: {:?}", test_struct3);
539        assert_eq!(test_struct3.a_vec[0], 134);
540        assert_eq!(test_struct3.a_i32, 4);
541        assert_eq!(test_struct3.a_u8, 4);
542        assert_eq!(test_struct3.a_bool, true);
543    }
544    #[test]
545    fn test_store_as_bool() {
546        let boolean1: bool = true;
547        let encoded_as_i32: Vec<i32> = ssvm_storage::store::serialize_unknown_to_vec_i32(&boolean1);
548        println!("Encoded as Vec<i32>: {:?}", encoded_as_i32);
549        assert_eq!(boolean1, true);
550        assert_eq!(ssvm_storage::store::type_of(boolean1), "bool");
551        assert_eq!(encoded_as_i32.len(), 1);
552        assert_eq!(encoded_as_i32[0], 1);
553    }
554    #[test]
555    fn test_load_as_boolean() {
556        let boolean1: bool = true;
557        let encoded_as_i32: Vec<i32> = ssvm_storage::store::serialize_unknown_to_vec_i32(&boolean1);
558        println!("Encoded as Vec<i32>: {:?}", encoded_as_i32);
559        let boolean2 = ssvm_storage::load::deserialize_vec_i32_to_bool(encoded_as_i32);
560        println!("Decoded as boolean: {:?}", boolean2);
561        assert_eq!(boolean2, true);
562    }
563    #[test]
564    fn test_store_as_char() {
565        let character1: char = 'a';
566        let encoded_as_i32: Vec<i32> =
567            ssvm_storage::store::serialize_unknown_to_vec_i32(&character1);
568        println!("Encoded as Vec<i32>: {:?}", encoded_as_i32);
569        assert_eq!(character1, 'a');
570        assert_eq!(ssvm_storage::store::type_of(character1), "char");
571        assert_eq!(encoded_as_i32.len(), 1);
572        assert_eq!(encoded_as_i32[0], 97);
573    }
574    #[test]
575    fn test_load_as_character() {
576        let character1: char = 'a';
577        let encoded_as_i32: Vec<i32> =
578            ssvm_storage::store::serialize_unknown_to_vec_i32(&character1);
579        println!("Encoded as Vec<i32>: {:?}", encoded_as_i32);
580        let character2 = ssvm_storage::load::deserialize_vec_i32_to_char(encoded_as_i32);
581        println!("Decoded as character: {:?}", character2);
582        assert_eq!(character2, 'a');
583    }
584    #[test]
585    fn test_store_as_i8() {
586        let i81: i8 = -2;
587        let encoded_as_i32: Vec<i32> = ssvm_storage::store::serialize_unknown_to_vec_i32(&i81);
588        println!("Encoded as Vec<i32>: {:?}", encoded_as_i32);
589        assert_eq!(i81, -2);
590        assert_eq!(ssvm_storage::store::type_of(i81), "i8");
591        assert_eq!(encoded_as_i32.len(), 1);
592        assert_eq!(encoded_as_i32[0], 254);
593    }
594    #[test]
595    fn test_load_as_i8() {
596        let i81: i8 = -2;
597        let encoded_as_i32: Vec<i32> = ssvm_storage::store::serialize_unknown_to_vec_i32(&i81);
598        println!("Encoded as Vec<i32>: {:?}", encoded_as_i32);
599        let i82 = ssvm_storage::load::deserialize_vec_i32_to_i8(encoded_as_i32);
600        println!("Decoded as i8: {:?}", i82);
601        assert_eq!(i82, -2);
602    }
603    #[test]
604    fn test_store_as_i16() {
605        let i161: i16 = -2;
606        let encoded_as_i32: Vec<i32> = ssvm_storage::store::serialize_unknown_to_vec_i32(&i161);
607        println!("Encoded as Vec<i32>: {:?}", encoded_as_i32);
608        assert_eq!(i161, -2);
609        assert_eq!(ssvm_storage::store::type_of(i161), "i16");
610        assert_eq!(encoded_as_i32.len(), 1);
611        assert_eq!(encoded_as_i32[0], 2000254255);
612    }
613    #[test]
614    fn test_load_as_i16() {
615        let i161: i16 = -2;
616        let encoded_as_i32: Vec<i32> = ssvm_storage::store::serialize_unknown_to_vec_i32(&i161);
617        println!("Encoded as Vec<i32>: {:?}", encoded_as_i32);
618        let i162 = ssvm_storage::load::deserialize_vec_i32_to_i16(encoded_as_i32);
619        println!("Decoded as i16: {:?}", i162);
620        assert_eq!(i162, -2);
621    }
622    #[test]
623    fn test_store_as_i32() {
624        let i321: i32 = 1234567890;
625        let encoded_as_i32: Vec<i32> = ssvm_storage::store::serialize_unknown_to_vec_i32(&i321);
626        println!("Encoded as Vec<i32>: {:?}", encoded_as_i32);
627        assert_eq!(i321, 1234567890);
628        assert_eq!(ssvm_storage::store::type_of(i321), "i32");
629        assert_eq!(encoded_as_i32.len(), 2);
630        assert_eq!(encoded_as_i32[0], 1210002150);
631        assert_eq!(encoded_as_i32[1], 73);
632    }
633    #[test]
634    fn test_load_as_i32() {
635        let i321: i32 = 1234567890;
636        let encoded_as_i32: Vec<i32> = ssvm_storage::store::serialize_unknown_to_vec_i32(&i321);
637        println!("I32 - Encoded as Vec<i32>: {:?}", encoded_as_i32);
638        let i322 = ssvm_storage::load::deserialize_vec_i32_to_i32(encoded_as_i32);
639        println!("Decoded as i32: {:?}", i322);
640        assert_eq!(i322, 1234567890);
641    }
642    #[test]
643    fn test_store_as_i64() {
644        let i641: i64 = 9223372036854775807;
645        let encoded_as_i32: Vec<i32> = ssvm_storage::store::serialize_unknown_to_vec_i32(&i641);
646        println!("I64 - Encoded as Vec<i32>: {:?}", encoded_as_i32);
647        assert_eq!(i641, 9223372036854775807);
648        assert_eq!(ssvm_storage::store::type_of(i641), "i64");
649        assert_eq!(encoded_as_i32.len(), 3);
650        assert_eq!(encoded_as_i32[0], 1255255255);
651        assert_eq!(encoded_as_i32[1], 1255255255);
652        assert_eq!(encoded_as_i32[2], 2000255127);
653    }
654    #[test]
655    fn test_load_as_i64() {
656        let i641: i64 = 9223372036854775807;
657        let encoded_as_i32: Vec<i32> = ssvm_storage::store::serialize_unknown_to_vec_i32(&i641);
658        println!("I64 - Encoded as Vec<i32>: {:?}", encoded_as_i32);
659        let i642 = ssvm_storage::load::deserialize_vec_i32_to_i64(encoded_as_i32);
660        println!("Decoded as i64: {:?}", i642);
661        assert_eq!(i642, 9223372036854775807);
662    }
663    #[test]
664    fn test_store_as_u8() {
665        let u81: u8 = 100;
666        let encoded_as_i32: Vec<i32> = ssvm_storage::store::serialize_unknown_to_vec_i32(&u81);
667        println!("I64 - Encoded as Vec<i32>: {:?}", encoded_as_i32);
668        assert_eq!(u81, 100);
669        assert_eq!(ssvm_storage::store::type_of(u81), "u8");
670        assert_eq!(encoded_as_i32.len(), 1);
671        assert_eq!(encoded_as_i32[0], 100);
672    }
673    #[test]
674    fn test_load_as_u8() {
675        let u81: u8 = 100;
676        let encoded_as_i32: Vec<i32> = ssvm_storage::store::serialize_unknown_to_vec_i32(&u81);
677        println!("I64 - Encoded as Vec<i32>: {:?}", encoded_as_i32);
678        let u82 = ssvm_storage::load::deserialize_vec_i32_to_u8(encoded_as_i32);
679        println!("Decoded as u8: {:?}", u82);
680        assert_eq!(u82, 100);
681    }
682}