add DIsplay impl for ExecutionError, CryptoError, and NetworkError
This commit is contained in:
parent
5e1229366d
commit
b0452cf309
@ -21,6 +21,7 @@ use util::Bytes;
|
|||||||
use trace::Trace;
|
use trace::Trace;
|
||||||
use types::log_entry::LogEntry;
|
use types::log_entry::LogEntry;
|
||||||
use ipc::binary::BinaryConvertError;
|
use ipc::binary::BinaryConvertError;
|
||||||
|
use std::fmt;
|
||||||
use std::mem;
|
use std::mem;
|
||||||
use std::collections::VecDeque;
|
use std::collections::VecDeque;
|
||||||
|
|
||||||
@ -104,6 +105,39 @@ pub enum ExecutionError {
|
|||||||
TransactionMalformed(String),
|
TransactionMalformed(String),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl fmt::Display for ExecutionError {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||||
|
use self::ExecutionError::*;
|
||||||
|
|
||||||
|
let msg = match *self {
|
||||||
|
NotEnoughBaseGas { required, got } => {
|
||||||
|
format!("Not enough base gas. {} is required, but only {} paid",
|
||||||
|
required, got)
|
||||||
|
}
|
||||||
|
BlockGasLimitReached { gas_limit, gas_used, gas } => {
|
||||||
|
format!("Block gas limit reached. The limit is {}, {} has \
|
||||||
|
already been used, and {} more is required",
|
||||||
|
gas_limit, gas_used, gas)
|
||||||
|
}
|
||||||
|
InvalidNonce { expected, got } => {
|
||||||
|
format!("Invalid transaction nonce: expected {}, found {}",
|
||||||
|
expected, got)
|
||||||
|
}
|
||||||
|
NotEnoughCash { required, got } => {
|
||||||
|
format!("Cost of transaction exceeds sender balance. {} is required \
|
||||||
|
but the sender only has {}", required, got)
|
||||||
|
}
|
||||||
|
Internal => {
|
||||||
|
"Internal evm error".into()
|
||||||
|
}
|
||||||
|
TransactionMalformed(ref err) => {
|
||||||
|
format!("Malformed transaction: {}", err)
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
f.write_fmt(format_args!("Transaction execution error ({}).", msg))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Transaction execution result.
|
/// Transaction execution result.
|
||||||
pub type ExecutionResult = Result<Executed, ExecutionError>;
|
pub type ExecutionResult = Result<Executed, ExecutionError>;
|
||||||
|
@ -21,6 +21,7 @@ use bytes::*;
|
|||||||
use secp256k1::{key, Secp256k1};
|
use secp256k1::{key, Secp256k1};
|
||||||
use rand::os::OsRng;
|
use rand::os::OsRng;
|
||||||
use sha3::Hashable;
|
use sha3::Hashable;
|
||||||
|
use std::fmt;
|
||||||
|
|
||||||
/// Secret key for secp256k1 EC operations. 256 bit generic "hash" data.
|
/// Secret key for secp256k1 EC operations. 256 bit generic "hash" data.
|
||||||
pub type Secret = H256;
|
pub type Secret = H256;
|
||||||
@ -69,6 +70,20 @@ pub enum CryptoError {
|
|||||||
Io(::std::io::Error),
|
Io(::std::io::Error),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl fmt::Display for CryptoError {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||||
|
let msg = match *self {
|
||||||
|
CryptoError::InvalidSecret => "Invalid secret key".into(),
|
||||||
|
CryptoError::InvalidPublic => "Invalid public key".into(),
|
||||||
|
CryptoError::InvalidSignature => "Invalid EC signature".into(),
|
||||||
|
CryptoError::InvalidMessage => "Invalid AES message".into(),
|
||||||
|
CryptoError::Io(ref err) => format!("I/O error: {}", err),
|
||||||
|
};
|
||||||
|
|
||||||
|
f.write_fmt(format_args!("Crypto error ({})", msg))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl From<::secp256k1::Error> for CryptoError {
|
impl From<::secp256k1::Error> for CryptoError {
|
||||||
fn from(e: ::secp256k1::Error) -> CryptoError {
|
fn from(e: ::secp256k1::Error) -> CryptoError {
|
||||||
match e {
|
match e {
|
||||||
|
@ -56,6 +56,7 @@ mod service;
|
|||||||
mod worker;
|
mod worker;
|
||||||
|
|
||||||
use mio::{EventLoop, Token};
|
use mio::{EventLoop, Token};
|
||||||
|
use std::fmt;
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
/// IO Error
|
/// IO Error
|
||||||
@ -64,6 +65,16 @@ pub enum IoError {
|
|||||||
Mio(::std::io::Error),
|
Mio(::std::io::Error),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl fmt::Display for IoError {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||||
|
// just defer to the std implementation for now.
|
||||||
|
// we can refine the formatting when more variants are added.
|
||||||
|
match *self {
|
||||||
|
IoError::Mio(ref std_err) => std_err.fmt(f)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<Message> From<::mio::NotifyError<service::IoMessage<Message>>> for IoError where Message: Send + Clone {
|
impl<Message> From<::mio::NotifyError<service::IoMessage<Message>>> for IoError where Message: Send + Clone {
|
||||||
fn from(_err: ::mio::NotifyError<service::IoMessage<Message>>) -> IoError {
|
fn from(_err: ::mio::NotifyError<service::IoMessage<Message>>) -> IoError {
|
||||||
IoError::Mio(::std::io::Error::new(::std::io::ErrorKind::ConnectionAborted, "Network IO notification error"))
|
IoError::Mio(::std::io::Error::new(::std::io::ErrorKind::ConnectionAborted, "Network IO notification error"))
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
use io::IoError;
|
use io::IoError;
|
||||||
use crypto::CryptoError;
|
use crypto::CryptoError;
|
||||||
use rlp::*;
|
use rlp::*;
|
||||||
|
use std::fmt;
|
||||||
|
|
||||||
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
|
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
|
||||||
pub enum DisconnectReason
|
pub enum DisconnectReason
|
||||||
@ -56,6 +57,30 @@ impl DisconnectReason {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl fmt::Display for DisconnectReason {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||||
|
use self::DisconnectReason::*;
|
||||||
|
|
||||||
|
let msg = match *self {
|
||||||
|
DisconnectRequested => "disconnect requested",
|
||||||
|
TCPError => "TCP error",
|
||||||
|
BadProtocol => "bad protocol",
|
||||||
|
UselessPeer => "useless peer",
|
||||||
|
TooManyPeers => "too many peers",
|
||||||
|
DuplicatePeer => "duplicate peer",
|
||||||
|
IncompatibleProtocol => "incompatible protocol",
|
||||||
|
NullIdentity => "null identity",
|
||||||
|
ClientQuit => "client quit",
|
||||||
|
UnexpectedIdentity => "unexpected identity",
|
||||||
|
LocalIdentity => "local identity",
|
||||||
|
PingTimeout => "ping timeout",
|
||||||
|
Unknown => "unknown",
|
||||||
|
};
|
||||||
|
|
||||||
|
f.write_str(msg)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
/// Network error.
|
/// Network error.
|
||||||
pub enum NetworkError {
|
pub enum NetworkError {
|
||||||
@ -73,6 +98,23 @@ pub enum NetworkError {
|
|||||||
Io(IoError),
|
Io(IoError),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl fmt::Display for NetworkError {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||||
|
use self::NetworkError::*;
|
||||||
|
|
||||||
|
let msg = match *self {
|
||||||
|
Auth => "Authentication failure".into(),
|
||||||
|
BadProtocol => "Bad protocol".into(),
|
||||||
|
Expired => "Expired message".into(),
|
||||||
|
PeerNotFound => "Peer not found".into(),
|
||||||
|
Disconnect(ref reason) => format!("Peer disconnected: {}", reason),
|
||||||
|
Io(ref err) => format!("Socket I/O error: {}", err),
|
||||||
|
};
|
||||||
|
|
||||||
|
f.write_fmt(format_args!("Network error ({})", msg))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl From<DecoderError> for NetworkError {
|
impl From<DecoderError> for NetworkError {
|
||||||
fn from(_err: DecoderError) -> NetworkError {
|
fn from(_err: DecoderError) -> NetworkError {
|
||||||
NetworkError::Auth
|
NetworkError::Auth
|
||||||
|
Loading…
Reference in New Issue
Block a user