From e6a8630b350cd61b41843139faacbcd0cec97321 Mon Sep 17 00:00:00 2001 From: Jack Grigg Date: Wed, 27 Nov 2019 13:12:28 +0000 Subject: [PATCH] impl TryFrom for BranchId --- zcash_primitives/src/consensus.rs | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/zcash_primitives/src/consensus.rs b/zcash_primitives/src/consensus.rs index f7cf480d2..8a7385c7e 100644 --- a/zcash_primitives/src/consensus.rs +++ b/zcash_primitives/src/consensus.rs @@ -1,5 +1,6 @@ //! Consensus parameters. +use std::convert::TryFrom; use std::fmt; /// Zcash consensus parameters. @@ -128,6 +129,21 @@ pub enum BranchId { Heartwood, } +impl TryFrom for BranchId { + type Error = &'static str; + + fn try_from(value: u32) -> Result { + match value { + 0 => Ok(BranchId::Sprout), + 0x5ba8_1b19 => Ok(BranchId::Overwinter), + 0x76b8_09bb => Ok(BranchId::Sapling), + 0x2bb4_0e60 => Ok(BranchId::Blossom), + 0xf5b9_230b => Ok(BranchId::Heartwood), + _ => Err("Unknown consensus branch ID"), + } + } +} + impl From for u32 { fn from(consensus_branch_id: BranchId) -> u32 { match consensus_branch_id { @@ -159,7 +175,9 @@ impl BranchId { #[cfg(test)] mod tests { - use super::{BranchId, Parameters, MainNetwork, NetworkUpgrade, UPGRADES_IN_ORDER}; + use std::convert::TryFrom; + + use super::{BranchId, MainNetwork, NetworkUpgrade, Parameters, UPGRADES_IN_ORDER}; #[test] fn nu_ordering() { @@ -194,6 +212,12 @@ mod tests { )); } + #[test] + fn branch_id_from_u32() { + assert_eq!(BranchId::try_from(0), Ok(BranchId::Sprout)); + assert!(BranchId::try_from(1).is_err()); + } + #[test] fn branch_id_for_height() { assert_eq!(BranchId::for_height::(0), BranchId::Sprout,);