diff --git a/crates/chain/src/tx_data_traits.rs b/crates/chain/src/tx_data_traits.rs index bd7f138f..b130793b 100644 --- a/crates/chain/src/tx_data_traits.rs +++ b/crates/chain/src/tx_data_traits.rs @@ -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 Append for BTreeSet { BTreeSet::is_empty(self) } } + +impl Append for Vec { + fn append(&mut self, mut other: Self) { + Vec::append(self, &mut other) + } + + fn is_empty(&self) -> bool { + Vec::is_empty(self) + } +} + +impl 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) + } +} diff --git a/crates/file_store/src/store.rs b/crates/file_store/src/store.rs index b82fb396..a4aa2963 100644 --- a/crates/file_store/src/store.rs +++ b/crates/file_store/src/store.rs @@ -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 { 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

(magic: &'a [u8], db_path: P) -> Result where P: AsRef, @@ -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, - } - - 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; #[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");