1
// Auto-generated from doc/nomisync-script-format.org
2
// Do not edit manually - regenerate from the org document.
3

            
4
#[repr(C)]
5
#[derive(Debug, Clone, Copy, FromBytes, IntoBytes, Immutable, KnownLayout)]
6
pub struct GlobalHeader {
7
    pub magic: u32,
8
    pub version: u16,
9
    pub context_type: u8,
10
    pub primary_entity_type: u8,
11
    pub input_entity_count: u32,
12
    pub entities_offset: u32,
13
    pub strings_pool_offset: u32,
14
    pub strings_pool_size: u32,
15
    pub output_offset: u32,
16
    pub output_size: u32,
17
    pub primary_entity_idx: u32,
18
    pub reserved: [u8; 28],
19
}
20

            
21
pub const GLOBAL_HEADER_SIZE: usize = 64;
22

            
23
#[repr(C)]
24
#[derive(Debug, Clone, Copy, FromBytes, IntoBytes, Immutable, KnownLayout)]
25
pub struct EntityHeader {
26
    pub entity_type: u8,
27
    pub operation: u8,
28
    pub flags: u8,
29
    pub reserved: [u8; 1],
30
    pub id: [u8; 16],
31
    pub parent_idx: i32,
32
    pub data_offset: u32,
33
    pub data_size: u32,
34
}
35

            
36
pub const ENTITY_HEADER_SIZE: usize = 32;
37

            
38
#[repr(C)]
39
#[derive(Debug, Clone, Copy, FromBytes, IntoBytes, Immutable, KnownLayout)]
40
pub struct TransactionData {
41
    pub post_date: i64,
42
    pub enter_date: i64,
43
    pub split_count: u32,
44
    pub tag_count: u32,
45
    pub is_multi_currency: u8,
46
    pub reserved: [u8; 23],
47
}
48

            
49
pub const TRANSACTION_DATA_SIZE: usize = 48;
50

            
51
#[repr(C)]
52
#[derive(Debug, Clone, Copy, FromBytes, IntoBytes, Immutable, KnownLayout)]
53
pub struct SplitData {
54
    pub account_id: [u8; 16],
55
    pub commodity_id: [u8; 16],
56
    pub value_num: i64,
57
    pub value_denom: i64,
58
    pub reconcile_state: u8,
59
    pub reserved: [u8; 7],
60
    pub reconcile_date: i64,
61
}
62

            
63
pub const SPLIT_DATA_SIZE: usize = 64;
64

            
65
#[repr(C)]
66
#[derive(Debug, Clone, Copy, FromBytes, IntoBytes, Immutable, KnownLayout)]
67
pub struct TagData {
68
    pub name_offset: u32,
69
    pub value_offset: u32,
70
    pub name_len: u16,
71
    pub value_len: u16,
72
    pub reserved: [u8; 4],
73
}
74

            
75
pub const TAG_DATA_SIZE: usize = 16;
76

            
77
#[repr(C)]
78
#[derive(Debug, Clone, Copy, FromBytes, IntoBytes, Immutable, KnownLayout)]
79
pub struct AccountData {
80
    pub parent_account_id: [u8; 16],
81
    pub name_offset: u32,
82
    pub path_offset: u32,
83
    pub tag_count: u32,
84
    pub name_len: u16,
85
    pub path_len: u16,
86
    pub reserved: [u8; 16],
87
}
88

            
89
pub const ACCOUNT_DATA_SIZE: usize = 48;
90

            
91
#[repr(C)]
92
#[derive(Debug, Clone, Copy, FromBytes, IntoBytes, Immutable, KnownLayout)]
93
pub struct CommodityData {
94
    pub symbol_offset: u32,
95
    pub name_offset: u32,
96
    pub fraction: u32,
97
    pub tag_count: u32,
98
    pub symbol_len: u16,
99
    pub name_len: u16,
100
    pub reserved: [u8; 12],
101
}
102

            
103
pub const COMMODITY_DATA_SIZE: usize = 32;
104

            
105
#[repr(C)]
106
#[derive(Debug, Clone, Copy, FromBytes, IntoBytes, Immutable, KnownLayout)]
107
pub struct OutputHeader {
108
    pub magic: u32,
109
    pub output_entity_count: u32,
110
    pub output_start_idx: u32,
111
    pub strings_offset: u32,
112
    pub next_write_pos: u32,
113
    pub reserved: [u8; 4],
114
}
115

            
116
pub const OUTPUT_HEADER_SIZE: usize = 24;
117

            
118
impl GlobalHeader {
119
    pub fn to_bytes(&self) -> [u8; GLOBAL_HEADER_SIZE] {
120
        let mut buf = [0u8; GLOBAL_HEADER_SIZE];
121
        buf.copy_from_slice(<Self as IntoBytes>::as_bytes(self));
122
        buf
123
    }
124

            
125
73
    pub fn from_bytes(bytes: &[u8]) -> Option<Self> {
126
73
        let v = Self::read_from_prefix(bytes).ok().map(|(v, _)| v)?;
127
73
        (v.magic == MAGIC_NOMI).then_some(v)
128
73
    }
129
}
130

            
131
impl EntityHeader {
132
199
    pub fn to_bytes(&self) -> [u8; ENTITY_HEADER_SIZE] {
133
199
        let mut buf = [0u8; ENTITY_HEADER_SIZE];
134
199
        buf.copy_from_slice(<Self as IntoBytes>::as_bytes(self));
135
199
        buf
136
199
    }
137

            
138
73
    pub fn from_bytes(bytes: &[u8]) -> Option<Self> {
139
73
        Self::read_from_prefix(bytes).ok().map(|(v, _)| v)
140
73
    }
141
}
142

            
143
impl TransactionData {
144
126
    pub fn to_bytes(&self) -> [u8; TRANSACTION_DATA_SIZE] {
145
126
        let mut buf = [0u8; TRANSACTION_DATA_SIZE];
146
126
        buf.copy_from_slice(<Self as IntoBytes>::as_bytes(self));
147
126
        buf
148
126
    }
149

            
150
    pub fn from_bytes(bytes: &[u8]) -> Option<Self> {
151
        Self::read_from_prefix(bytes).ok().map(|(v, _)| v)
152
    }
153
}
154

            
155
impl SplitData {
156
126
    pub fn to_bytes(&self) -> [u8; SPLIT_DATA_SIZE] {
157
126
        let mut buf = [0u8; SPLIT_DATA_SIZE];
158
126
        buf.copy_from_slice(<Self as IntoBytes>::as_bytes(self));
159
126
        buf
160
126
    }
161

            
162
    pub fn from_bytes(bytes: &[u8]) -> Option<Self> {
163
        Self::read_from_prefix(bytes).ok().map(|(v, _)| v)
164
    }
165
}
166

            
167
impl TagData {
168
55
    pub fn to_bytes(&self) -> [u8; TAG_DATA_SIZE] {
169
55
        let mut buf = [0u8; TAG_DATA_SIZE];
170
55
        buf.copy_from_slice(<Self as IntoBytes>::as_bytes(self));
171
55
        buf
172
55
    }
173

            
174
46
    pub fn from_bytes(bytes: &[u8]) -> Option<Self> {
175
46
        Self::read_from_prefix(bytes).ok().map(|(v, _)| v)
176
46
    }
177
}
178

            
179
impl AccountData {
180
18
    pub fn to_bytes(&self) -> [u8; ACCOUNT_DATA_SIZE] {
181
18
        let mut buf = [0u8; ACCOUNT_DATA_SIZE];
182
18
        buf.copy_from_slice(<Self as IntoBytes>::as_bytes(self));
183
18
        buf
184
18
    }
185

            
186
    pub fn from_bytes(bytes: &[u8]) -> Option<Self> {
187
        Self::read_from_prefix(bytes).ok().map(|(v, _)| v)
188
    }
189
}
190

            
191
impl CommodityData {
192
    pub fn to_bytes(&self) -> [u8; COMMODITY_DATA_SIZE] {
193
        let mut buf = [0u8; COMMODITY_DATA_SIZE];
194
        buf.copy_from_slice(<Self as IntoBytes>::as_bytes(self));
195
        buf
196
    }
197

            
198
    pub fn from_bytes(bytes: &[u8]) -> Option<Self> {
199
        Self::read_from_prefix(bytes).ok().map(|(v, _)| v)
200
    }
201
}
202

            
203
impl OutputHeader {
204
154
    pub fn to_bytes(&self) -> [u8; OUTPUT_HEADER_SIZE] {
205
154
        let mut buf = [0u8; OUTPUT_HEADER_SIZE];
206
154
        buf.copy_from_slice(<Self as IntoBytes>::as_bytes(self));
207
154
        buf
208
154
    }
209

            
210
64
    pub fn from_bytes(bytes: &[u8]) -> Option<Self> {
211
64
        let v = Self::read_from_prefix(bytes).ok().map(|(v, _)| v)?;
212
64
        (v.magic == MAGIC_OUTP).then_some(v)
213
64
    }
214
}
215