Skip to main content

simple_sbe/
lib.rs

1use crate::codec::Decoder;
2use crate::codec::byte_order_codec::ByteOrderCodec;
3use crate::codec::frame_codec_codec::FrameCodecDecoder;
4use crate::codec::presence_codec::PresenceCodec;
5use crate::codec::token_codec_codec::TokenCodecDecoder;
6use crate::codec::{ReadBuf, frame_codec_codec, token_codec_codec};
7use crate::token::{ByteOrder, Encoding, Presence, PrimitiveValue, Token};
8
9mod codec;
10
11pub mod decode;
12pub mod otf;
13pub mod token;
14
15pub fn tokenize(svbuf: &[u8]) -> Vec<Token> {
16    let schema_buf = ReadBuf::new(svbuf);
17
18    let d = FrameCodecDecoder::default();
19    let mut d = d.wrap(
20        schema_buf,
21        0,
22        frame_codec_codec::SBE_BLOCK_LENGTH,
23        frame_codec_codec::SBE_SCHEMA_VERSION,
24    );
25
26    dbg!(d.ir_id());
27    dbg!(d.ir_version());
28    dbg!(d.schema_version());
29
30    // dbg!(d);
31
32    let c = d.package_name_decoder();
33    dbg!(
34        c,
35        String::from_utf8_lossy(d.package_name_slice(c)),
36        d.get_limit()
37    );
38
39    let c = d.namespace_name_decoder();
40    dbg!(
41        c,
42        String::from_utf8_lossy(d.namespace_name_slice(c)),
43        d.get_limit()
44    );
45
46    let c = d.semantic_version_decoder();
47    dbg!(
48        c,
49        String::from_utf8_lossy(d.semantic_version_slice(c)),
50        d.get_limit()
51    );
52
53    let mut offset = d.encoded_length();
54
55    println!("=== message ===");
56    let mut tokens = Vec::new();
57    let mut i = 0;
58    while offset < svbuf.len() {
59        dbg!(offset, svbuf.len());
60
61        let mut d = TokenCodecDecoder::default().wrap(
62            schema_buf,
63            offset,
64            token_codec_codec::SBE_BLOCK_LENGTH,
65            token_codec_codec::SBE_SCHEMA_VERSION,
66        );
67
68        println!(">>> {:?}", d.signal());
69        dbg!(d.token_offset(), d.token_size());
70        dbg!(d.field_id());
71        // dbg!(d.token_version());
72        // dbg!(d.component_token_count());
73        let primitive_type = dbg!(d.primitive_type()).into();
74        let byte_order = match dbg!(d.byte_order()) {
75            ByteOrderCodec::SBE_LITTLE_ENDIAN | ByteOrderCodec::NullVal => ByteOrder::LittleEndian,
76            ByteOrderCodec::SBE_BIG_ENDIAN => ByteOrder::BigEndian,
77        };
78        let presence = match dbg!(d.presence()) {
79            PresenceCodec::SBE_REQUIRED | PresenceCodec::NullVal => Presence::Required,
80            PresenceCodec::SBE_OPTIONAL => Presence::Optional,
81            PresenceCodec::SBE_CONSTANT => Presence::Constant,
82        };
83
84        // Note: var data must be decoded in the correct order!
85        let c = d.name_decoder();
86        let name = String::from_utf8_lossy(d.name_slice(c)).to_string();
87        dbg!(&name);
88
89        let c = d.const_value_decoder();
90        let const_value = dbg!(PrimitiveValue::new(primitive_type, d.const_value_slice(c)));
91
92        let c = d.min_value_decoder();
93        let min_value = dbg!(PrimitiveValue::new(primitive_type, d.min_value_slice(c)));
94
95        let c = d.max_value_decoder();
96        let max_value = dbg!(PrimitiveValue::new(primitive_type, d.max_value_slice(c)));
97
98        let c = d.null_value_decoder();
99        let null_value = dbg!(PrimitiveValue::new(primitive_type, d.null_value_slice(c)));
100
101        let c = d.character_encoding_decoder();
102        let character_encoding = String::from_utf8_lossy(d.character_encoding_slice(c)).to_string();
103
104        let c = d.epoch_decoder();
105        let epoch = String::from_utf8_lossy(d.epoch_slice(c)).to_string();
106
107        let c = d.time_unit_decoder();
108        let time_unit = String::from_utf8_lossy(d.time_unit_slice(c)).to_string();
109
110        let c = d.semantic_type_decoder();
111        let semantic_type = String::from_utf8_lossy(d.semantic_type_slice(c)).to_string();
112
113        let c = d.description_decoder();
114        let description = String::from_utf8_lossy(d.description_slice(c)).to_string();
115
116        let c = d.referenced_name_decoder();
117        let referenced_name = String::from_utf8_lossy(d.referenced_name_slice(c)).to_string();
118
119        let tok = Token {
120            i,
121            signal: d.signal().into(),
122            name,
123            referenced_name,
124            description,
125            // package_name,
126            id: d.field_id(),
127            version: d.token_version(),
128            deprecated: d.deprecated(),
129            encoded_length: d.token_size(),
130            offset: d.token_offset(),
131            component_token_count: d.component_token_count(),
132            encoding: Encoding {
133                presence,
134                primitive_type,
135                byte_order,
136                const_value,
137                min_value,
138                max_value,
139                null_value,
140                character_encoding,
141                epoch,
142                time_unit,
143                semantic_type,
144            },
145        };
146
147        tokens.push(tok);
148        i += 1;
149
150        offset += d.encoded_length();
151    }
152
153    tokens
154}
155
156#[cfg(test)]
157mod tests {
158    use super::*;
159    use crate::codec::frame_codec_codec::FrameCodecDecoder;
160    use crate::codec::token_codec_codec::TokenCodecDecoder;
161    use crate::codec::{Decoder, ReadBuf, frame_codec_codec, token_codec_codec};
162    use anyhow::Result;
163    use std::fs::File;
164    use std::io::Read;
165
166    #[test]
167    fn load() -> Result<()> {
168        // let mut f = File::open("../simple.sbeir")?;
169        // let mut f = File::open("../example-schema.sbeir")?;
170        let mut f = File::open("data/sbe-ir.sbeir")?;
171        let mut buffer = Vec::new();
172
173        f.read_to_end(&mut buffer)?;
174
175        let buf = ReadBuf::new(&buffer);
176
177        println!("{buf:?}");
178        for (i, &c) in buffer.iter().enumerate() {
179            println!("{i:>3} | {c:>3} {:>7}", (c as char).escape_default())
180        }
181        println!("");
182        let mut d = FrameCodecDecoder::default();
183        let mut d = d.wrap(
184            buf,
185            0,
186            frame_codec_codec::SBE_BLOCK_LENGTH,
187            frame_codec_codec::SBE_SCHEMA_VERSION,
188        );
189        dbg!(d.ir_id());
190        dbg!(d.ir_version());
191        dbg!(d.schema_version());
192
193        // dbg!(d);
194
195        let c = d.package_name_decoder();
196        dbg!(
197            c,
198            String::from_utf8_lossy(d.package_name_slice(c)),
199            d.get_limit()
200        );
201
202        let c = d.namespace_name_decoder();
203        dbg!(
204            c,
205            String::from_utf8_lossy(d.namespace_name_slice(c)),
206            d.get_limit()
207        );
208
209        let c = d.semantic_version_decoder();
210        dbg!(
211            c,
212            String::from_utf8_lossy(d.semantic_version_slice(c)),
213            d.get_limit()
214        );
215
216        let mut offset = d.encoded_length();
217
218        while offset < buffer.len() {
219            dbg!(offset, buffer.len());
220
221            let mut d = TokenCodecDecoder::default().wrap(
222                buf,
223                offset,
224                token_codec_codec::SBE_BLOCK_LENGTH,
225                token_codec_codec::SBE_SCHEMA_VERSION,
226            );
227
228            println!(">>> {:?}", d.signal());
229            dbg!(d.token_offset(), d.token_size());
230            dbg!(d.field_id());
231            dbg!(d.token_version());
232            dbg!(d.component_token_count());
233            dbg!(d.primitive_type());
234            dbg!(d.byte_order());
235            dbg!(d.presence());
236            dbg!(d.deprecated());
237
238            let c = d.name_decoder();
239            dbg!(String::from_utf8_lossy(d.name_slice(c)));
240
241            let c = d.const_value_decoder();
242            dbg!(String::from_utf8_lossy(d.const_value_slice(c)));
243
244            let c = d.min_value_decoder();
245            dbg!(String::from_utf8_lossy(d.min_value_slice(c)));
246
247            let c = d.max_value_decoder();
248            dbg!(String::from_utf8_lossy(d.max_value_slice(c)));
249
250            let c = d.null_value_decoder();
251            dbg!(String::from_utf8_lossy(d.null_value_slice(c)));
252
253            let c = d.character_encoding_decoder();
254            dbg!(String::from_utf8_lossy(d.character_encoding_slice(c)));
255
256            let c = d.epoch_decoder();
257            dbg!(String::from_utf8_lossy(d.epoch_slice(c)));
258
259            let c = d.time_unit_decoder();
260            dbg!(String::from_utf8_lossy(d.time_unit_slice(c)));
261
262            let c = d.semantic_type_decoder();
263            dbg!(String::from_utf8_lossy(d.semantic_type_slice(c)));
264
265            let c = d.description_decoder();
266            dbg!(String::from_utf8_lossy(d.description_slice(c)));
267
268            let c = d.referenced_name_decoder();
269            dbg!(String::from_utf8_lossy(d.referenced_name_slice(c)));
270
271            offset += d.encoded_length();
272        }
273
274        Ok(())
275    }
276}