]> Untitled Git - bdk/commitdiff
[wallet] Replace ChangeSpendPolicy::filter_utxos with a predicate
authorLLFourn <lloyd.fourn@gmail.com>
Wed, 21 Oct 2020 04:53:00 +0000 (15:53 +1100)
committerLLFourn <lloyd.fourn@gmail.com>
Fri, 23 Oct 2020 02:54:59 +0000 (13:54 +1100)
To make composing it with other filtering conditions easier.

src/wallet/mod.rs
src/wallet/tx_builder.rs

index ef36a5559f6d494b08a2f0e2409b00dcddea520b..ba4100e3d15b978c64ba464403fb241220caadfb 100644 (file)
@@ -1015,16 +1015,11 @@ where
             }
             // otherwise limit ourselves to the spendable utxos for the selected policy, and the `send_all` setting
             None => {
-                let utxos = self.list_unspent()?.into_iter();
-                let utxos = change_policy.filter_utxos(utxos).into_iter();
-
-                Ok((
-                    utxos
-                        .filter(|u| !unspendable_set.contains(&u.outpoint))
-                        .map(add_weight)
-                        .collect(),
-                    send_all,
-                ))
+                let utxos = self.list_unspent()?.into_iter().filter(|u| {
+                    change_policy.is_satisfied_by(u) && !unspendable_set.contains(&u.outpoint)
+                });
+
+                Ok((utxos.map(add_weight).collect(), send_all))
             }
         }
     }
index aca6fc6f69c6b5c4b38512d2a368a5d53225bf1f..65171c3e3031bfa012b0d5c6308c0431f40a78d3 100644 (file)
@@ -397,11 +397,11 @@ impl Default for ChangeSpendPolicy {
 }
 
 impl ChangeSpendPolicy {
-    pub(crate) fn filter_utxos<I: Iterator<Item = UTXO>>(&self, iter: I) -> Vec<UTXO> {
+    pub(crate) fn is_satisfied_by(&self, utxo: &UTXO) -> bool {
         match self {
-            ChangeSpendPolicy::ChangeAllowed => iter.collect(),
-            ChangeSpendPolicy::OnlyChange => iter.filter(|utxo| utxo.is_internal).collect(),
-            ChangeSpendPolicy::ChangeForbidden => iter.filter(|utxo| !utxo.is_internal).collect(),
+            ChangeSpendPolicy::ChangeAllowed => true,
+            ChangeSpendPolicy::OnlyChange => utxo.is_internal,
+            ChangeSpendPolicy::ChangeForbidden => !utxo.is_internal,
         }
     }
 }
@@ -512,7 +512,10 @@ mod test {
     #[test]
     fn test_change_spend_policy_default() {
         let change_spend_policy = ChangeSpendPolicy::default();
-        let filtered = change_spend_policy.filter_utxos(get_test_utxos().into_iter());
+        let filtered = get_test_utxos()
+            .into_iter()
+            .filter(|u| change_spend_policy.is_satisfied_by(u))
+            .collect::<Vec<_>>();
 
         assert_eq!(filtered.len(), 2);
     }
@@ -520,7 +523,10 @@ mod test {
     #[test]
     fn test_change_spend_policy_no_internal() {
         let change_spend_policy = ChangeSpendPolicy::ChangeForbidden;
-        let filtered = change_spend_policy.filter_utxos(get_test_utxos().into_iter());
+        let filtered = get_test_utxos()
+            .into_iter()
+            .filter(|u| change_spend_policy.is_satisfied_by(u))
+            .collect::<Vec<_>>();
 
         assert_eq!(filtered.len(), 1);
         assert_eq!(filtered[0].is_internal, false);
@@ -529,7 +535,10 @@ mod test {
     #[test]
     fn test_change_spend_policy_only_internal() {
         let change_spend_policy = ChangeSpendPolicy::OnlyChange;
-        let filtered = change_spend_policy.filter_utxos(get_test_utxos().into_iter());
+        let filtered = get_test_utxos()
+            .into_iter()
+            .filter(|u| change_spend_policy.is_satisfied_by(u))
+            .collect::<Vec<_>>();
 
         assert_eq!(filtered.len(), 1);
         assert_eq!(filtered[0].is_internal, true);