refactor value types gen a bit

This commit is contained in:
NikVolf
2017-04-06 18:23:02 +03:00
parent 29f64f3fec
commit 5aaab83aed
5 changed files with 151 additions and 10 deletions

View File

@ -14,7 +14,7 @@ fn main() {
let module = builder::module() let module = builder::module()
.functions() .functions()
.signature().param(elements::ValueType::I32).build() .signature().with_param(elements::ValueType::I32).build()
.bind() .bind()
.build(); .build();

View File

@ -1,5 +1,6 @@
use super::invoke::{Invoke, Identity};
use elements; use elements;
use super::invoke::{Invoke, Identity};
use super::misc::{ValueTypeBuilder, ValueTypesBuilder, OptionalValueTypeBuilder};
pub enum Signature { pub enum Signature {
TypeReference(u32), TypeReference(u32),
@ -19,22 +20,68 @@ impl<F> SignatureBuilder<F> where F: Invoke<elements::FunctionType> {
} }
} }
pub fn 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
} }
pub fn return_type(mut self, value_type: elements::ValueType) -> Self { pub fn with_params(mut self, value_types: Vec<elements::ValueType>) -> Self {
*self.signature.return_type_mut() = Some(value_type); self.signature.params_mut().extend(value_types);
self self
} }
pub fn with_return_type(mut self, return_type: Option<elements::ValueType>) -> Self {
*self.signature.return_type_mut() = return_type;
self
}
pub fn param(self) -> ValueTypeBuilder<Self> {
ValueTypeBuilder::with_callback(self)
}
pub fn params(self) -> ValueTypesBuilder<Self> {
ValueTypesBuilder::with_callback(self)
}
pub fn return_type(self) -> OptionalValueTypeBuilder<Self> {
OptionalValueTypeBuilder::with_callback(self)
}
pub fn build(self) -> F::Result { pub fn build(self) -> F::Result {
self.callback.invoke(self.signature) self.callback.invoke(self.signature)
} }
} }
impl<F> Invoke<Vec<elements::ValueType>> for SignatureBuilder<F>
where F: Invoke<elements::FunctionType>
{
type Result = Self;
fn invoke(self, args: Vec<elements::ValueType>) -> Self {
self.with_params(args)
}
}
impl<F> Invoke<Option<elements::ValueType>> for SignatureBuilder<F>
where F: Invoke<elements::FunctionType>
{
type Result = Self;
fn invoke(self, arg: Option<elements::ValueType>) -> Self {
self.with_return_type(arg)
}
}
impl<F> Invoke<elements::ValueType> for SignatureBuilder<F>
where F: Invoke<elements::FunctionType>
{
type Result = Self;
fn invoke(self, arg: elements::ValueType) -> Self {
self.with_param(arg)
}
}
pub struct TypeRefBuilder<F=Identity> { pub struct TypeRefBuilder<F=Identity> {
callback: F, callback: F,
type_ref: u32, type_ref: u32,
@ -150,9 +197,9 @@ mod tests {
let result = function() let result = function()
.signature() .signature()
.param(::elements::ValueType::I32) .param().i32()
.param(::elements::ValueType::I32) .param().i32()
.return_type(::elements::ValueType::I64) .return_type().i64()
.build() .build()
.bind(); .bind();

93
src/builder/misc.rs Normal file
View File

@ -0,0 +1,93 @@
use super::invoke::{Invoke, Identity};
use elements;
pub struct ValueTypeBuilder<F=Identity> {
callback: F,
}
impl<F> ValueTypeBuilder<F> where F: Invoke<elements::ValueType> {
pub fn with_callback(callback: F) -> Self {
ValueTypeBuilder { callback: callback }
}
pub fn i32(self) -> F::Result {
self.callback.invoke(elements::ValueType::I32)
}
pub fn i64(self) -> F::Result {
self.callback.invoke(elements::ValueType::I64)
}
pub fn f32(self) -> F::Result {
self.callback.invoke(elements::ValueType::F32)
}
pub fn f64(self) -> F::Result {
self.callback.invoke(elements::ValueType::F64)
}
}
pub struct OptionalValueTypeBuilder<F=Identity> {
callback: F,
}
impl<F> OptionalValueTypeBuilder<F> where F: Invoke<Option<elements::ValueType>> {
pub fn with_callback(callback: F) -> Self {
OptionalValueTypeBuilder { callback: callback }
}
pub fn i32(self) -> F::Result {
self.callback.invoke(Some(elements::ValueType::I32))
}
pub fn i64(self) -> F::Result {
self.callback.invoke(Some(elements::ValueType::I64))
}
pub fn f32(self) -> F::Result {
self.callback.invoke(Some(elements::ValueType::F32))
}
pub fn f64(self) -> F::Result {
self.callback.invoke(Some(elements::ValueType::F64))
}
}
pub struct ValueTypesBuilder<F=Identity> {
callback: F,
value_types: Vec<elements::ValueType>,
}
impl<F> ValueTypesBuilder<F> where F: Invoke<Vec<elements::ValueType>> {
pub fn with_callback(callback: F) -> Self {
ValueTypesBuilder {
callback: callback,
value_types: Vec::new(),
}
}
pub fn i32(mut self) -> Self {
self.value_types.push(elements::ValueType::I32);
self
}
pub fn i64(mut self) -> Self {
self.value_types.push(elements::ValueType::I64);
self
}
pub fn f32(mut self) -> Self {
self.value_types.push(elements::ValueType::F32);
self
}
pub fn f64(mut self) -> Self {
self.value_types.push(elements::ValueType::F64);
self
}
pub fn build(self) -> F::Result {
self.callback.invoke(self.value_types)
}
}

View File

@ -3,6 +3,7 @@
mod invoke; mod invoke;
mod module; mod module;
mod code; mod code;
mod misc;
pub use self::module::{module, ModuleBuilder}; pub use self::module::{module, ModuleBuilder};
pub use self::code::function; pub use self::code::function;

View File

@ -162,7 +162,7 @@ mod tests {
fn functions() { fn functions() {
let module = module() let module = module()
.functions() .functions()
.signature().param(::elements::ValueType::I32).build() .signature().with_param(::elements::ValueType::I32).build()
.bind() .bind()
.build(); .build();