code builder doc effort

This commit is contained in:
NikVolf
2018-01-09 12:29:08 +03:00
parent b26da22e89
commit 07e3fc47b3
2 changed files with 32 additions and 13 deletions

View File

@ -2,11 +2,13 @@ use elements;
use super::invoke::{Invoke, Identity}; use super::invoke::{Invoke, Identity};
use super::misc::{ValueTypeBuilder, ValueTypesBuilder, OptionalValueTypeBuilder}; use super::misc::{ValueTypeBuilder, ValueTypesBuilder, OptionalValueTypeBuilder};
/// Signature template description
pub enum Signature { pub enum Signature {
TypeReference(u32), TypeReference(u32),
Inline(elements::FunctionType), Inline(elements::FunctionType),
} }
/// Signature builder
pub struct SignatureBuilder<F=Identity> { pub struct SignatureBuilder<F=Identity> {
callback: F, callback: F,
signature: elements::FunctionType, signature: elements::FunctionType,
@ -19,6 +21,7 @@ impl SignatureBuilder {
} }
impl<F> SignatureBuilder<F> where F: Invoke<elements::FunctionType> { impl<F> SignatureBuilder<F> where F: Invoke<elements::FunctionType> {
/// New builder with callback function specified
pub fn with_callback(callback: F) -> Self { pub fn with_callback(callback: F) -> Self {
SignatureBuilder { SignatureBuilder {
callback: callback, callback: callback,
@ -26,37 +29,45 @@ impl<F> SignatureBuilder<F> where F: Invoke<elements::FunctionType> {
} }
} }
/// Add argument to signature builder
pub fn with_param(mut self, value_type: elements::ValueType) -> Self { pub fn with_param(mut self, value_type: elements::ValueType) -> Self {
self.signature.params_mut().push(value_type); self.signature.params_mut().push(value_type);
self self
} }
/// Add multiple arguments to signature builder
pub fn with_params(mut self, value_types: Vec<elements::ValueType>) -> Self { pub fn with_params(mut self, value_types: Vec<elements::ValueType>) -> Self {
self.signature.params_mut().extend(value_types); self.signature.params_mut().extend(value_types);
self self
} }
/// Override signature return type
pub fn with_return_type(mut self, return_type: Option<elements::ValueType>) -> Self { pub fn with_return_type(mut self, return_type: Option<elements::ValueType>) -> Self {
*self.signature.return_type_mut() = return_type; *self.signature.return_type_mut() = return_type;
self self
} }
/// Start build new argument
pub fn param(self) -> ValueTypeBuilder<Self> { pub fn param(self) -> ValueTypeBuilder<Self> {
ValueTypeBuilder::with_callback(self) ValueTypeBuilder::with_callback(self)
} }
/// Start build multiple arguments
pub fn params(self) -> ValueTypesBuilder<Self> { pub fn params(self) -> ValueTypesBuilder<Self> {
ValueTypesBuilder::with_callback(self) ValueTypesBuilder::with_callback(self)
} }
/// Start building return type
pub fn return_type(self) -> OptionalValueTypeBuilder<Self> { pub fn return_type(self) -> OptionalValueTypeBuilder<Self> {
OptionalValueTypeBuilder::with_callback(self) OptionalValueTypeBuilder::with_callback(self)
} }
/// Finish current builder
pub fn build(self) -> F::Result { pub fn build(self) -> F::Result {
self.callback.invoke(self.signature) self.callback.invoke(self.signature)
} }
/// Finish current builder returning intermediate `Signature` struct
pub fn build_sig(self) -> Signature { pub fn build_sig(self) -> Signature {
Signature::Inline(self.signature) Signature::Inline(self.signature)
} }
@ -92,12 +103,14 @@ impl<F> Invoke<elements::ValueType> for SignatureBuilder<F>
} }
} }
/// Type (signature) reference builder (for function/import/indirect call)
pub struct TypeRefBuilder<F=Identity> { pub struct TypeRefBuilder<F=Identity> {
callback: F, callback: F,
type_ref: u32, type_ref: u32,
} }
impl<F> TypeRefBuilder<F> where F: Invoke<u32> { impl<F> TypeRefBuilder<F> where F: Invoke<u32> {
/// New builder chained with specified callback
pub fn with_callback(callback: F) -> Self { pub fn with_callback(callback: F) -> Self {
TypeRefBuilder { TypeRefBuilder {
callback: callback, callback: callback,
@ -105,14 +118,17 @@ impl<F> TypeRefBuilder<F> where F: Invoke<u32> {
} }
} }
/// Set/override of type reference
pub fn val(mut self, val: u32) -> Self { pub fn val(mut self, val: u32) -> Self {
self.type_ref = val; self.type_ref = val;
self self
} }
/// Finish current builder
pub fn build(self) -> F::Result { self.callback.invoke(self.type_ref) } pub fn build(self) -> F::Result { self.callback.invoke(self.type_ref) }
} }
/// Multiple signatures builder
pub struct SignaturesBuilder<F=Identity> { pub struct SignaturesBuilder<F=Identity> {
callback: F, callback: F,
section: Vec<Signature>, section: Vec<Signature>,

View File

@ -11,9 +11,12 @@ mod export;
mod global; mod global;
mod data; mod data;
pub use self::code::{
signatures, signature, function, SignatureBuilder, SignaturesBuilder,
FunctionBuilder, TypeRefBuilder
};
pub use self::invoke::Identity; pub use self::invoke::Identity;
pub use self::module::{module, from_module, ModuleBuilder}; 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::memory::MemoryBuilder;
pub use self::import::{import, ImportBuilder}; pub use self::import::{import, ImportBuilder};
pub use self::export::{export, ExportBuilder}; pub use self::export::{export, ExportBuilder};