lazy_db/lazy_data/
writing.rs

1use std::os::unix::prelude::OsStrExt;
2
3use super::*;
4
5macro_rules! new_number {
6    (($name:ident) $type:ty = $lazy_type:expr) => {
7        /// Creates a new `LazyData` file with an unsigned integer and type
8        pub fn $name(mut file: FileWrapper, value: $type) -> Result<(), LDBError> {
9            let bytes = value.to_be_bytes();
10            file.write(&[$lazy_type.into()])?;
11            file.write(&bytes)?;
12            Ok(())
13        }
14    };
15
16    (signed ($name:ident) $type:ty = $lazy_type:expr) => {
17        /// Creates a new `LazyData` file with a signed integer and type
18        pub fn $name(mut file: FileWrapper, value: $type) -> Result<(), LDBError> {
19            let bytes = value.to_be_bytes();
20            file.write(&[$lazy_type.into()])?;
21            file.write(&bytes)?;
22            Ok(())
23        }
24    };
25}
26
27macro_rules! new_array {
28    (($name:ident) $type:ty = $lazy_type:ident) => {
29        /// Creates a new `LazyData` file with an array type and value
30        pub fn $name(mut file: FileWrapper, value: &[$type]) -> Result<(), LDBError> {
31            file.write(&[LazyType::Array.into(), LazyType::$lazy_type.into()])?;
32            for i in value {
33                let bytes = i.to_be_bytes();
34                file.write(&bytes)?;
35            }
36            Ok(())
37        }
38    }
39}
40
41impl LazyData {
42    /// Creates a new `LazyData` file with the type of `LazyType::Void`
43    pub fn new_void(mut file: FileWrapper, _value: ()) -> Result<(), LDBError> {
44        file.write(&[LazyType::Void.into()])?;
45        Ok(())
46    }
47
48    /// Creates a new `LazyData` file with a `String` value and type
49    pub fn new_string(mut file: FileWrapper, value: &str) -> Result<(), LDBError> {
50        let bytes = value.as_bytes();
51        file.write(&[LazyType::String.into()])?;
52        file.write(bytes)?;
53        Ok(())
54    }
55
56    // Signed Integers
57    new_number!(signed (new_i8) i8 = LazyType::I8);
58    new_number!(signed (new_i16) i16 = LazyType::I16);
59    new_number!(signed (new_i32) i32 = LazyType::I32);
60    new_number!(signed (new_i64) i64 = LazyType::I64);
61    new_number!(signed (new_i128) i128 = LazyType::I128);
62
63    // Unsigned Integers
64    new_number!((new_u8) u8 = LazyType::U8);
65    new_number!((new_u16) u16 = LazyType::U16);
66    new_number!((new_u32) u32 = LazyType::U32);
67    new_number!((new_u64) u64 = LazyType::U64);
68    new_number!((new_u128) u128 = LazyType::U128);
69
70    // Arrays
71    new_array!((new_u8_array) u8 = U8);
72    new_array!((new_u16_array) u16 = U16);
73    new_array!((new_u32_array) u32 = U32);
74    new_array!((new_u64_array) u64 = U64);
75    new_array!((new_u128_array) u128 = U128);
76    new_array!((new_i8_array) i8 = I8);
77    new_array!((new_i16_array) i16 = I16);
78    new_array!((new_i32_array) i32 = I32);
79    new_array!((new_i64_array) i64 = I64);
80    new_array!((new_i128_array) i128 = I128);
81    new_array!((new_f32_array) f32 = F32);
82    new_array!((new_f64_array) f64 = F64);
83
84    /* Floating point numbers */
85
86    /// Creates a new `LazyData` file with an `f32` value and type
87    pub fn new_f32(mut file: FileWrapper, value: f32) -> Result<(), LDBError> {
88        let bytes = value.to_be_bytes();
89        file.write(&[LazyType::F32.into()])?;
90        file.write(&bytes)?;
91        Ok(())
92    }
93
94    /// Creates a new `LazyData` file with an `f64` value and type
95    pub fn new_f64(mut file: FileWrapper, value: f64) -> Result<(), LDBError> {
96        let bytes = value.to_be_bytes();
97        file.write(&[LazyType::F64.into()])?;
98        file.write(&bytes)?;
99        Ok(())
100    }
101
102    /// Creates a new `LazyData` file with a `binary` value and type
103    pub fn new_binary(mut file: FileWrapper, value: &[u8]) -> Result<(), LDBError> {
104        file.write(&[LazyType::Binary.into()])?;
105        file.write(value)
106    }
107
108    /// Creates a new `LazyData` file with a `bool` value and type
109    pub fn new_bool(mut file: FileWrapper, value: bool) -> Result<(), LDBError> {
110        if value {
111            file.write(&[LazyType::True.into()])
112        } else {
113            file.write(&[LazyType::False.into()])
114        }
115    }
116
117    /// Creates a new `LazyData` file with a link (it's like a reference) value and type
118    pub fn new_link(mut file: FileWrapper, data: impl AsRef<Path>) -> Result<(), LDBError> {
119        file.write(&[LazyType::Link.into()])?;
120        file.write(data.as_ref().as_os_str().as_bytes())
121    }
122}