diff --git a/src/lib.rs b/src/lib.rs index a35357a..feef2e2 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -22,8 +22,8 @@ use log::debug; // type Error = String; -pub trait Message: std::fmt::Debug { - fn from_values(array: Vec) -> Self; +pub trait Message: std::fmt::Debug + Sized { + fn from_values(array: Vec) -> Result; fn to_values(&self) -> Vec; fn info(&self) -> String; @@ -78,7 +78,7 @@ pub trait Protocol { while let Some(chunk) = d.next() { match chunk { Ok(values) => { - let message = Self::Message::from_values(values); + let message = Self::Message::from_values(values).unwrap(); let info = message.info(); self.recv(message).unwrap(); debug!("Rx: message {}", info); diff --git a/src/protocols/blockfetch.rs b/src/protocols/blockfetch.rs index d8aa978..79d83f8 100644 --- a/src/protocols/blockfetch.rs +++ b/src/protocols/blockfetch.rs @@ -24,16 +24,16 @@ pub enum Message { } impl MessageOps for Message { - fn from_values(array: Vec) -> Self { + fn from_values(array: Vec) -> Result { let mut values = array.iter(); //debug!("Parsing message: {:?}", values); - let message = match values.next().unwrap() { + let message = match values.next().ok_or("Unexpected end of message.".to_string())? { //Value::Integer(0) => Message::RequestRange(), Value::Integer(1) => Message::ClientDone, Value::Integer(2) => Message::StartBatch, Value::Integer(3) => Message::NoBlocks, Value::Integer(4) => { - match values.next().unwrap() { + match values.next().ok_or("Unexpected End of message.".to_string())? { Value::Bytes(bytes) => { Message::Block(bytes.to_vec()) } @@ -44,9 +44,9 @@ impl MessageOps for Message { _ => panic!() }; match values.next() { - Some(Value::Null) => message, - Some(data) => panic!("data={:?}", data), - None => message, + Some(Value::Null) => Ok(message), + Some(data) => Err(format!("data={:?}", data)), + None => Ok(message), } } diff --git a/src/protocols/chainsync.rs b/src/protocols/chainsync.rs index 88872f3..355f332 100644 --- a/src/protocols/chainsync.rs +++ b/src/protocols/chainsync.rs @@ -40,8 +40,8 @@ pub enum Message { } impl MessageOps for Message { - fn from_values(values: Vec) -> Self { - Message::Array(values) + fn from_values(values: Vec) -> Result { + Ok(Message::Array(values)) } fn to_values(&self) -> Vec { diff --git a/src/protocols/handshake.rs b/src/protocols/handshake.rs index f1bc075..bf28e08 100644 --- a/src/protocols/handshake.rs +++ b/src/protocols/handshake.rs @@ -53,8 +53,8 @@ pub enum Message { } impl MessageOps for Message { - fn from_values(values: Vec) -> Self { - Message::Array(values) + fn from_values(values: Vec) -> Result { + Ok(Message::Array(values)) } fn to_values(&self) -> Vec { diff --git a/src/protocols/transaction.rs b/src/protocols/transaction.rs index 313c8ab..88f9814 100644 --- a/src/protocols/transaction.rs +++ b/src/protocols/transaction.rs @@ -31,8 +31,8 @@ pub enum Message { } impl MessageOps for Message { - fn from_values(values: Vec) -> Self { - Message::Array(values) + fn from_values(values: Vec) -> Result { + Ok(Message::Array(values)) } fn to_values(&self) -> Vec {