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}