use alloc::vec::Vec; use super::invoke::{Identity, Invoke}; use crate::elements; /// Data segment builder pub struct DataSegmentBuilder { callback: F, // todo: add mapper once multiple memory refs possible mem_index: u32, offset: elements::InitExpr, value: Vec, } impl DataSegmentBuilder { /// New data segment builder pub fn new() -> Self { DataSegmentBuilder::with_callback(Identity) } } impl DataSegmentBuilder { /// New data segment builder inside the chain context pub fn with_callback(callback: F) -> Self { DataSegmentBuilder { callback: callback, mem_index: 0, offset: elements::InitExpr::empty(), value: Vec::new(), } } /// Set offset initialization instruction. `End` instruction will be added automatically. pub fn offset(mut self, instruction: elements::Instruction) -> Self { self.offset = elements::InitExpr::new(vec![instruction, elements::Instruction::End]); self } /// Set the bytes value of the segment pub fn value(mut self, value: Vec) -> Self { self.value = value; self } } impl DataSegmentBuilder where F: Invoke { /// Finish current builder, spawning resulting struct pub fn build(self) -> F::Result { self.callback.invoke( elements::DataSegment::new( self.mem_index, Some(self.offset), self.value, ) ) } }