derive display for errors

This commit is contained in:
NikVolf 2019-09-03 12:52:50 +03:00
parent 615c4f662e
commit 771aa867c1
2 changed files with 18 additions and 7 deletions

View File

@ -6,4 +6,7 @@ edition = "2018"
[dev-dependencies] [dev-dependencies]
assert_matches = "1.3.0" assert_matches = "1.3.0"
quickcheck = "0.8" quickcheck = "0.8"
[dependencies]
derive_more = "0.15"

View File

@ -4,6 +4,8 @@
#[cfg(test)] #[macro_use] extern crate assert_matches; #[cfg(test)] #[macro_use] extern crate assert_matches;
#[cfg(test)] #[macro_use] extern crate quickcheck; #[cfg(test)] #[macro_use] extern crate quickcheck;
extern crate derive_more;
mod tree; mod tree;
@ -26,19 +28,25 @@ pub struct NodeData {
shielded_tx: u64, shielded_tx: u64,
} }
#[derive(Debug)] #[derive(Debug, derive_more::Display)]
pub enum Error { pub enum Error {
#[display(fmt="Node/leaf expected to be in memory: {}", _0)]
ExpectedInMemory(EntryLink), ExpectedInMemory(EntryLink),
ExpectedNode(Option<EntryLink>), #[display(fmt="Node expected")]
ExpectedNode,
#[display(fmt="Node expected, not leaf: {}", _0)]
ExpectedNodeForLink(EntryLink),
} }
/// Reference to to the tree node. /// Reference to to the tree node.
#[repr(C)] #[repr(C)]
#[derive(Clone, Copy, Debug)] #[derive(Clone, Copy, Debug, derive_more::Display)]
pub enum EntryLink { pub enum EntryLink {
/// Reference to the stored (in the array representation) leaf/node. /// Reference to the stored (in the array representation) leaf/node.
#[display(fmt="stored(@{})", _0)]
Stored(u32), Stored(u32),
/// Reference to the generated leaf/node. /// Reference to the generated leaf/node.
#[display(fmt="generated(@{})", _0)]
Generated(u32), Generated(u32),
} }
@ -71,14 +79,14 @@ impl Entry {
pub fn left(&self) -> Result<EntryLink, Error> { pub fn left(&self) -> Result<EntryLink, Error> {
match self.kind { match self.kind {
EntryKind::Leaf => { Err(Error::ExpectedNode(None)) } EntryKind::Leaf => { Err(Error::ExpectedNode) }
EntryKind::Node(left, _) => Ok(left) EntryKind::Node(left, _) => Ok(left)
} }
} }
pub fn right(&self) -> Result<EntryLink, Error> { pub fn right(&self) -> Result<EntryLink, Error> {
match self.kind { match self.kind {
EntryKind::Leaf => { Err(Error::ExpectedNode(None)) } EntryKind::Leaf => { Err(Error::ExpectedNode) }
EntryKind::Node(_, right) => Ok(right) EntryKind::Node(_, right) => Ok(right)
} }
} }
@ -93,7 +101,7 @@ impl From<NodeData> for Entry {
impl Error { impl Error {
pub (crate) fn augment(self, link: EntryLink) -> Self { pub (crate) fn augment(self, link: EntryLink) -> Self {
match self { match self {
Error::ExpectedNode(None) => Error::ExpectedNode(Some(link)), Error::ExpectedNode => Error::ExpectedNodeForLink(link),
val => val val => val
} }
} }