diff --git a/Cargo.toml b/Cargo.toml index 839ef38..219918b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,4 +6,7 @@ edition = "2018" [dev-dependencies] assert_matches = "1.3.0" -quickcheck = "0.8" \ No newline at end of file +quickcheck = "0.8" + +[dependencies] +derive_more = "0.15" \ No newline at end of file diff --git a/src/lib.rs b/src/lib.rs index f6c555b..f7afa46 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -4,6 +4,8 @@ #[cfg(test)] #[macro_use] extern crate assert_matches; #[cfg(test)] #[macro_use] extern crate quickcheck; +extern crate derive_more; + mod tree; @@ -26,19 +28,25 @@ pub struct NodeData { shielded_tx: u64, } -#[derive(Debug)] +#[derive(Debug, derive_more::Display)] pub enum Error { + #[display(fmt="Node/leaf expected to be in memory: {}", _0)] ExpectedInMemory(EntryLink), - ExpectedNode(Option), + #[display(fmt="Node expected")] + ExpectedNode, + #[display(fmt="Node expected, not leaf: {}", _0)] + ExpectedNodeForLink(EntryLink), } /// Reference to to the tree node. #[repr(C)] -#[derive(Clone, Copy, Debug)] +#[derive(Clone, Copy, Debug, derive_more::Display)] pub enum EntryLink { /// Reference to the stored (in the array representation) leaf/node. + #[display(fmt="stored(@{})", _0)] Stored(u32), /// Reference to the generated leaf/node. + #[display(fmt="generated(@{})", _0)] Generated(u32), } @@ -71,14 +79,14 @@ impl Entry { pub fn left(&self) -> Result { match self.kind { - EntryKind::Leaf => { Err(Error::ExpectedNode(None)) } + EntryKind::Leaf => { Err(Error::ExpectedNode) } EntryKind::Node(left, _) => Ok(left) } } pub fn right(&self) -> Result { match self.kind { - EntryKind::Leaf => { Err(Error::ExpectedNode(None)) } + EntryKind::Leaf => { Err(Error::ExpectedNode) } EntryKind::Node(_, right) => Ok(right) } } @@ -93,7 +101,7 @@ impl From for Entry { impl Error { pub (crate) fn augment(self, link: EntryLink) -> Self { match self { - Error::ExpectedNode(None) => Error::ExpectedNode(Some(link)), + Error::ExpectedNode => Error::ExpectedNodeForLink(link), val => val } }