blob: e65799db781f7505bbeb2a1101806f52b3efb7f5 [file] [log] [blame]
use std::prelude::v1::*;
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)
}
}