202 lines
5.7 KiB
Rust
Raw Normal View History

2017-03-29 23:13:54 +03:00
use std::io;
2017-04-03 22:58:00 +03:00
use super::{
Deserialize, Serialize, Error, VarUint7, VarInt7, VarUint1, CountedList,
CountedListWriter
};
2017-03-29 23:13:54 +03:00
2017-04-04 03:03:57 +03:00
/// Type definition in types section. Currently can be only of the function type.
2017-05-02 08:37:48 +03:00
#[derive(Debug, PartialEq)]
2017-03-29 23:13:54 +03:00
pub enum Type {
2017-04-04 03:03:57 +03:00
/// Function type.
2017-03-29 23:13:54 +03:00
Function(FunctionType),
}
impl Deserialize for Type {
type Error = Error;
fn deserialize<R: io::Read>(reader: &mut R) -> Result<Self, Self::Error> {
Ok(Type::Function(FunctionType::deserialize(reader)?))
}
}
2017-04-03 22:58:00 +03:00
impl Serialize for Type {
type Error = Error;
fn serialize<W: io::Write>(self, writer: &mut W) -> Result<(), Self::Error> {
match self {
Type::Function(fn_type) => fn_type.serialize(writer)
}
}
}
2017-04-04 03:03:57 +03:00
/// Value type.
2017-03-30 23:49:26 +03:00
#[derive(Clone, Copy, PartialEq, Debug)]
2017-03-29 23:13:54 +03:00
pub enum ValueType {
2017-04-04 03:03:57 +03:00
/// 32-bit signed integer
2017-03-29 23:13:54 +03:00
I32,
2017-04-04 03:03:57 +03:00
/// 64-bit signed integer
2017-03-29 23:13:54 +03:00
I64,
2017-04-04 03:03:57 +03:00
/// 32-bit float
2017-03-29 23:13:54 +03:00
F32,
2017-04-04 03:03:57 +03:00
/// 64-bit float
2017-03-29 23:13:54 +03:00
F64,
}
impl Deserialize for ValueType {
type Error = Error;
fn deserialize<R: io::Read>(reader: &mut R) -> Result<Self, Self::Error> {
let val = VarInt7::deserialize(reader)?;
match val.into() {
-0x01 => Ok(ValueType::I32),
-0x02 => Ok(ValueType::I64),
-0x03 => Ok(ValueType::F32),
-0x04 => Ok(ValueType::F64),
_ => Err(Error::UnknownValueType(val.into())),
}
}
}
2017-04-03 19:51:18 +03:00
impl Serialize for ValueType {
type Error = Error;
fn serialize<W: io::Write>(self, writer: &mut W) -> Result<(), Self::Error> {
let val: VarInt7 = match self {
ValueType::I32 => -0x01,
ValueType::I64 => -0x02,
ValueType::F32 => -0x03,
ValueType::F64 => -0x04,
}.into();
val.serialize(writer)?;
Ok(())
}
}
2017-04-04 03:03:57 +03:00
/// Block type which is basically `ValueType` + NoResult (to define blocks that have no return type)
2017-03-31 03:28:03 +03:00
#[derive(Clone, Copy, PartialEq, Debug)]
pub enum BlockType {
2017-04-04 03:03:57 +03:00
/// Value-type specified block type
2017-03-31 03:28:03 +03:00
Value(ValueType),
2017-04-04 03:03:57 +03:00
/// No specified block type
2017-03-31 03:28:03 +03:00
NoResult,
}
impl Deserialize for BlockType {
type Error = Error;
fn deserialize<R: io::Read>(reader: &mut R) -> Result<Self, Self::Error> {
let val = VarInt7::deserialize(reader)?;
match val.into() {
-0x01 => Ok(BlockType::Value(ValueType::I32)),
-0x02 => Ok(BlockType::Value(ValueType::I64)),
-0x03 => Ok(BlockType::Value(ValueType::F32)),
-0x04 => Ok(BlockType::Value(ValueType::F64)),
-0x40 => Ok(BlockType::NoResult),
_ => Err(Error::UnknownValueType(val.into())),
}
}
}
2017-04-03 17:31:51 +03:00
impl Serialize for BlockType {
type Error = Error;
fn serialize<W: io::Write>(self, writer: &mut W) -> Result<(), Self::Error> {
let val: VarInt7 = match self {
BlockType::NoResult => -0x40i8,
BlockType::Value(ValueType::I32) => -0x01,
BlockType::Value(ValueType::I64) => -0x02,
BlockType::Value(ValueType::F32) => -0x03,
BlockType::Value(ValueType::F64) => -0x04,
}.into();
val.serialize(writer)?;
Ok(())
}
}
2017-04-04 03:03:57 +03:00
/// Function signature type.
2017-05-02 08:37:48 +03:00
#[derive(Debug, PartialEq)]
2017-03-29 23:13:54 +03:00
pub struct FunctionType {
form: u8,
params: Vec<ValueType>,
return_type: Option<ValueType>,
}
2017-04-06 11:34:31 +03:00
impl Default for FunctionType {
fn default() -> Self {
FunctionType {
form: 0x60,
params: Vec::new(),
return_type: None,
}
}
}
2017-03-30 20:55:25 +03:00
impl FunctionType {
2017-04-06 16:00:12 +03:00
/// New function type given the signature in-params(`params`) and return type (`return_type`)
pub fn new(params: Vec<ValueType>, return_type: Option<ValueType>) -> Self {
FunctionType {
params: params,
return_type: return_type,
..Default::default()
}
}
2017-04-04 03:03:57 +03:00
/// Function form (currently only valid value is `0x60`)
2017-03-30 20:55:25 +03:00
pub fn form(&self) -> u8 { self.form }
2017-04-04 03:03:57 +03:00
/// Parameters in the function signature.
2017-03-30 20:55:25 +03:00
pub fn params(&self) -> &[ValueType] { &self.params }
2017-04-06 11:34:31 +03:00
/// Mutable parameters in the function signature.
pub fn params_mut(&mut self) -> &mut Vec<ValueType> { &mut self.params }
2017-04-04 03:03:57 +03:00
/// Return type in the function signature, if any.
2017-03-30 20:55:25 +03:00
pub fn return_type(&self) -> Option<ValueType> { self.return_type }
2017-04-06 11:34:31 +03:00
/// Mutable type in the function signature, if any.
pub fn return_type_mut(&mut self) -> &mut Option<ValueType> { &mut self.return_type }
2017-03-30 20:55:25 +03:00
}
2017-03-29 23:13:54 +03:00
impl Deserialize for FunctionType {
type Error = Error;
fn deserialize<R: io::Read>(reader: &mut R) -> Result<Self, Self::Error> {
let form: u8 = VarUint7::deserialize(reader)?.into();
2017-03-30 20:55:25 +03:00
let params: Vec<ValueType> = CountedList::deserialize(reader)?.into_inner();
2017-03-29 23:13:54 +03:00
let has_return_type = VarUint1::deserialize(reader)?;
let return_type = if has_return_type.into() {
Some(ValueType::deserialize(reader)?)
} else {
None
};
Ok(FunctionType {
form: form,
params: params,
return_type: return_type,
})
}
}
2017-04-03 22:58:00 +03:00
impl Serialize for FunctionType {
type Error = Error;
fn serialize<W: io::Write>(self, writer: &mut W) -> Result<(), Self::Error> {
VarUint7::from(self.form).serialize(writer)?;
let data = self.params;
let counted_list = CountedListWriter::<ValueType, _>(
data.len(),
data.into_iter().map(Into::into),
);
counted_list.serialize(writer)?;
if let Some(return_type) = self.return_type {
VarUint1::from(true).serialize(writer)?;
return_type.serialize(writer)?;
} else {
VarUint1::from(false).serialize(writer)?;
}
Ok(())
}
}