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 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 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 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 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("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 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}