5
5
//! A special key is reserved for storing the length of the collection so far.
6
6
//! Another special key is reserved for storing the offset of the collection.
7
7
use std:: any:: type_name;
8
- use std:: sync:: Mutex ;
9
- use std:: { convert:: TryInto } ;
8
+ use std:: convert:: TryInto ;
10
9
use std:: marker:: PhantomData ;
10
+ use std:: sync:: Mutex ;
11
11
12
12
use serde:: { de:: DeserializeOwned , Serialize } ;
13
13
14
14
use cosmwasm_std:: { ReadonlyStorage , StdError , StdResult , Storage } ;
15
15
16
- use secret_toolkit_serialization:: { Serde , Bincode2 } ;
16
+ use secret_toolkit_serialization:: { Bincode2 , Serde } ;
17
17
18
18
const LEN_KEY : & [ u8 ] = b"len" ;
19
19
const OFFSET_KEY : & [ u8 ] = b"off" ;
20
20
21
21
pub struct DequeStore < ' a , T , Ser = Bincode2 >
22
- where
23
- T : Serialize + DeserializeOwned ,
24
- Ser : Serde ,
22
+ where
23
+ T : Serialize + DeserializeOwned ,
24
+ Ser : Serde ,
25
25
{
26
26
/// prefix of the newly constructed Storage
27
27
namespace : & ' a [ u8 ] ,
@@ -34,7 +34,7 @@ pub struct DequeStore<'a, T, Ser = Bincode2>
34
34
serialization_type : PhantomData < Ser > ,
35
35
}
36
36
37
- impl < ' a , ' b , T : Serialize + DeserializeOwned , Ser : Serde > DequeStore < ' a , T , Ser > {
37
+ impl < ' a , ' b , T : Serialize + DeserializeOwned , Ser : Serde > DequeStore < ' a , T , Ser > {
38
38
/// constructor
39
39
pub const fn new ( prefix : & ' a [ u8 ] ) -> Self {
40
40
Self {
@@ -70,39 +70,38 @@ impl<'a, T: Serialize + DeserializeOwned, Ser: Serde> DequeStore<'a, T, Ser> {
70
70
pub fn get_len < S : ReadonlyStorage > ( & self , storage : & S ) -> StdResult < u32 > {
71
71
let mut may_len = self . length . lock ( ) . unwrap ( ) ;
72
72
match * may_len {
73
- Some ( len) => { Ok ( len) } ,
74
- None => {
75
- match self . _get_u32 ( storage, LEN_KEY ) {
76
- Ok ( len) => {
77
- * may_len = Some ( len) ;
78
- Ok ( len)
79
- } ,
80
- Err ( e) => { Err ( e) } ,
73
+ Some ( len) => Ok ( len) ,
74
+ None => match self . _get_u32 ( storage, LEN_KEY ) {
75
+ Ok ( len) => {
76
+ * may_len = Some ( len) ;
77
+ Ok ( len)
81
78
}
79
+ Err ( e) => Err ( e) ,
82
80
} ,
83
81
}
84
82
}
85
83
/// gets the offset from storage, and otherwise sets it to 0
86
84
pub fn get_off < S : ReadonlyStorage > ( & self , storage : & S ) -> StdResult < u32 > {
87
85
let mut may_off = self . offset . lock ( ) . unwrap ( ) ;
88
86
match * may_off {
89
- Some ( len) => { Ok ( len) } ,
90
- None => {
91
- match self . _get_u32 ( storage, OFFSET_KEY ) {
92
- Ok ( len) => {
93
- * may_off = Some ( len) ;
94
- Ok ( len)
95
- } ,
96
- Err ( e) => { Err ( e) } ,
87
+ Some ( len) => Ok ( len) ,
88
+ None => match self . _get_u32 ( storage, OFFSET_KEY ) {
89
+ Ok ( len) => {
90
+ * may_off = Some ( len) ;
91
+ Ok ( len)
97
92
}
93
+ Err ( e) => Err ( e) ,
98
94
} ,
99
95
}
100
96
}
101
97
/// gets offset or length
102
98
fn _get_u32 < S : ReadonlyStorage > ( & self , storage : & S , key : & [ u8 ] ) -> StdResult < u32 > {
103
99
let num_key = [ self . as_slice ( ) , key] . concat ( ) ;
104
100
if let Some ( num_vec) = storage. get ( & num_key) {
105
- let num_bytes = num_vec. as_slice ( ) . try_into ( ) . map_err ( |err| StdError :: parse_err ( "u32" , err) ) ?;
101
+ let num_bytes = num_vec
102
+ . as_slice ( )
103
+ . try_into ( )
104
+ . map_err ( |err| StdError :: parse_err ( "u32" , err) ) ?;
106
105
let num = u32:: from_be_bytes ( num_bytes) ;
107
106
Ok ( num)
108
107
} else {
@@ -116,7 +115,9 @@ impl<'a, T: Serialize + DeserializeOwned, Ser: Serde> DequeStore<'a, T, Ser> {
116
115
/// gets the element at pos if within bounds
117
116
pub fn get_at < S : ReadonlyStorage > ( & self , storage : & S , pos : u32 ) -> StdResult < T > {
118
117
let len = self . get_len ( storage) ?;
119
- if pos >= len { return Err ( StdError :: generic_err ( "DequeStore access out of bounds" ) ) ; }
118
+ if pos >= len {
119
+ return Err ( StdError :: generic_err ( "DequeStore access out of bounds" ) ) ;
120
+ }
120
121
self . get_at_unchecked ( storage, pos)
121
122
}
122
123
/// tries to get the element at pos
@@ -153,12 +154,18 @@ impl<'a, T: Serialize + DeserializeOwned, Ser: Serde> DequeStore<'a, T, Ser> {
153
154
/// Replaces data at a position within bounds
154
155
pub fn set_at < S : Storage > ( & self , storage : & mut S , pos : u32 , item : & T ) -> StdResult < ( ) > {
155
156
let len = self . get_len ( storage) ?;
156
- if pos >= len { return Err ( StdError :: generic_err ( "DequeStore access out of bounds" ) ) ; }
157
+ if pos >= len {
158
+ return Err ( StdError :: generic_err ( "DequeStore access out of bounds" ) ) ;
159
+ }
157
160
self . set_at_unchecked ( storage, pos, item)
158
161
}
159
162
/// Sets data at a given index
160
163
fn set_at_unchecked < S : Storage > ( & self , storage : & mut S , pos : u32 , item : & T ) -> StdResult < ( ) > {
161
- self . save_impl ( storage, & self . _get_offset_pos ( storage, pos) ?. to_be_bytes ( ) , item)
164
+ self . save_impl (
165
+ storage,
166
+ & self . _get_offset_pos ( storage, pos) ?. to_be_bytes ( ) ,
167
+ item,
168
+ )
162
169
}
163
170
/// Pushes an item to the back
164
171
pub fn push_back < S : Storage > ( & self , storage : & mut S , item : & T ) -> StdResult < ( ) > {
@@ -178,7 +185,7 @@ impl<'a, T: Serialize + DeserializeOwned, Ser: Serde> DequeStore<'a, T, Ser> {
178
185
}
179
186
/// Pops an item from the back
180
187
pub fn pop_back < S : Storage > ( & self , storage : & mut S ) -> StdResult < T > {
181
- if let Some ( len) = self . get_len ( storage) ?. checked_sub ( 1 ) {
188
+ if let Some ( len) = self . get_len ( storage) ?. checked_sub ( 1 ) {
182
189
let item = self . get_at_unchecked ( storage, len) ;
183
190
self . set_len ( storage, len) ;
184
191
item
@@ -239,8 +246,16 @@ impl<'a, T: Serialize + DeserializeOwned, Ser: Serde> DequeStore<'a, T, Ser> {
239
246
Ok ( iter)
240
247
}
241
248
/// does paging with the given parameters
242
- pub fn paging < S : ReadonlyStorage > ( & self , storage : & S , start_page : u32 , size : u32 ) -> StdResult < Vec < T > > {
243
- self . iter ( storage) ?. skip ( ( start_page as usize ) * ( size as usize ) ) . take ( size as usize ) . collect ( )
249
+ pub fn paging < S : ReadonlyStorage > (
250
+ & self ,
251
+ storage : & S ,
252
+ start_page : u32 ,
253
+ size : u32 ,
254
+ ) -> StdResult < Vec < T > > {
255
+ self . iter ( storage) ?
256
+ . skip ( ( start_page as usize ) * ( size as usize ) )
257
+ . take ( size as usize )
258
+ . collect ( )
244
259
}
245
260
}
246
261
@@ -291,7 +306,8 @@ impl<'a, T: Serialize + DeserializeOwned, Ser: Serde> Clone for DequeStore<'a, T
291
306
length : Mutex :: new ( None ) ,
292
307
offset : Mutex :: new ( None ) ,
293
308
item_type : self . item_type . clone ( ) ,
294
- serialization_type : self . serialization_type . clone ( ) }
309
+ serialization_type : self . serialization_type . clone ( ) ,
310
+ }
295
311
}
296
312
}
297
313
@@ -309,17 +325,17 @@ where
309
325
}
310
326
311
327
impl < ' a , T , S , Ser > DequeStoreIter < ' a , T , S , Ser >
312
- where
313
- T : Serialize + DeserializeOwned ,
314
- S : ReadonlyStorage ,
315
- Ser : Serde ,
328
+ where
329
+ T : Serialize + DeserializeOwned ,
330
+ S : ReadonlyStorage ,
331
+ Ser : Serde ,
316
332
{
317
333
/// constructor
318
334
pub fn new (
319
335
deque_store : & ' a DequeStore < ' a , T , Ser > ,
320
336
storage : & ' a S ,
321
337
start : u32 ,
322
- end : u32
338
+ end : u32 ,
323
339
) -> Self {
324
340
Self {
325
341
deque_store,
@@ -331,10 +347,10 @@ impl<'a, T, S, Ser> DequeStoreIter<'a, T, S, Ser>
331
347
}
332
348
333
349
impl < ' a , T , S , Ser > Iterator for DequeStoreIter < ' a , T , S , Ser >
334
- where
335
- T : Serialize + DeserializeOwned ,
336
- S : ReadonlyStorage ,
337
- Ser : Serde ,
350
+ where
351
+ T : Serialize + DeserializeOwned ,
352
+ S : ReadonlyStorage ,
353
+ Ser : Serde ,
338
354
{
339
355
type Item = StdResult < T > ;
340
356
@@ -366,10 +382,10 @@ impl<'a, T, S, Ser> Iterator for DequeStoreIter<'a, T, S, Ser>
366
382
}
367
383
368
384
impl < ' a , T , S , Ser > DoubleEndedIterator for DequeStoreIter < ' a , T , S , Ser >
369
- where
370
- T : Serialize + DeserializeOwned ,
371
- S : ReadonlyStorage ,
372
- Ser : Serde ,
385
+ where
386
+ T : Serialize + DeserializeOwned ,
387
+ S : ReadonlyStorage ,
388
+ Ser : Serde ,
373
389
{
374
390
fn next_back ( & mut self ) -> Option < Self :: Item > {
375
391
if self . start >= self . end {
@@ -593,7 +609,7 @@ mod tests {
593
609
let mut storage = MockStorage :: new ( ) ;
594
610
let json_deque_store: DequeStore < i32 , Json > = DequeStore :: new ( b"test2" ) ;
595
611
json_deque_store. push_back ( & mut storage, & 1234 ) ?;
596
-
612
+
597
613
let key = [ json_deque_store. as_slice ( ) , & 0_u32 . to_be_bytes ( ) ] . concat ( ) ;
598
614
let bytes = storage. get ( & key) ;
599
615
assert_eq ! ( bytes, Some ( b"1234" . to_vec( ) ) ) ;
@@ -626,4 +642,4 @@ mod tests {
626
642
627
643
Ok ( ( ) )
628
644
}
629
- }
645
+ }
0 commit comments