zkinterface/structs/
variables.rs

1use 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    // pub info: Option<Vec<(String, &'a [u8])>>,
12}
13
14impl<'a> From<fb::Variables<'a>> for Variables {
15    /// Convert from Flatbuffers references to owned structure.
16    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 => &[], // No values, only variable ids and empty values.
35        };
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                    // Extract the value. Possibly empty.
44                    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    /// Add this structure into a Flatbuffers message builder.
57    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}