diff --git a/src/builder/code.rs b/src/builder/code.rs index b3cf39f..e33cf8f 100644 --- a/src/builder/code.rs +++ b/src/builder/code.rs @@ -2,11 +2,13 @@ use elements; use super::invoke::{Invoke, Identity}; use super::misc::{ValueTypeBuilder, ValueTypesBuilder, OptionalValueTypeBuilder}; +/// Signature template description pub enum Signature { TypeReference(u32), Inline(elements::FunctionType), } +/// Signature builder pub struct SignatureBuilder { callback: F, signature: elements::FunctionType, @@ -19,44 +21,53 @@ impl SignatureBuilder { } impl SignatureBuilder where F: Invoke { + /// New builder with callback function specified pub fn with_callback(callback: F) -> Self { - SignatureBuilder { - callback: callback, + SignatureBuilder { + callback: callback, signature: elements::FunctionType::default(), } } + /// Add argument to signature builder pub fn with_param(mut self, value_type: elements::ValueType) -> Self { self.signature.params_mut().push(value_type); self } + /// Add multiple arguments to signature builder pub fn with_params(mut self, value_types: Vec) -> Self { self.signature.params_mut().extend(value_types); self } + /// Override signature return type pub fn with_return_type(mut self, return_type: Option) -> Self { *self.signature.return_type_mut() = return_type; self } + /// Start build new argument pub fn param(self) -> ValueTypeBuilder { ValueTypeBuilder::with_callback(self) } + /// Start build multiple arguments pub fn params(self) -> ValueTypesBuilder { ValueTypesBuilder::with_callback(self) } + /// Start building return type pub fn return_type(self) -> OptionalValueTypeBuilder { OptionalValueTypeBuilder::with_callback(self) } + /// Finish current builder pub fn build(self) -> F::Result { self.callback.invoke(self.signature) } + /// Finish current builder returning intermediate `Signature` struct pub fn build_sig(self) -> Signature { Signature::Inline(self.signature) } @@ -82,8 +93,8 @@ impl Invoke> for SignatureBuilder } } -impl Invoke for SignatureBuilder - where F: Invoke +impl Invoke for SignatureBuilder + where F: Invoke { type Result = Self; @@ -92,27 +103,32 @@ impl Invoke for SignatureBuilder } } +/// Type (signature) reference builder (for function/import/indirect call) pub struct TypeRefBuilder { callback: F, type_ref: u32, } impl TypeRefBuilder where F: Invoke { + /// New builder chained with specified callback pub fn with_callback(callback: F) -> Self { - TypeRefBuilder { - callback: callback, + TypeRefBuilder { + callback: callback, type_ref: 0 } } + /// Set/override of type reference pub fn val(mut self, val: u32) -> Self { self.type_ref = val; self } + /// Finish current builder pub fn build(self) -> F::Result { self.callback.invoke(self.type_ref) } } +/// Multiple signatures builder pub struct SignaturesBuilder { callback: F, section: Vec, @@ -140,7 +156,7 @@ impl SignaturesBuilder { pub fn type_ref(self) -> TypeRefBuilder { TypeRefBuilder::with_callback(self) - } + } } impl SignaturesBuilder where F: Invoke { @@ -154,7 +170,7 @@ impl Invoke for SignaturesBuilder { fn invoke(self, signature: elements::FunctionType) -> Self { self.with_signature(Signature::Inline(signature)) - } + } } impl Invoke for SignaturesBuilder { @@ -162,7 +178,7 @@ impl Invoke for SignaturesBuilder { fn invoke(self, type_ref: u32) -> Self { self.with_signature(Signature::TypeReference(type_ref)) - } + } } impl SignaturesBuilder where F: Invoke { @@ -290,7 +306,7 @@ impl Invoke for FunctionBuilder where F: Invoke Self { self.with_signature(Signature::Inline(signature)) - } + } } impl Invoke for FunctionBuilder where F: Invoke { @@ -298,7 +314,7 @@ impl Invoke for FunctionBuilder where F: Invoke { fn invoke(self, type_ref: u32) -> Self { self.with_signature(Signature::TypeReference(type_ref)) - } + } } impl Invoke for FunctionBuilder where F: Invoke { @@ -344,7 +360,7 @@ mod tests { .param().i32() .return_type().i64() .build() - .bind(); + .bind(); assert_eq!(result.len(), 1); } diff --git a/src/builder/mod.rs b/src/builder/mod.rs index 10b6887..771174c 100644 --- a/src/builder/mod.rs +++ b/src/builder/mod.rs @@ -11,9 +11,12 @@ mod export; mod global; mod data; +pub use self::code::{ + signatures, signature, function, SignatureBuilder, SignaturesBuilder, + FunctionBuilder, TypeRefBuilder +}; pub use self::invoke::Identity; pub use self::module::{module, from_module, ModuleBuilder}; -pub use self::code::{signatures, signature, function, SignatureBuilder, FunctionBuilder}; pub use self::memory::MemoryBuilder; pub use self::import::{import, ImportBuilder}; pub use self::export::{export, ExportBuilder};