]> Untitled Git - bdk/commitdiff
Add more `impl`s for `Append` and docs for file store `magic`
author志宇 <hello@evanlinjin.me>
Wed, 10 May 2023 06:48:26 +0000 (14:48 +0800)
committer志宇 <hello@evanlinjin.me>
Wed, 10 May 2023 07:07:19 +0000 (15:07 +0800)
crates/chain/src/tx_data_traits.rs
crates/file_store/src/store.rs

index bd7f138f07293678cf8fb64d389fa2a12148210c..b130793b3021e8ef4692513ac215c8be24cbe50b 100644 (file)
@@ -1,6 +1,7 @@
 use crate::collections::BTreeMap;
 use crate::collections::BTreeSet;
 use crate::BlockId;
+use alloc::vec::Vec;
 use bitcoin::{Block, OutPoint, Transaction, TxOut};
 
 /// Trait to do something with every txout contained in a structure.
@@ -96,3 +97,24 @@ impl<T: Ord> Append for BTreeSet<T> {
         BTreeSet::is_empty(self)
     }
 }
+
+impl<T> Append for Vec<T> {
+    fn append(&mut self, mut other: Self) {
+        Vec::append(self, &mut other)
+    }
+
+    fn is_empty(&self) -> bool {
+        Vec::is_empty(self)
+    }
+}
+
+impl<A: Append, B: Append> Append for (A, B) {
+    fn append(&mut self, other: Self) {
+        Append::append(&mut self.0, other.0);
+        Append::append(&mut self.1, other.1);
+    }
+
+    fn is_empty(&self) -> bool {
+        Append::is_empty(&self.0) && Append::is_empty(&self.1)
+    }
+}
index b82fb396afacfe0a67096c538828a801d7d0c497..a4aa2963ceb10aebea15a691ac8c524e63d484e2 100644 (file)
@@ -47,11 +47,14 @@ where
     ///
     /// The file must have been opened with read and write permissions.
     ///
+    /// `magic` is the expected prefixed bytes of the file. If this does not match, an error will be
+    /// returned.
+    ///
     /// [`File`]: std::fs::File
     pub fn new(magic: &'a [u8], mut db_file: File) -> Result<Self, FileError> {
         db_file.rewind()?;
 
-        let mut magic_buf = Vec::from_iter((0..).take(magic.len()));
+        let mut magic_buf = vec![0_u8; magic.len()];
         db_file.read_exact(magic_buf.as_mut())?;
 
         if magic_buf != magic {
@@ -71,6 +74,10 @@ where
     /// Creates or loads a store from `db_path`.
     ///
     /// If no file exists there, it will be created.
+    ///
+    /// Refer to [`new`] for documentation on the `magic` input.
+    ///
+    /// [`new`]: Self::new
     pub fn new_from_path<P>(magic: &'a [u8], db_path: P) -> Result<Self, FileError>
     where
         P: AsRef<Path>,
@@ -170,46 +177,7 @@ mod test {
     const TEST_MAGIC_BYTES: [u8; TEST_MAGIC_BYTES_LEN] =
         [98, 100, 107, 102, 115, 49, 49, 49, 49, 49, 49, 49];
 
-    #[derive(
-        Debug,
-        Clone,
-        Copy,
-        PartialOrd,
-        Ord,
-        PartialEq,
-        Eq,
-        Hash,
-        serde::Serialize,
-        serde::Deserialize,
-    )]
-    enum TestKeychain {
-        External,
-        Internal,
-    }
-
-    impl core::fmt::Display for TestKeychain {
-        fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
-            match self {
-                Self::External => write!(f, "external"),
-                Self::Internal => write!(f, "internal"),
-            }
-        }
-    }
-
-    #[derive(Debug, Default, serde::Serialize, serde::Deserialize)]
-    struct TestChangeSet {
-        pub changes: Vec<String>,
-    }
-
-    impl Append for TestChangeSet {
-        fn append(&mut self, mut other: Self) {
-            self.changes.append(&mut other.changes)
-        }
-
-        fn is_empty(&self) -> bool {
-            self.changes.is_empty()
-        }
-    }
+    type TestChangeSet = Vec<String>;
 
     #[derive(Debug)]
     struct TestTracker;
@@ -248,9 +216,7 @@ mod test {
         let mut data = [255_u8; 2000];
         data[..TEST_MAGIC_BYTES_LEN].copy_from_slice(&TEST_MAGIC_BYTES);
 
-        let changeset = TestChangeSet {
-            changes: vec!["one".into(), "two".into(), "three!".into()],
-        };
+        let changeset = vec!["one".into(), "two".into(), "three!".into()];
 
         let mut file = NamedTempFile::new().unwrap();
         file.write_all(&data).expect("should write");