From 9cdef4acf07cd3ceea2a30237998fad65184682c Mon Sep 17 00:00:00 2001 From: Deirdre Connolly Date: Tue, 26 Nov 2019 02:00:53 -0500 Subject: [PATCH] Implement From trait for generic Error impls Also add 'Other' RejectCode variant. --- zebra-network/src/protocol/message.rs | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/zebra-network/src/protocol/message.rs b/zebra-network/src/protocol/message.rs index 4525388be..931acbb2f 100644 --- a/zebra-network/src/protocol/message.rs +++ b/zebra-network/src/protocol/message.rs @@ -1,5 +1,6 @@ //! Definitions of network messages. +use std::error::Error; use std::net; use chrono::{DateTime, Utc}; @@ -7,10 +8,9 @@ use chrono::{DateTime, Utc}; use zebra_chain::block::{Block, BlockHeader, BlockHeaderHash}; use zebra_chain::{transaction::Transaction, types::BlockHeight}; -use crate::meta_addr::MetaAddr; - use super::inv::InventoryHash; use super::types::*; +use crate::meta_addr::MetaAddr; /// A Bitcoin-like network message for the Zcash protocol. /// @@ -308,6 +308,26 @@ pub enum Message { MerkleBlock {/* XXX add fields */}, } +impl From for Message +where + E: Error, +{ + fn from(e: E) -> Self { + Message::Reject { + message: e.to_string(), + + // The generic case, impls for specific error types should + // use specific varieties of `RejectReason`. + ccode: RejectReason::Other, + + reason: e.source().unwrap().to_string(), + + // Allow this to be overriden but not populated by default, methinks. + data: None, + } + } +} + /// Reject Reason CCodes /// /// [Bitcoin reference](https://en.bitcoin.it/wiki/Protocol_documentation#reject) @@ -323,4 +343,5 @@ pub enum RejectReason { Dust = 0x41, InsufficientFee = 0x42, Checkpoint = 0x43, + Other = 0x50, }