impl error trait for ResolveError (#179)

This commit is contained in:
Mackenzie Clark 2019-02-14 18:19:18 -08:00 committed by GitHub
parent 5948fa1d20
commit 24d028e2a2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 50 additions and 0 deletions

View File

@ -1,6 +1,7 @@
use crate::types::{ use crate::types::{
FuncSig, GlobalDescriptor, MemoryDescriptor, MemoryIndex, TableDescriptor, TableIndex, Type, FuncSig, GlobalDescriptor, MemoryDescriptor, MemoryIndex, TableDescriptor, TableIndex, Type,
}; };
use core::borrow::Borrow;
use std::sync::Arc; use std::sync::Arc;
pub type Result<T> = std::result::Result<T, Error>; pub type Result<T> = std::result::Result<T, Error>;
@ -135,6 +136,31 @@ impl PartialEq for ResolveError {
} }
} }
impl std::fmt::Display for ResolveError {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
match self {
ResolveError::ExportNotFound { name } => write!(f, "Export not found: {}", name),
ResolveError::ExportWrongType { name } => write!(f, "Export wrong type: {}", name),
ResolveError::Signature { expected, found } => {
let found = found
.as_slice()
.iter()
.map(|p| p.to_string())
.collect::<Vec<_>>()
.join(", ");
let expected: &FuncSig = expected.borrow();
write!(
f,
"Parameters of type [{}] did not match signature {}",
found, expected
)
}
}
}
}
impl std::error::Error for ResolveError {}
/// This error type is produced by calling a wasm function /// This error type is produced by calling a wasm function
/// exported from a module. /// exported from a module.
/// ///

View File

@ -15,6 +15,12 @@ pub enum Type {
F64, F64,
} }
impl std::fmt::Display for Type {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(f, "{:?}", self)
}
}
/// Represents a WebAssembly value. /// Represents a WebAssembly value.
/// ///
/// As the number of types in WebAssembly expand, /// As the number of types in WebAssembly expand,
@ -292,6 +298,24 @@ impl FuncSig {
} }
} }
impl std::fmt::Display for FuncSig {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
let params = self
.params
.iter()
.map(|p| p.to_string())
.collect::<Vec<_>>()
.join(", ");
let returns = self
.returns
.iter()
.map(|p| p.to_string())
.collect::<Vec<_>>()
.join(", ");
write!(f, "[{}] -> [{}]", params, returns)
}
}
pub trait LocalImport { pub trait LocalImport {
type Local: TypedIndex; type Local: TypedIndex;
type Import: TypedIndex; type Import: TypedIndex;