]> Untitled Git - bdk/commitdiff
fix(wallet): Change FromSql type to `Option<_>`
authorvalued mammal <valuedmammal@protonmail.com>
Tue, 6 Aug 2024 18:52:14 +0000 (14:52 -0400)
committervalued mammal <valuedmammal@protonmail.com>
Tue, 13 Aug 2024 21:07:58 +0000 (17:07 -0400)
when selecting a wallet row from sqlite. This is consistent with
the structure of the wallet `ChangeSet` where the fields
`descriptor`, `change_descriptor`, and `network` are all optional.

crates/chain/src/lib.rs
crates/wallet/src/wallet/changeset.rs

index 67e2aea15aa758147a9c3d6ac57c67ff020d6299..a756ab11c0ba93d04d52a105e9f6b9b3f07b3a4c 100644 (file)
@@ -113,6 +113,13 @@ pub type KeychainIndexed<K, T> = ((K, u32), T);
 /// A wrapper that we use to impl remote traits for types in our crate or dependency crates.
 pub struct Impl<T>(pub T);
 
+impl<T> Impl<T> {
+    /// Returns the inner `T`.
+    pub fn into_inner(self) -> T {
+        self.0
+    }
+}
+
 impl<T> From<T> for Impl<T> {
     fn from(value: T) -> Self {
         Self(value)
index 46b2f4321dd6ab22565c2fae00a1e43bf86dd7bf..5f3b9b3dc1c877d99432617ea06c4176c3279f9f 100644 (file)
@@ -103,16 +103,18 @@ impl ChangeSet {
         let row = wallet_statement
             .query_row([], |row| {
                 Ok((
-                    row.get::<_, Impl<Descriptor<DescriptorPublicKey>>>("descriptor")?,
-                    row.get::<_, Impl<Descriptor<DescriptorPublicKey>>>("change_descriptor")?,
-                    row.get::<_, Impl<bitcoin::Network>>("network")?,
+                    row.get::<_, Option<Impl<Descriptor<DescriptorPublicKey>>>>("descriptor")?,
+                    row.get::<_, Option<Impl<Descriptor<DescriptorPublicKey>>>>(
+                        "change_descriptor",
+                    )?,
+                    row.get::<_, Option<Impl<bitcoin::Network>>>("network")?,
                 ))
             })
             .optional()?;
-        if let Some((Impl(desc), Impl(change_desc), Impl(network))) = row {
-            changeset.descriptor = Some(desc);
-            changeset.change_descriptor = Some(change_desc);
-            changeset.network = Some(network);
+        if let Some((desc, change_desc, network)) = row {
+            changeset.descriptor = desc.map(Impl::into_inner);
+            changeset.change_descriptor = change_desc.map(Impl::into_inner);
+            changeset.network = network.map(Impl::into_inner);
         }
 
         changeset.local_chain = local_chain::ChangeSet::from_sqlite(db_tx)?;