Skip to content

Commit 7903b19

Browse files
committed
Implement TryFrom<TaprootBuilder> for TapTree
TryFrom` became available in Rust 1.34 so we can use it now we have bumped our MSRV. Implement `TryFrom<TaprootBuilder>` for `TapTree` and deprecate the `from_builder` method.
1 parent ad3e035 commit 7903b19

File tree

2 files changed

+27
-9
lines changed

2 files changed

+27
-9
lines changed

src/util/psbt/map/output.rs

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
use crate::prelude::*;
1616
use core;
17+
use core::convert::TryFrom;
1718

1819
use crate::io;
1920

@@ -158,16 +159,12 @@ impl TapTree {
158159
/// # Returns
159160
/// A [`TapTree`] iff the `builder` is complete, otherwise return [`IncompleteTapTree`]
160161
/// error with the content of incomplete `builder` instance.
162+
#[deprecated(since = "0.29.0", note = "use try_from instead")]
161163
pub fn from_builder(builder: TaprootBuilder) -> Result<Self, IncompleteTapTree> {
162-
if !builder.is_finalized() {
163-
Err(IncompleteTapTree::NotFinalized(builder))
164-
} else if builder.has_hidden_nodes() {
165-
Err(IncompleteTapTree::HiddenParts(builder))
166-
} else {
167-
Ok(TapTree(builder))
168-
}
164+
Self::try_from(builder)
169165
}
170166

167+
171168
/// Converts self into builder [`TaprootBuilder`]. The builder is guaranteed to be finalized.
172169
pub fn into_builder(self) -> TaprootBuilder {
173170
self.0
@@ -194,6 +191,25 @@ impl TapTree {
194191
}
195192
}
196193

194+
impl TryFrom<TaprootBuilder> for TapTree {
195+
type Error = IncompleteTapTree;
196+
197+
/// Constructs [`TapTree`] from a [`TaprootBuilder`] if it is complete binary tree.
198+
///
199+
/// # Returns
200+
/// A [`TapTree`] iff the `builder` is complete, otherwise return [`IncompleteTapTree`]
201+
/// error with the content of incomplete `builder` instance.
202+
fn try_from(builder: TaprootBuilder) -> Result<Self, Self::Error> {
203+
if !builder.is_finalized() {
204+
Err(IncompleteTapTree::NotFinalized(builder))
205+
} else if builder.has_hidden_nodes() {
206+
Err(IncompleteTapTree::HiddenParts(builder))
207+
} else {
208+
Ok(TapTree(builder))
209+
}
210+
}
211+
}
212+
197213
/// Iterator for a taproot script tree, operating in DFS order over leaf depth and
198214
/// leaf script pairs.
199215
pub struct TapTreeIter<'tree> {

src/util/psbt/serialize.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,8 @@ fn key_source_len(key_source: &KeySource) -> usize {
370370

371371
#[cfg(test)]
372372
mod tests {
373+
use core::convert::TryFrom;
374+
373375
use crate::hashes::hex::FromHex;
374376
use super::*;
375377

@@ -393,14 +395,14 @@ mod tests {
393395
let mut builder = compose_taproot_builder(0x51, &[2, 2, 2]);
394396
builder = builder.add_leaf_with_ver(3, Script::from_hex("b9").unwrap(), LeafVersion::from_consensus(0xC2).unwrap()).unwrap();
395397
builder = builder.add_hidden_node(3, sha256::Hash::default()).unwrap();
396-
assert!(TapTree::from_builder(builder).is_err());
398+
assert!(TapTree::try_from(builder).is_err());
397399
}
398400

399401
#[test]
400402
fn taptree_roundtrip() {
401403
let mut builder = compose_taproot_builder(0x51, &[2, 2, 2, 3]);
402404
builder = builder.add_leaf_with_ver(3, Script::from_hex("b9").unwrap(), LeafVersion::from_consensus(0xC2).unwrap()).unwrap();
403-
let tree = TapTree::from_builder(builder).unwrap();
405+
let tree = TapTree::try_from(builder).unwrap();
404406
let tree_prime = TapTree::deserialize(&tree.serialize()).unwrap();
405407
assert_eq!(tree, tree_prime);
406408
}

0 commit comments

Comments
 (0)