flatbuffers_rust/flatbuffers/
flatbuffer_helper.rs

1// bool -> FlatBufferVar
2// String -> FlatBufferVar
3// list -> FlatBufferVar
4// 结构体 -> FlatBufferVar
5// 不用考虑 SEPARATOR
6
7// message = Vec<FlatBufferVar> + name
8// messages = Vec<message>
9use std::any::Any;
10
11use flatbuffers::flatbuffer::FlatBuffer;
12use flatbuffers::flatbuffer_var::{ FlatBufferVar, FlatBufferType };
13use flatbuffers::flatbuffer_handler::FlatBufferHandler;
14
15static SEPARATOR: u8 = 0xff;
16
17#[derive(Debug)]
18pub struct FlatBufferHelper {
19
20}
21// 全是基本类型的转化
22// 对 整个data做转化,不考虑类型是否匹配
23impl FlatBufferHelper {
24    pub fn from_option_bool(&self, data: Option<bool>) -> Option<FlatBufferVar> {
25        let data = match data {
26            Some(data) => data,
27            None => return None,
28        };
29        self.from_bool(data)
30    }
31    fn from_bool(&self, data: bool) -> Option<FlatBufferVar> {
32        let mut data_vec = vec![0u8;1];
33        if data {
34            data_vec = vec![1u8;1];
35        }
36        FlatBufferVar::new( FlatBufferType::FBBool, 
37                            Some(data_vec), None, None, None )
38    }
39    pub fn from_option_string(&self, data: Option<String>) -> Option<FlatBufferVar> {
40        let data = match data {
41            Some(data) => data,
42            None => return None,
43        };
44        self.from_string(data)
45    }
46    fn from_string(&self, data: String) -> Option<FlatBufferVar> {
47        let mut data_vec = data.into_bytes();
48        FlatBufferVar::new( FlatBufferType::FBString, 
49                            Some(data_vec), None, None, None )
50    }
51    // rust 原始数据,不做任何改动 转为对应的FlatBufferVar
52    pub fn from_option_vec<T>(&self, data: Option<Vec<T>>, e_type: u8) -> Option<FlatBufferVar> where T: Any {
53        let data = match data {
54            Some(data) => data,
55            None => return None,
56        };
57        self.from_vec(&data, e_type)
58    }
59    // T 只能是 String bool FlatBufferVar 其中一种
60    pub fn from_vec<T>( &self, data:&Vec<T>, e_type: u8) -> Option<FlatBufferVar> where T: Any {
61        // 通过反射机制,得到T的类型  或者 增加参数,告知传入的类型
62        let mut flatbuffer_list = Vec::new();
63        if e_type == 0u8 {
64            // bool
65            for len in 0..data.len() {
66                // let element = data[len];
67                let value_any = &data[len] as &Any;
68                let value_bool = match value_any.downcast_ref::<bool>() {
69                    Some(as_bool) => *as_bool,
70                    None => continue, // 可能出错了!
71                };
72                // println!("添加");
73                flatbuffer_list.push(self.from_bool(value_bool).unwrap());
74            }
75        } else if e_type == 1u8 {
76            // string
77            // println!("vec<string> len is {}", data.len());
78            for len in 0..data.len() {
79                // let element = data[len];
80                let value_any = &data[len] as &Any;
81                let value_string = match value_any.downcast_ref::<String>() {
82                    Some(as_string) => {
83                        // println!("string is {:?}", as_string);
84                        as_string.as_str().to_string()
85                    },
86                    None => {
87                        println!("没有转换成功");
88                        continue;
89                    }, // 可能出错了
90                };
91                flatbuffer_list.push(self.from_string(value_string).unwrap());
92                // println!("增加{} 的list: {:?}", value_string, flatbuffer_list);
93            }
94        } else if e_type == 2u8 {
95            // list struct 合并
96            // 属于FlatBufferVar类型 不做操作,直接push list中不能有None
97            for len in 0..data.len() {
98                // let element = data[len];
99                let value_any = &data[len] as &Any;
100                let value_flatbuffer_var = match value_any.downcast_ref::<FlatBufferVar>() {
101                    Some(ref as_flatbuffervar) => (*as_flatbuffervar).clone(), // 为什么这样可以?
102                    None => continue, // 可能出错了
103                };
104                // println!("value_flatbuffer_var: {:?}", value_flatbuffer_var);
105                flatbuffer_list.push(value_flatbuffer_var);
106            }
107        }
108        FlatBufferVar::new( FlatBufferType::FBList, None, 
109                            Some(data.len() as u8),
110                            Some(flatbuffer_list), None )
111    }
112    // T 可以是自定义结构体, 也可以是
113    // pub fn from_any<T>
114    // 针对多维数组
115    // T 只能是 Vec<T'> 类型 最内层的 'T' 只能是String bool FlatBufferVar
116    // e_type 表示元素类型的代号 3:Vec<T>, 2:Vec<FlatBufferVar>, 1:Vec<String>, 0:Vec<bool> 
117    // macro_rules! convert_type {
118    //     ($etype:ty, $any:ident) => { 
119    //         {
120    //             match $any.downcast_ref::<$etype>() {
121    //                 Some(as_type) => Some(as_type),
122    //                 None => None, // 可能出错了
123    //             }
124    //         }
125    //     };
126    // }   
127    // type_name 是整体的类型 vec![vec![3u8]] => Vec<Vec<u8>>
128    // pub fn from_list<T>(&self, data:&Vec<T>, type_name: &mut str, e_types:&mut Vec<u8>) 
129    //                     -> Option<Vec<FlatBufferVar>> where T: Any
130    // {
131    //     let mut vec = Vec::new();
132    //     let e_type = e_types.pop().unwrap();
133    //     let e_types_clone = e_types.clone();
134    //     let len  = data.len();
135    //     for i in 0..len {   
136    //         if e_type == 3u8 {
137    //             // 需要继续调用调用
138    //             // 但是元素是T类型,需要使用类型转换转成type类型
139
140    //             // 先得到元素类型
141    //             convert_type!{ }
142    //             let child_vec = self.from_list(&data[i], &mut e_types_clone).unwrap();
143                
144    //             vec.push(self.from_vec(&child_vec, 2u8).unwrap());
145    //         } else {
146    //             if e_type == 0u8 {
147    //                 // 将 T 转成 Vec<bool>
148    //                 let value_any = &data[i] as &Any;
149    //                 match value_any.downcast_ref::<Vec<bool>>() {
150    //                     Some(as_vec_bool) => vec.push(self.from_vec(as_vec_bool, 0u8).unwrap()),
151    //                     None => continue, // 可能出错了
152    //                 };
153    //             } else if e_type == 1u8 {
154    //                 // 将 T 转成 Vec<bool>
155    //                 let value_any = &data[i] as &Any;
156    //                 match value_any.downcast_ref::<Vec<String>>() {
157    //                     Some(as_vec_string) => vec.push(self.from_vec(as_vec_string, 1u8).unwrap()),
158    //                     None => continue, // 可能出错了
159    //                 };
160    //             } else if e_type == 2u8 {
161    //                 // 将 T 转成 Vec<bool>
162    //                 let value_any = &data[i] as &Any;
163    //                 match value_any.downcast_ref::<Vec<FlatBufferVar>>() {
164    //                     Some(as_vec_flatbuffervar) => vec.push(self.from_vec(as_vec_flatbuffervar, 2u8).unwrap()),
165    //                     None => continue, // 可能出错了
166    //                 };
167    //             } 
168    //         }
169    //     }
170    //     Some(vec)
171    // }
172
173    // 可能不是特别好用 数据可以再进行操作
174    pub fn from_option_flatbuffer(&self, data: Option<FlatBuffer>) -> Option<FlatBufferVar> {
175        let mut data = match data {
176            Some(data) => data,
177            None => return None,
178        };
179        self.from_flatbuffer(&mut data)
180    }
181    fn from_flatbuffer(&self, data:&mut FlatBuffer) -> Option<FlatBufferVar> {
182        let (bytes, pivot) = data.bytes();
183        // println!("本次bytes is {:?}", bytes);
184        FlatBufferVar::new( FlatBufferType::FBStruct, 
185                            bytes, None, None, Some(pivot as u32) )
186    }
187    pub fn to_option_string(&self, data: Option<Vec<u8>>, root: usize) -> Option<String> {
188        let data = match data {
189            Some(s) => s,
190            None => return None,
191        };
192        let value = self.to_string(&data, root);
193        Some(value)
194    }
195    
196    pub fn to_string(&self, data: &Vec<u8>, root: usize) -> String {
197        let end = data.len();
198        String::from_utf8(data[root..end].to_vec()).unwrap()
199    }
200    pub fn to_option_bool(&self, data: Option<Vec<u8>>, root: usize) -> Option<bool> {
201        let data = match data {
202            Some(s) => s,
203            None => return None,
204        };
205        let value = self.to_bool(&data, root);
206        Some(value)
207    }
208    pub fn to_bool(&self, data: &Vec<u8>, root: usize) -> bool {
209        // 错误处理可以更好
210        if data[root] == 0u8 {
211            return false;
212        } else {
213            return true;
214        }
215    }
216    // 专门为数组准备的 数组中不存在None
217    pub fn to_vec(&self, data: &Vec<u8>, root: usize) -> Result<Vec<Vec<u8>>, String> {
218        let handler = FlatBufferHandler{};
219        let mut bytes_list = Vec::new();
220
221        // 先获取到数组长度
222        let vec_len = data[root] as u32;
223        for p in 0..vec_len {
224            // 获取每一个字段的bytes
225            let (bytes, pivot) = match handler.get_part_data(1 + p as usize, root, data) {
226                Ok((bytes, pivot)) => (bytes, pivot),
227                Err(e) => return Err(e),
228            };
229            bytes_list.push(bytes.unwrap());
230        }
231        Ok(bytes_list)
232    }
233    pub fn to_vec_string(&self, data: &Vec<u8>, root: usize) -> Result<Vec<String>, String> {
234        let bytes_list = match self.to_vec(data, root) {
235            Ok(list) => list,
236            Err(e) => return Err(e),
237        };
238        let mut string_list = Vec::new();
239        for bytes in bytes_list {
240            string_list.push(self.to_string(&bytes, 1));
241        }
242        Ok(string_list)
243    }
244    // pub fn to_option_struct(&self, data:Option<>)
245    // 所有字段分离出来,存入Vec 字段可能为空
246    pub fn to_struct(&self, data: &Vec<u8>, root: usize) -> Result<Vec<Option<Vec<u8>>>, String> {
247        let handler = FlatBufferHandler{};
248        let mut fields = Vec::new();
249        // 先判断是否是原始类型
250        if data[root -1] == SEPARATOR {
251            // 属于原始类型
252            return Err(format!("{:?} is a primitive type", data));
253        }
254        // 开始分离
255
256        // 先获取到数组长度
257        let vec_len = data[root] as u32;
258        for p in 0..vec_len {
259            // 获取每一个字段的bytes
260            let (bytes, pivot) = match handler.get_part_data(1 + p as usize, root, data) {
261                Ok((bytes, pivot)) => (bytes, pivot),
262                Err(e) => return Err(e),
263            };
264            fields.push(bytes);
265        }
266        Ok(fields)
267    }
268    // pub fn to_struct_with_manager(&self, data: &Vec<u8>, root: usize, manager: &mut FlatBufferManager)
269}