1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
use flatbuffers::{FlatBufferBuilder, WIPOffset};
use std::io::Write;
use serde::{Deserialize, Serialize};
use crate::zkinterface_generated::zkinterface as fb;
use super::variables::Variables;
use crate::Result;
use std::convert::TryFrom;
use std::error::Error;
#[derive(Clone, Default, Debug, Eq, PartialEq, Deserialize, Serialize)]
pub struct Witness {
pub assigned_variables: Variables,
}
impl<'a> From<fb::Witness<'a>> for Witness {
fn from(fb_witness: fb::Witness) -> Witness {
Witness {
assigned_variables: Variables::from(fb_witness.assigned_variables().unwrap()),
}
}
}
impl<'a> TryFrom<&'a [u8]> for Witness {
type Error = Box<dyn Error>;
fn try_from(buffer: &'a [u8]) -> Result<Self> {
Ok(Self::from(
fb::get_size_prefixed_root_as_root(&buffer)
.message_as_witness()
.ok_or("Not a Witness message.")?))
}
}
impl Witness {
pub fn build<'bldr: 'args, 'args: 'mut_bldr, 'mut_bldr>(
&'args self,
builder: &'mut_bldr mut FlatBufferBuilder<'bldr>,
) -> WIPOffset<fb::Root<'bldr>>
{
let assigned_variables = Some(self.assigned_variables.build(builder));
let witness = fb::Witness::create(builder, &fb::WitnessArgs {
assigned_variables,
});
fb::Root::create(builder, &fb::RootArgs {
message_type: fb::Message::Witness,
message: Some(witness.as_union_value()),
})
}
pub fn write_into(&self, writer: &mut impl Write) -> Result<()> {
let mut builder = FlatBufferBuilder::new();
let message = self.build(&mut builder);
builder.finish_size_prefixed(message, None);
writer.write_all(builder.finished_data())?;
Ok(())
}
}