use crate::{pwasm::PwasmCompat, ValueType};
use alloc::borrow::Cow;
use casper_wasm::elements::{FunctionType, GlobalType, MemoryType, TableType};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Signature {
params: Cow<'static, [ValueType]>,
return_type: Option<ValueType>,
}
impl Signature {
pub fn new<C: Into<Cow<'static, [ValueType]>>>(
params: C,
return_type: Option<ValueType>,
) -> Signature {
Signature {
params: params.into(),
return_type,
}
}
pub fn params(&self) -> &[ValueType] {
self.params.as_ref()
}
pub fn return_type(&self) -> Option<ValueType> {
self.return_type
}
pub(crate) fn from_elements(func_type: &FunctionType) -> Signature {
Signature {
params: func_type
.params()
.iter()
.cloned()
.map(ValueType::from_elements)
.collect(),
return_type: func_type
.results()
.first()
.map(|vty| ValueType::from_elements(*vty)),
}
}
}
pub struct GlobalDescriptor {
value_type: ValueType,
mutable: bool,
}
impl GlobalDescriptor {
pub(crate) fn from_elements(global_type: &GlobalType) -> GlobalDescriptor {
GlobalDescriptor {
value_type: ValueType::from_elements(global_type.content_type()),
mutable: global_type.is_mutable(),
}
}
pub fn value_type(&self) -> ValueType {
self.value_type
}
pub fn is_mutable(&self) -> bool {
self.mutable
}
}
pub struct TableDescriptor {
initial: u32,
maximum: Option<u32>,
}
impl TableDescriptor {
pub(crate) fn from_elements(table_type: &TableType) -> TableDescriptor {
TableDescriptor {
initial: table_type.limits().initial(),
maximum: table_type.limits().maximum(),
}
}
pub fn initial(&self) -> u32 {
self.initial
}
pub fn maximum(&self) -> Option<u32> {
self.maximum
}
}
pub struct MemoryDescriptor {
initial: u32,
maximum: Option<u32>,
}
impl MemoryDescriptor {
pub(crate) fn from_elements(memory_type: &MemoryType) -> MemoryDescriptor {
MemoryDescriptor {
initial: memory_type.limits().initial(),
maximum: memory_type.limits().maximum(),
}
}
pub fn initial(&self) -> u32 {
self.initial
}
pub fn maximum(&self) -> Option<u32> {
self.maximum
}
}