flatbuffers_rust/flatbuffers/
flatbuffer_builder.rs

1// 将数据 转化为flatbuffer data部分,并且更新vtable
2// 转化过程先定串行
3// 以后可以扩展为异步转化, 所有数据同时转化后,进行拼接+更新vtable 
4use 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            // 生成flatbuffer
58            $builder.build(&mut fields, len)
59        }
60        
61    };
62}
63static SEPARATOR: u8 = 0xff;
64#[derive(Debug)]
65struct MemberInfo {
66    // String bool List<T> T 
67    member_type: String,
68    // 至少有一项内容
69    member_value: Vec<Vec<u8>>
70}
71#[derive(Debug)]
72pub struct InstanceInfo {
73    instance_name: String, 
74    instance_type: String, // 类型一定都是结构体 或 List
75    member_info: Vec<Option<MemberInfo>> // MemberInfo 没有pub can't leak private type
76}
77#[derive(Debug)]
78pub struct FlatBufferBuilder {
79    // 可是设置 slot的大小 防止浪费过大的空间
80    // 最大长度?
81    // 存储所有参与转化的实例信息 只有结构体才能被注册
82    instance_list: Vec<InstanceInfo>
83}
84
85impl FlatBufferBuilder {
86    pub fn new() -> FlatBufferBuilder {
87        FlatBufferBuilder {
88            instance_list: Vec::new()
89        }
90    }
91    
92    // 所有调用的方法都要更新flatbuffer的vtable部分
93
94    // 1. 先将数据转换成bytes
95    // 2. 根据position更新slot
96    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        // 更新vtable
115        // offset = buffer.data.len + 2
116        let offset: u32 = flatbuffer_data_len as u32 + 2;
117        // 定位到slot
118        // let slot_start = position * 4;
119        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        // 更新vtable
138        // offset = buffer.data.len + 1 + child_pivot
139        
140        let offset: u32 = flatbuffer_data_len as u32 + 2;
141        // 定位到slot
142        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 // lifetime 啥情况
163    {
164        // 得到最终需要 bytes
165        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        // 把元素填入 flatbuffer_child 中
172        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        // 转为bytes 已经有 SEPARATOR
177        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        // 定位到slot
191        // let slot_start = position * 4;
192        table.borrow_mut()[position] = offset;
193    }
194    // 专门为 list类型准备的
195    pub fn add_object<T>(&mut self, flatbuffer:&mut FlatBuffer, position: usize, data: &T) 
196        where T: Any
197    {
198        // 可以转化为只考虑 原始类型和非原始类型,直接取底层值
199        // 如果 T 属于 String 类型
200        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        // 计算出 flatbuffer.data的长度
217        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            // 强行 + 1 可能会有大问题 0和1等效!!!!
224            offset += 1;
225        }
226        let data = flatbuffer.data.clone();
227        let table = flatbuffer.vtable.clone().unwrap();
228        table.borrow_mut()[position] = offset;
229        // 可能有 SEPARATOR 问题
230        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    // Vec => | field_0 | field_1 | field_2 | ... |
237    // 生成一个基本的 FlatBuffer 
238    // 执行循环,每一次都会得到相应字段的 child_flatbuffer
239    // 将 child_flatbuffer 加入 flatbuffer 更新 vtable
240
241    // FlatBufferVar.type 判断字段类型
242    // FBString => FlatBuffer 需要 FlatBufferVar.value
243    // FBBool => FlatBuffer 需要 FlatBufferVar.value
244    // FBList => Flatbuffer 需要 FlatBufferVare.len FlatBufferVar.child(FlatBufferVar的数组)
245    // FBStruct => Flatbuffer 需要 Flatbuffer.value 值也是bytes, 
246    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            // 当vec的元素为空时,表示slot=0,无需操作
252            let mut field = match message[position] {
253                Some(ref mut field) => field, // 其实 ref 不懂
254                None => continue,
255            };
256            let (t, v, l, child, p) = field.inner_field();
257            match t {
258                FlatBufferType::FBBool => {
259                    // 直接调用 add_bool
260                    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                    // 生成 flatbuffer_child
273                    let mut message = match child {
274                        Some(child) => child,
275                        None => continue,
276                    };
277                    // 把List中的元素,转为 可以生成 flatbuffer 的数组(Option)
278                    let mut child = Vec::new();
279                    for ele in message {
280                        child.push(Some(ele));
281                    }
282                    // println!("child is {:?}", child);
283                    
284                    match self.build(&mut child, l) {
285                        Ok(mut flatbuffer_child) => {
286                            let (list_bytes, pivot) = flatbuffer_child.bytes();
287                            // println!("list_bytes is {:?}, pivot is {:?}", list_bytes, pivot);
288                            self.add_flatbuffer_bytes(&mut flatbuffer, position, list_bytes.unwrap(), pivot as u32);
289                        },
290                        Err(e) => continue,
291                    }
292                },
293                FlatBufferType::FBStruct => {
294                    // value 是子结构体的 名字,遍历 Messages 来获取message
295                    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    // 注册实例到builder
312    pub fn find_instance(&self, name: &str) -> Result<&InstanceInfo, String> {
313        // 最好不要用clone() value 会很大,重复内容要尽量少
314        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                // 找到了
319                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_list_info 得到结构体的字段数
350        // 每一个字段都要生成 MemberInfo  (type:String Vec<值>:Vec<Vec<u8>>) => MemberInfo
351        // 将 所有的Some(MemberInfo) 存在Vec中
352        // 生成 InstanceInfo
353        // 添加入manager
354        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}