flatbuffers_rust/flatbuffers/
flatbuffer_handler.rs1use flatbuffers::flatbuffer_manager::FlatBufferManager;
2
3static SEPARATOR: u8 = 0xff;
4#[derive(Debug)]
5pub struct FlatBufferHandler {}
7
8impl FlatBufferHandler {
9 pub fn get_field_bytes_pivot(&self, type_name: &str, field_name: &str, manager: &FlatBufferManager, data: &mut Vec<u8>, pivot: usize) -> Result<(Option<Vec<u8>>, usize), String> {
10 let mut vec = manager.to_local_vec(field_name, type_name).unwrap();
11 let mut position = manager.field_position(&mut vec).unwrap();
12 self.get_part_data_level(&mut position, pivot, &data)
13 }
14 pub fn get_part_data_level(&self, level:&mut Vec<usize>, root: usize, data: &Vec<u8>) -> Result<(Option<Vec<u8>>, usize), String> {
19 let l = level.len();
21 let mut want_vec = Vec::new();
22 let mut want_root = 0;
23 let part = level.pop().unwrap();
24 let (child_data, child_root) = match self.get_part_data(part, root, &data) {
25 Ok((child_data, child_root)) => (child_data, child_root),
26 Err(e) => return Err(e),
27 };
28 match child_data {
29 Some(d) => { want_vec = d; want_root = child_root; },
30 None => {
31 if 1 == l {
32 return Ok((None, 0)); } else {
34 return Err(format!("访问层次有误"));
35 }
36 },
37 };
38
39 for i in 0..l-1 {
40 let part = level.pop().unwrap();
41 let (child_data, child_root) = match self.get_part_data(part, want_root, &want_vec) {
42 Ok((child_data, child_root)) => (child_data, child_root),
43 Err(e) => return Err(e),
44 };
45 match child_data {
46 Some(d) => { want_vec = d; want_root = child_root; },
47 None => {
48 if i == l {
49 return Ok((None, 0)); } else {
51 return Err(format!("访问层次有误"));
52 }
53 },
54 };
55 }
56 Ok((Some(want_vec), want_root))
57 }
58 pub fn get_part_data(&self, part: usize, root: usize, data: &Vec<u8>) -> Result<(Option<Vec<u8>>, usize), String> {
59 if part == 0 {
61 return Err(format!("part is {}", part));
62 }
63 if root == 1 {
64 return Err(format!("{:?} is a primitive type", data));
66 }
67 let slot_num = data[root] as usize;
69 if part > slot_num {
70 return Err(format!("slot's num is {}, {} > slot's", slot_num, part));
72 }
73 let (start, child_root) = self.get_start(part, slot_num, root, data);
76
77 if start == 0 {
79 return Ok((None, 0));
81 }
82 let end = self.get_end(part, slot_num, root, data);
84
85 Ok((Some(data[start..end].to_vec()), child_root-start))
87 }
88 fn get_end(&self, part: usize, slot_num: usize, root: usize, data: &Vec<u8>) -> usize {
89 let mut part = part;
90 if slot_num == part {
92 return data.len();
93 } else {
94 loop {
95 part += 1;
96 if slot_num == part && data[root - 4] == 0u8 {
97 return data.len();
99 }
100 let (end, pivot) = self.get_start(part, slot_num, root, data);
101
102 if end != 0 {
104 return end;
105 }
106 }
107 }
108 }
109 fn get_start(&self, part: usize, slot_num: usize, root: usize, data: &Vec<u8>) -> (usize, usize) {
110 let size = 4;
111 let mut offset = 0;
112 let mut scale = 1;
113 let offset_vec = data[root-(slot_num-part+1)*size..root-(slot_num-part)*size].to_vec();
116 for i in 0..size {
118 offset += (offset_vec[i] as usize) *scale;
120 scale *= 256;
121 }
122 if offset == 0 {
124 return (0, 0);
127 }
128 let child_root = offset as usize + root;
129 let mut start = 0;
132 if data[child_root - 1] == SEPARATOR {
134 start = child_root - 1;
136 } else {
137 let child_slot_num = data[child_root];
139 start = child_root - size*child_slot_num as usize -1; }
141 (start, child_root)
142 }
143}