@@ -5,7 +5,7 @@ use std::{
55 path:: Path ,
66} ;
77
8- use bdk_chain:: { Append , Loadable , PersistBackend } ;
8+ use bdk_chain:: Append ;
99use bincode:: Options ;
1010
1111use crate :: { bincode_options, EntryIter , FileError , IterError } ;
@@ -14,16 +14,15 @@ use crate::{bincode_options, EntryIter, FileError, IterError};
1414///
1515/// The changesets are the results of altering a tracker implementation (`T`).
1616#[ derive( Debug ) ]
17- pub struct Store < T > {
17+ pub struct Store < T , C > {
1818 magic : & ' static [ u8 ] ,
1919 db_file : File ,
20- marker : PhantomData < T > ,
20+ marker : PhantomData < ( T , C ) > ,
2121}
2222
23- impl < T > Store < T >
23+ impl < T , C > Store < T , C >
2424where
25- T : Loadable ,
26- T :: ChangeSet : serde:: Serialize + serde:: de:: DeserializeOwned ,
25+ C : Default + Append + serde:: Serialize + serde:: de:: DeserializeOwned ,
2726{
2827 /// Creates a new store from a [`File`].
2928 ///
8180 /// **WARNING**: This method changes the write position in the underlying file. You should
8281 /// always iterate over all entries until `None` is returned if you want your next write to go
8382 /// at the end; otherwise, you will write over existing entries.
84- pub fn iter_changesets ( & mut self ) -> Result < EntryIter < ' _ , T :: ChangeSet > , io:: Error > {
83+ pub fn iter_changesets ( & mut self ) -> Result < EntryIter < ' _ , C > , io:: Error > {
8584 self . db_file
8685 . seek ( io:: SeekFrom :: Start ( self . magic . len ( ) as _ ) ) ?;
8786
10099 ///
101100 /// **WARNING**: This method changes the write position of the underlying file. The next
102101 /// changeset will be written over the erroring entry (or the end of the file if none existed).
103- pub fn aggregate_changesets ( & mut self ) -> ( T :: ChangeSet , Result < ( ) , IterError > ) {
104- let mut changeset = T :: ChangeSet :: default ( ) ;
102+ pub fn aggregate_changesets ( & mut self ) -> ( C , Result < ( ) , IterError > ) {
103+ let mut changeset = C :: default ( ) ;
105104 let result = ( || {
106105 let iter_changeset = self . iter_changesets ( ) ?;
107106 for next_changeset in iter_changeset {
@@ -121,7 +120,7 @@ where
121120 ///
122121 /// **WARNING**: This method does not detect whether the changeset is empty or not, and will
123122 /// append an empty changeset to the file (not catastrophic, just a waste of space).
124- pub fn append_changeset ( & mut self , changeset : & T :: ChangeSet ) -> Result < ( ) , io:: Error > {
123+ pub fn append_changeset ( & mut self , changeset : & C ) -> Result < ( ) , io:: Error > {
125124 bincode_options ( )
126125 . serialize_into ( & mut self . db_file , changeset)
127126 . map_err ( |e| match * e {
@@ -139,25 +138,6 @@ where
139138 }
140139}
141140
142- impl < T > PersistBackend < T > for Store < T >
143- where
144- T : Loadable ,
145- T :: ChangeSet : serde:: de:: DeserializeOwned + serde:: Serialize ,
146- {
147- type WriteError = std:: io:: Error ;
148- type LoadError = IterError ;
149-
150- fn write_changes ( & mut self , changeset : & T :: ChangeSet ) -> Result < ( ) , Self :: WriteError > {
151- Store :: append_changeset ( self , changeset)
152- }
153-
154- fn load_into_tracker ( & mut self , tracker : & mut T ) -> Result < ( ) , Self :: LoadError > {
155- let ( changeset, result) = self . aggregate_changesets ( ) ;
156- tracker. load_changeset ( changeset) ;
157- result
158- }
159- }
160-
161141#[ cfg( test) ]
162142mod test {
163143 use super :: * ;
@@ -213,19 +193,13 @@ mod test {
213193 #[ derive( Debug ) ]
214194 struct TestTracker ;
215195
216- impl Loadable for TestTracker {
217- type ChangeSet = TestChangeSet ;
218-
219- fn load_changeset ( & mut self , _changeset : Self :: ChangeSet ) { }
220- }
221-
222196 #[ test]
223197 fn new_fails_if_file_is_too_short ( ) {
224198 let mut file = NamedTempFile :: new ( ) . unwrap ( ) ;
225199 file. write_all ( & TEST_MAGIC_BYTES [ ..TEST_MAGIC_BYTES_LEN - 1 ] )
226200 . expect ( "should write" ) ;
227201
228- match Store :: < TestTracker > :: new ( & TEST_MAGIC_BYTES , file. reopen ( ) . unwrap ( ) ) {
202+ match Store :: < TestTracker , TestChangeSet > :: new ( & TEST_MAGIC_BYTES , file. reopen ( ) . unwrap ( ) ) {
229203 Err ( FileError :: Io ( e) ) => assert_eq ! ( e. kind( ) , std:: io:: ErrorKind :: UnexpectedEof ) ,
230204 unexpected => panic ! ( "unexpected result: {:?}" , unexpected) ,
231205 } ;
@@ -239,7 +213,7 @@ mod test {
239213 file. write_all ( invalid_magic_bytes. as_bytes ( ) )
240214 . expect ( "should write" ) ;
241215
242- match Store :: < TestTracker > :: new ( & TEST_MAGIC_BYTES , file. reopen ( ) . unwrap ( ) ) {
216+ match Store :: < TestTracker , TestChangeSet > :: new ( & TEST_MAGIC_BYTES , file. reopen ( ) . unwrap ( ) ) {
243217 Err ( FileError :: InvalidMagicBytes { got, .. } ) => {
244218 assert_eq ! ( got, invalid_magic_bytes. as_bytes( ) )
245219 }
@@ -260,8 +234,9 @@ mod test {
260234 let mut file = NamedTempFile :: new ( ) . unwrap ( ) ;
261235 file. write_all ( & data) . expect ( "should write" ) ;
262236
263- let mut store = Store :: < TestTracker > :: new ( & TEST_MAGIC_BYTES , file. reopen ( ) . unwrap ( ) )
264- . expect ( "should open" ) ;
237+ let mut store =
238+ Store :: < TestTracker , TestChangeSet > :: new ( & TEST_MAGIC_BYTES , file. reopen ( ) . unwrap ( ) )
239+ . expect ( "should open" ) ;
265240 match store. iter_changesets ( ) . expect ( "seek should succeed" ) . next ( ) {
266241 Some ( Err ( IterError :: Bincode ( _) ) ) => { }
267242 unexpected_res => panic ! ( "unexpected result: {:?}" , unexpected_res) ,
0 commit comments