use codec::{Encode, Decode};
use tetcore_std::vec::Vec;
#[derive(Encode, Decode)]
#[derive(crate::RuntimeDebug)]
pub struct HostError;
#[derive(Clone, PartialEq, Eq, Encode, Decode)]
#[derive(crate::RuntimeDebug)]
pub enum ExternEntity {
#[codec(index = 1)]
Function(u32),
#[codec(index = 2)]
Memory(u32),
}
#[derive(Clone, PartialEq, Eq, Encode, Decode)]
#[derive(crate::RuntimeDebug)]
pub struct Entry {
pub module_name: Vec<u8>,
pub field_name: Vec<u8>,
pub entity: ExternEntity,
}
#[derive(Clone, PartialEq, Eq, Encode, Decode)]
#[derive(crate::RuntimeDebug)]
pub struct EnvironmentDefinition {
pub entries: Vec<Entry>,
}
pub const MEM_UNLIMITED: u32 = -1i32 as u32;
pub const ERR_OK: u32 = 0;
pub const ERR_MODULE: u32 = -1i32 as u32;
pub const ERR_OUT_OF_BOUNDS: u32 = -2i32 as u32;
pub const ERR_EXECUTION: u32 = -3i32 as u32;
#[cfg(test)]
mod tests {
use super::*;
use std::fmt;
use codec::Codec;
fn roundtrip<S: Codec + PartialEq + fmt::Debug>(s: S) {
let encoded = s.encode();
assert_eq!(S::decode(&mut &encoded[..]).unwrap(), s);
}
#[test]
fn env_def_roundtrip() {
roundtrip(EnvironmentDefinition {
entries: vec![],
});
roundtrip(EnvironmentDefinition {
entries: vec![
Entry {
module_name: b"kernel"[..].into(),
field_name: b"memory"[..].into(),
entity: ExternEntity::Memory(1337),
},
],
});
roundtrip(EnvironmentDefinition {
entries: vec![
Entry {
module_name: b"env"[..].into(),
field_name: b"abort"[..].into(),
entity: ExternEntity::Function(228),
},
],
});
}
}