diff --git a/src/builder/code.rs b/src/builder/code.rs index e86d53e..3614f7a 100644 --- a/src/builder/code.rs +++ b/src/builder/code.rs @@ -255,8 +255,11 @@ impl FuncBodyBuilder where F: Invoke { /// Function definition (extended structure to specify function entirely, incl. signature, mainness and code) pub struct FunctionDefinition { + /// Is this function is start function pub is_main: bool, + /// Signature description pub signature: Signature, + /// Body (code) of the function pub code: elements::FuncBody, } diff --git a/src/builder/export.rs b/src/builder/export.rs index 837043c..9016441 100644 --- a/src/builder/export.rs +++ b/src/builder/export.rs @@ -9,6 +9,7 @@ pub struct ExportBuilder { } impl ExportBuilder { + /// New export builder pub fn new() -> Self { ExportBuilder::with_callback(Identity) } diff --git a/src/builder/global.rs b/src/builder/global.rs index 9c666f3..326572c 100644 --- a/src/builder/global.rs +++ b/src/builder/global.rs @@ -2,6 +2,7 @@ use super::invoke::{Invoke, Identity}; use super::misc::ValueTypeBuilder; use elements; +/// Global builder pub struct GlobalBuilder { callback: F, value_type: elements::ValueType, @@ -10,12 +11,14 @@ pub struct GlobalBuilder { } impl GlobalBuilder { + /// New global builder pub fn new() -> Self { GlobalBuilder::with_callback(Identity) } } impl GlobalBuilder { + /// New global builder with callback (in chained context) pub fn with_callback(callback: F) -> Self { GlobalBuilder { callback: callback, @@ -25,31 +28,36 @@ impl GlobalBuilder { } } + /// Set/override resulting global type pub fn with_type(mut self, value_type: elements::ValueType) -> Self { self.value_type = value_type; self } + /// Set mutabilty to true pub fn mutable(mut self) -> Self { self.is_mutable = true; self } + /// Set initialization expression opcode for this global (`end` opcode will be added automatically) pub fn init_expr(mut self, opcode: elements::Opcode) -> Self { self.init_expr = elements::InitExpr::new(vec![opcode, elements::Opcode::End]); self } + /// Start value type builder pub fn value_type(self) -> ValueTypeBuilder { ValueTypeBuilder::with_callback(self) } } impl GlobalBuilder where F: Invoke { + /// Finalize current builder spawning resulting struct pub fn build(self) -> F::Result { self.callback.invoke( elements::GlobalEntry::new( - elements::GlobalType::new(self.value_type, self.is_mutable), + elements::GlobalType::new(self.value_type, self.is_mutable), self.init_expr, ) ) diff --git a/src/builder/import.rs b/src/builder/import.rs index 4297115..77d51f4 100644 --- a/src/builder/import.rs +++ b/src/builder/import.rs @@ -1,6 +1,7 @@ use super::invoke::{Invoke, Identity}; use elements; +/// Import builder pub struct ImportBuilder { callback: F, module: String, @@ -9,13 +10,14 @@ pub struct ImportBuilder { } impl ImportBuilder { + /// New import builder pub fn new() -> Self { ImportBuilder::with_callback(Identity) } } impl ImportBuilder { - + /// New import builder with callback (in chained context) pub fn with_callback(callback: F) -> Self { ImportBuilder { callback: callback, @@ -25,31 +27,37 @@ impl ImportBuilder { } } + /// Set/override module name pub fn module(mut self, name: &str) -> Self { self.module = name.to_owned(); self } + /// Set/override field name pub fn field(mut self, name: &str) -> Self { self.field = name.to_owned(); self } + /// Set/override both module name and field name pub fn path(self, module: &str, field: &str) -> Self { self.module(module).field(field) } + /// Set/override external mapping for this import pub fn with_external(mut self, external: elements::External) -> Self { self.binding = external; self } + /// Start new external mapping builder pub fn external(self) -> ImportExternalBuilder { ImportExternalBuilder::with_callback(self) } } impl ImportBuilder where F: Invoke { + /// Finalize current builder spawning the resulting struct pub fn build(self) -> F::Result { self.callback.invoke(elements::ImportEntry::new(self.module, self.field, self.binding)) } @@ -62,12 +70,14 @@ impl Invoke for ImportBuilder { } } +/// Import to external mapping builder pub struct ImportExternalBuilder { callback: F, binding: elements::External, } impl ImportExternalBuilder where F: Invoke { + /// New import to external mapping builder with callback (in chained context) pub fn with_callback(callback: F) -> Self { ImportExternalBuilder{ callback: callback, @@ -75,21 +85,25 @@ impl ImportExternalBuilder where F: Invoke { } } + /// Function mapping with type reference pub fn func(mut self, index: u32) -> F::Result { self.binding = elements::External::Function(index); self.callback.invoke(self.binding) } + /// Memory mapping with specified limits pub fn memory(mut self, min: u32, max: Option) -> F::Result { self.binding = elements::External::Memory(elements::MemoryType::new(min, max)); self.callback.invoke(self.binding) } + /// Table mapping with specified limits pub fn table(mut self, min: u32, max: Option) -> F::Result { self.binding = elements::External::Table(elements::TableType::new(min, max)); self.callback.invoke(self.binding) } + /// Global mapping with speciifed type and mutability pub fn global(mut self, value_type: elements::ValueType, is_mut: bool) -> F::Result { self.binding = elements::External::Global(elements::GlobalType::new(value_type, is_mut)); self.callback.invoke(self.binding) diff --git a/src/builder/memory.rs b/src/builder/memory.rs index aed5473..c6fd0b0 100644 --- a/src/builder/memory.rs +++ b/src/builder/memory.rs @@ -1,31 +1,41 @@ use elements; use super::invoke::{Invoke, Identity}; +/// Memory definition struct #[derive(Debug)] pub struct MemoryDefinition { + /// Minimum memory size pub min: u32, + /// Maximum memory size pub max: Option, + /// Memory data segments (static regions) pub data: Vec, } +/// Memory static region entry definition #[derive(Debug)] pub struct MemoryDataDefinition { + /// Segment initialization expression for offset pub offset: elements::InitExpr, + /// Raw bytes of static region pub values: Vec, } +/// Memory and static regions builder pub struct MemoryBuilder { callback: F, memory: MemoryDefinition, } impl MemoryBuilder { + /// New memory builder pub fn new() -> Self { MemoryBuilder::with_callback(Identity) } } impl MemoryBuilder where F: Invoke { + /// New memory builder with callback (in chained context) pub fn with_callback(callback: F) -> Self { MemoryBuilder { callback: callback, @@ -33,16 +43,19 @@ impl MemoryBuilder where F: Invoke { } } + /// Set/override minimum size pub fn with_min(mut self, min: u32) -> Self { self.memory.min = min; self } + /// Set/override maximum size pub fn with_max(mut self, max: Option) -> Self { self.memory.max = max; self } + /// Push new static region with initialized offset expression and raw bytes pub fn with_data(mut self, index: u32, values: Vec) -> Self { self.memory.data.push(MemoryDataDefinition { offset: elements::InitExpr::new(vec![ @@ -54,6 +67,7 @@ impl MemoryBuilder where F: Invoke { self } + /// Finalize current builder, spawning resulting struct pub fn build(self) -> F::Result { self.callback.invoke(self.memory) } diff --git a/src/builder/table.rs b/src/builder/table.rs index 3706870..e5e35b6 100644 --- a/src/builder/table.rs +++ b/src/builder/table.rs @@ -1,31 +1,41 @@ use elements; use super::invoke::{Invoke, Identity}; +/// Table definition #[derive(Debug)] pub struct TableDefinition { + /// Minimum length pub min: u32, + /// Maximum length, if any pub max: Option, + /// Element segments, if any pub elements: Vec, } +/// Table elements entry definition #[derive(Debug)] pub struct TableEntryDefinition { + /// Offset initialization expression pub offset: elements::InitExpr, + /// Values of initialization pub values: Vec, } +/// Table builder pub struct TableBuilder { callback: F, table: TableDefinition, } impl TableBuilder { + /// New table builder pub fn new() -> Self { TableBuilder::with_callback(Identity) } } impl TableBuilder where F: Invoke { + /// New table builder with callback in chained context pub fn with_callback(callback: F) -> Self { TableBuilder { callback: callback, @@ -33,16 +43,19 @@ impl TableBuilder where F: Invoke { } } + /// Set/override minimum length pub fn with_min(mut self, min: u32) -> Self { self.table.min = min; self } + /// Set/override maximum length pub fn with_max(mut self, max: Option) -> Self { self.table.max = max; self } + /// Generate initialization expression and element values on specified index pub fn with_element(mut self, index: u32, values: Vec) -> Self { self.table.elements.push(TableEntryDefinition { offset: elements::InitExpr::new(vec![ @@ -54,6 +67,7 @@ impl TableBuilder where F: Invoke { self } + /// Finalize current builder spawning resulting struct pub fn build(self) -> F::Result { self.callback.invoke(self.table) }