1use std::vec::Vec;
2use super::invoke::{Identity, Invoke};
3use elements;
4
5pub struct DataSegmentBuilder<F=Identity> {
7 callback: F,
8 mem_index: u32,
10 offset: elements::InitExpr,
11 value: Vec<u8>,
12}
13
14impl DataSegmentBuilder {
15 pub fn new() -> Self {
17 DataSegmentBuilder::with_callback(Identity)
18 }
19}
20
21impl<F> DataSegmentBuilder<F> {
22 pub fn with_callback(callback: F) -> Self {
24 DataSegmentBuilder {
25 callback: callback,
26 mem_index: 0,
27 offset: elements::InitExpr::empty(),
28 value: Vec::new(),
29 }
30 }
31
32 pub fn offset(mut self, instruction: elements::Instruction) -> Self {
34 self.offset = elements::InitExpr::new(vec![instruction, elements::Instruction::End]);
35 self
36 }
37
38 pub fn value(mut self, value: Vec<u8>) -> Self {
40 self.value = value;
41 self
42 }
43}
44
45impl<F> DataSegmentBuilder<F> where F: Invoke<elements::DataSegment> {
46 pub fn build(self) -> F::Result {
48 self.callback.invoke(
49 elements::DataSegment::new(
50 self.mem_index,
51 self.offset,
52 self.value,
53 )
54 )
55 }
56}