zkinterface/structs/
variables.rs1use serde::{Deserialize, Serialize};
2
3use flatbuffers::{FlatBufferBuilder, WIPOffset};
4use crate::zkinterface_generated::zkinterface as fb;
5use crate::consumers::reader::{Variable, get_value_size};
6
7#[derive(Clone, Default, Debug, Eq, PartialEq, Deserialize, Serialize)]
8pub struct Variables {
9 pub variable_ids: Vec<u64>,
10 pub values: Option<Vec<u8>>,
11 }
13
14impl<'a> From<fb::Variables<'a>> for Variables {
15 fn from(fb_variables: fb::Variables) -> Variables {
17 Variables {
18 variable_ids: match fb_variables.variable_ids() {
19 Some(var_ids) => Vec::from(var_ids.safe_slice()),
20 None => vec![],
21 },
22 values: match fb_variables.values() {
23 Some(bytes) => Some(Vec::from(bytes)),
24 None => None,
25 },
26 }
27 }
28}
29
30impl Variables {
31 pub fn get_variables(&self) -> Vec<Variable> {
32 let values = match self.values {
33 Some(ref values) => values as &[u8],
34 None => &[], };
36
37 let stride = self.value_size();
38
39 (0..self.variable_ids.len())
40 .map(|var_i|
41 Variable {
42 id: self.variable_ids[var_i],
43 value: &values[stride * var_i..stride * (var_i + 1)],
45 }
46 ).collect()
47 }
48
49 pub fn value_size(&self) -> usize {
50 match self.values {
51 Some(ref values) => get_value_size(&self.variable_ids, values),
52 None => 0,
53 }
54 }
55
56 pub fn build<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr>(
58 &'args self,
59 builder: &'mut_bldr mut FlatBufferBuilder<'bldr>,
60 ) -> WIPOffset<fb::Variables<'bldr>>
61 {
62 let variable_ids = Some(builder.create_vector(&self.variable_ids));
63
64 let values = self.values.as_ref().map(|values|
65 builder.create_vector(values));
66
67 fb::Variables::create(builder, &fb::VariablesArgs {
68 variable_ids,
69 values,
70 info: None,
71 })
72 }
73}