swasm/builder/
data.rs

1use std::vec::Vec;
2use super::invoke::{Identity, Invoke};
3use elements;
4
5/// Data segment builder
6pub struct DataSegmentBuilder<F=Identity> {
7	callback: F,
8	// todo: add mapper once multiple memory refs possible
9	mem_index: u32,
10	offset: elements::InitExpr,
11	value: Vec<u8>,
12}
13
14impl DataSegmentBuilder {
15	/// New data segment builder
16	pub fn new() -> Self {
17		DataSegmentBuilder::with_callback(Identity)
18	}
19}
20
21impl<F> DataSegmentBuilder<F> {
22	/// New data segment builder inside the chain context
23	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	/// Set offset initialization instruction. `End` instruction will be added automatically.
33	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	/// Set the bytes value of the segment
39	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	/// Finish current builder, spawning resulting struct
47	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}