Skip to content

Commit

Permalink
Add more impls for Append and docs for file store magic
Browse files Browse the repository at this point in the history
evanlinjin committed May 10, 2023

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature. The key has expired.
1 parent 2aa08a5 commit 4963240
Showing 2 changed files with 32 additions and 44 deletions.
22 changes: 22 additions & 0 deletions crates/chain/src/tx_data_traits.rs
Original file line number Diff line number Diff line change
@@ -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)
}
}
54 changes: 10 additions & 44 deletions crates/file_store/src/store.rs
Original file line number Diff line number Diff line change
@@ -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");

0 comments on commit 4963240

Please sign in to comment.