flatbuffers_rust/flatbuffers/
flatbuffer_builder.rs1use std::cell::RefCell;
5use std::rc::Rc;
6use std::any::Any;
7
8use flatbuffers::flatbuffer::FlatBuffer;
9use flatbuffers::flatbuffer_var::{ FlatBufferVar, FlatBufferType };
10#[macro_export]
11macro_rules! push_null {
12 ({ $( $field:expr, )* }, $helper:expr, $fields:ident ) => {
13 $(
14 $fields.push($field);
15 )*;
16 };
17}
18#[macro_export]
19macro_rules! push_vec {
20 ({ $( $field:expr, $ftype:expr,)* }, $helper:expr, $fields:ident) => {
21 $(
22 $fields.push($helper.from_vec(&mut $field, $ftype));
23 )*;
24 };
25}
26#[macro_export]
27macro_rules! push_bool {
28 ({ $( $field:expr, )* }, $helper:expr, $fields:ident) => {
29 $(
30 $fields.push($helper.from_bool($field));
31 )*;
32 };
33}
34#[macro_export]
35macro_rules! push_string {
36 ({ $( $field:expr, )* }, $helper:expr, $fields:ident) => {
37 $(
38 $fields.push($helper.from_string($field));
39 )*;
40 };
41}
42#[macro_export]
43macro_rules! push_flatbuffervar {
44 ({ $( $field:expr, )* }, $helper:expr, $fields:ident) => {
45 $(
46 $fields.push($helper.from_flatbuffer(&mut $field));
47 )*;
48 };
49}
50#[macro_export]
51macro_rules! build_flatbuffer_or_error {
52 ({ $( $var:expr,)*} $builder:ident ) => {
53 {
54 let mut fields = Vec::new();
55 $( fields.push($var); )*;
56 let len = Some(fields.len() as u8);
57 $builder.build(&mut fields, len)
59 }
60
61 };
62}
63static SEPARATOR: u8 = 0xff;
64#[derive(Debug)]
65struct MemberInfo {
66 member_type: String,
68 member_value: Vec<Vec<u8>>
70}
71#[derive(Debug)]
72pub struct InstanceInfo {
73 instance_name: String,
74 instance_type: String, member_info: Vec<Option<MemberInfo>> }
77#[derive(Debug)]
78pub struct FlatBufferBuilder {
79 instance_list: Vec<InstanceInfo>
83}
84
85impl FlatBufferBuilder {
86 pub fn new() -> FlatBufferBuilder {
87 FlatBufferBuilder {
88 instance_list: Vec::new()
89 }
90 }
91
92 pub fn add_bool(&mut self, flatbuffer: &mut FlatBuffer, position: usize, data: bool) {
97 let mut value = Vec::with_capacity(2);
98 let flatbuffer_data_len = match flatbuffer.data.clone() {
99 None => 0,
100 Some(buffer_data) => buffer_data.borrow().len(),
101 };
102 value.push(SEPARATOR);
103 if data == false {
104 value.push(0u8);
105 } else {
106 value.push(1u8);
107 }
108 let data = flatbuffer.data.clone();
109 let table = flatbuffer.vtable.clone().unwrap();
110 match data {
111 None => flatbuffer.data = Some(Rc::new(RefCell::new(value))),
112 Some(data) => data.borrow_mut().append(&mut value),
113 };
114 let offset: u32 = flatbuffer_data_len as u32 + 2;
117 table.borrow_mut()[position] = offset;
120 }
121 pub fn add_string(&mut self, flatbuffer:&mut FlatBuffer, position: usize, data: String) {
122 let mut data_vec = data.into_bytes();
123 let mut value = Vec::with_capacity(data_vec.len() + 1);
124 value.push(SEPARATOR);
125 value.append(&mut data_vec);
126
127 let data = flatbuffer.data.clone();
128 let table = flatbuffer.vtable.clone().unwrap();
129 let flatbuffer_data_len = match flatbuffer.data.clone() {
130 None => 0,
131 Some(buffer_data) => buffer_data.borrow().len(),
132 };
133 match data {
134 None => flatbuffer.data = Some(Rc::new(RefCell::new(value))),
135 Some(data) => data.borrow_mut().append(&mut value),
136 };
137 let offset: u32 = flatbuffer_data_len as u32 + 2;
141 table.borrow_mut()[position] = offset;
143 }
144 pub fn add_f32(){}
145 pub fn add_f64(){}
146
147 pub fn add_u8(){}
148 pub fn add_u16(){}
149 pub fn add_u32(){}
150 pub fn add_u64(){}
151 pub fn add_u128(){}
152 pub fn add_usize(){}
153
154 pub fn add_i8(){}
155 pub fn add_i16(){}
156 pub fn add_i32(){}
157 pub fn add_i64(){}
158 pub fn add_i128(){}
159 pub fn add_isize(){}
160
161 pub fn add_list<T>(&mut self, flatbuffer:&mut FlatBuffer, position: usize, data: Vec<T>)
162 where T: 'static + Clone {
164 let list_num = data.len();
166 let flatbuffer_data_len = match flatbuffer.data.clone() {
167 None => 0,
168 Some(buffer_data) => buffer_data.borrow().len(),
169 };
170 let mut flatbuffer_child = FlatBuffer::with_pivot(list_num as u8);
171 for i in 0..list_num {
173 let data_clone = data[i].clone();
174 self.add_object(&mut flatbuffer_child, i, &data_clone);
175 }
176 let (value, child_pivot) = match flatbuffer_child.bytes() {
178 (None, n) => (None, n as u32),
179 (Some(bytes), pivot) => (Some(bytes), pivot as u32),
180 };
181 let mut value = value.unwrap();
182 let data = flatbuffer.data.clone();
183 let table = flatbuffer.vtable.clone().unwrap();
184 match data {
185 None => flatbuffer.data = Some(Rc::new(RefCell::new(value))),
186 Some(data) => data.borrow_mut().append(&mut value),
187 };
188
189 let offset: u32 = flatbuffer_data_len as u32 + 1 + child_pivot;
190 table.borrow_mut()[position] = offset;
193 }
194 pub fn add_object<T>(&mut self, flatbuffer:&mut FlatBuffer, position: usize, data: &T)
196 where T: Any
197 {
198 let value_any = data as &Any;
201 match value_any.downcast_ref::<String>() {
202 Some(as_string) => self.add_string(flatbuffer, position, as_string.as_str().to_string()),
203 None => (),
204 }
205 match value_any.downcast_ref::<bool>() {
206 Some(as_bool) => self.add_bool(flatbuffer, position, *as_bool),
207 None => (),
208 }
209 }
210 pub fn add_flatbuffer_bytes(&mut self,
211 flatbuffer: &mut FlatBuffer,
212 position: usize,
213 value:Vec<u8>, pivot: u32)
214 {
215 let mut value = value;
216 let flatbuffer_data_len = match flatbuffer.data.clone() {
218 None => 0,
219 Some(buffer_data) => buffer_data.borrow().len(),
220 };
221 let mut offset: u32 = flatbuffer_data_len as u32 + 1 + pivot;
222 if pivot == 0 {
223 offset += 1;
225 }
226 let data = flatbuffer.data.clone();
227 let table = flatbuffer.vtable.clone().unwrap();
228 table.borrow_mut()[position] = offset;
229 match data {
231 None => flatbuffer.data = Some(Rc::new(RefCell::new(value))),
232 Some(data) => data.borrow_mut().append(&mut value),
233 };
234 }
235
236 pub fn build(&mut self, message:&mut Vec<Option<FlatBufferVar>>, len: Option<u8>)
247 -> Result<FlatBuffer, &'static str> {
248 let slot_num = len.unwrap();
249 let mut flatbuffer = FlatBuffer::with_pivot(slot_num);
250 for position in 0..message.len() {
251 let mut field = match message[position] {
253 Some(ref mut field) => field, None => continue,
255 };
256 let (t, v, l, child, p) = field.inner_field();
257 match t {
258 FlatBufferType::FBBool => {
259 match v {
261 Some(mut data) => self.add_vec(&mut flatbuffer, position, &mut data),
262 None => continue,
263 }
264 },
265 FlatBufferType::FBString => {
266 match v {
267 Some(mut data) => self.add_vec(&mut flatbuffer, position, &mut data),
268 None => continue,
269 }
270 },
271 FlatBufferType::FBList => {
272 let mut message = match child {
274 Some(child) => child,
275 None => continue,
276 };
277 let mut child = Vec::new();
279 for ele in message {
280 child.push(Some(ele));
281 }
282 match self.build(&mut child, l) {
285 Ok(mut flatbuffer_child) => {
286 let (list_bytes, pivot) = flatbuffer_child.bytes();
287 self.add_flatbuffer_bytes(&mut flatbuffer, position, list_bytes.unwrap(), pivot as u32);
289 },
290 Err(e) => continue,
291 }
292 },
293 FlatBufferType::FBStruct => {
294 match v {
296 Some(mut data) => self.add_flatbuffer_bytes(&mut flatbuffer, position, data, p.unwrap()),
297 None => continue,
298 }
299 }
300 };
301 }
302 Ok(flatbuffer)
303 }
304 fn add_vec(&mut self, flatbuffer: &mut FlatBuffer, position: usize, data: &mut Vec<u8>) {
305 let mut value = Vec::new();
306 value.push(SEPARATOR);
307 value.append(data);
308 self.add_flatbuffer_bytes(flatbuffer, position, value, 1u32);
309 }
310
311 pub fn find_instance(&self, name: &str) -> Result<&InstanceInfo, String> {
313 let instance_num = self.instance_list.len();
315
316 for i in 0..instance_num {
317 if self.instance_list[i].instance_name.eq(name) {
318 return Ok(&self.instance_list[i]);
320 }
321 }
322 return Err(format!("No this instance named {:?}", name));
323 }
324 pub fn from_list_bool(&mut self, mem_value: &mut Vec<bool>) -> Result<Vec<Vec<u8>>, String> {
325 let mut res = Vec::new();
326 let len = mem_value.len();
327 for i in 0..len {
328 let value = mem_value[i];
329 if value == true {
330 res.push(vec![1u8]);
331 } else {
332 res.push(vec![0u8]);
333 }
334 }
335 Ok(res)
336 }
337 pub fn from_list_string(&mut self, mem_value: &mut Vec<String>) -> Result<Vec<Vec<u8>>, String> {
338 let mut res = Vec::new();
339 mem_value.reverse();
340 let len = mem_value.len();
341 for i in 0..len {
342 res.push(mem_value.pop().unwrap().into_bytes());
343 }
344 Ok(res)
345 }
346 pub fn register_instance_info( &mut self, ins_name: String, ins_type: String,
347 mem_info_list:&mut Vec<Option<(String, Vec<Vec<u8>>)>>)
348 -> Result<(), String> {
349 mem_info_list.reverse();
355 let member_num = mem_info_list.len();
356 let mut mem_list = Vec::new();
357 for i in 0..member_num {
358 let mem_info = match mem_info_list.pop().unwrap() {
359 Some((mem_type, mem_value)) => Some(MemberInfo{member_type: mem_type, member_value: mem_value }),
360 None => None,
361 };
362 mem_list.push(mem_info);
363 }
364 let mut instance = InstanceInfo {
365 instance_name: ins_name,
366 instance_type: ins_type,
367 member_info: mem_list
368 };
369 self.instance_list.push(instance);
370 Ok(())
371 }
372}