@@ -178,7 +178,7 @@ pub enum KeyValuePairsError {
178
178
/// which ultimately prevent unncessary reconciliations due to changes
179
179
/// in item order.
180
180
#[ derive( Clone , Debug , Default ) ]
181
- pub struct KeyValuePairs < T : Value > ( BTreeSet < KeyValuePair < T > > ) ;
181
+ pub struct KeyValuePairs < T : Value > ( BTreeMap < Key , T > ) ;
182
182
183
183
impl < K , V , T > TryFrom < BTreeMap < K , V > > for KeyValuePairs < T >
184
184
where
@@ -224,7 +224,7 @@ where
224
224
T : Value ,
225
225
{
226
226
fn from_iter < I : IntoIterator < Item = KeyValuePair < T > > > ( iter : I ) -> Self {
227
- Self ( iter. into_iter ( ) . collect ( ) )
227
+ Self ( iter. into_iter ( ) . map ( |kvp| ( kvp . key , kvp . value ) ) . collect ( ) )
228
228
}
229
229
}
230
230
@@ -242,7 +242,7 @@ where
242
242
. map ( KeyValuePair :: try_from)
243
243
. collect :: < Result < BTreeSet < _ > , KeyValuePairError < T :: Error > > > ( ) ?;
244
244
245
- Ok ( Self ( pairs) )
245
+ Ok ( Self :: from_iter ( pairs) )
246
246
}
247
247
}
248
248
@@ -253,7 +253,7 @@ where
253
253
fn from ( value : KeyValuePairs < T > ) -> Self {
254
254
value
255
255
. iter ( )
256
- . map ( |pair | ( pair . key ( ) . to_string ( ) , pair . value ( ) . to_string ( ) ) )
256
+ . map ( |( k , v ) | ( k . to_string ( ) , v . to_string ( ) ) )
257
257
. collect ( )
258
258
}
259
259
}
@@ -262,7 +262,7 @@ impl<T> Deref for KeyValuePairs<T>
262
262
where
263
263
T : Value ,
264
264
{
265
- type Target = BTreeSet < KeyValuePair < T > > ;
265
+ type Target = BTreeMap < Key , T > ;
266
266
267
267
fn deref ( & self ) -> & Self :: Target {
268
268
& self . 0
@@ -280,7 +280,7 @@ where
280
280
281
281
/// Creates a new list of [`KeyValuePair`]s from `pairs`.
282
282
pub fn new_with ( pairs : BTreeSet < KeyValuePair < T > > ) -> Self {
283
- Self ( pairs)
283
+ Self :: from_iter ( pairs)
284
284
}
285
285
286
286
/// Extends `self` with `other`.
@@ -295,16 +295,16 @@ where
295
295
/// [`KeyValuePairs::contains_key`] before inserting or try to insert
296
296
/// fallible via [`KeyValuePairs::try_insert`].
297
297
pub fn insert ( & mut self , kvp : KeyValuePair < T > ) -> & mut Self {
298
- self . 0 . insert ( kvp) ;
298
+ self . 0 . insert ( kvp. key , kvp . value ) ;
299
299
self
300
300
}
301
301
302
302
/// Tries to insert a new [`KeyValuePair`] into the list of pairs.
303
303
///
304
- /// If the list already had this pair present, nothing is updated, and an
304
+ /// If the list already had this key present, nothing is updated, and an
305
305
/// error is returned.
306
306
pub fn try_insert ( & mut self , kvp : KeyValuePair < T > ) -> Result < ( ) , KeyValuePairsError > {
307
- ensure ! ( !self . 0 . contains ( & kvp) , PairAlreadyExistsSnafu ) ;
307
+ ensure ! ( !self . 0 . contains_key ( & kvp. key ) , PairAlreadyExistsSnafu ) ;
308
308
self . insert ( kvp) ;
309
309
Ok ( ( ) )
310
310
}
@@ -314,7 +314,10 @@ where
314
314
let Ok ( kvp) = kvp. try_into ( ) else {
315
315
return false ;
316
316
} ;
317
- self . 0 . contains ( & kvp)
317
+ let Some ( value) = self . get ( & kvp. key ) else {
318
+ return false ;
319
+ } ;
320
+ value == & kvp. value
318
321
}
319
322
320
323
/// Returns if the list contains a key/value pair with a specific [`Key`].
@@ -323,18 +326,15 @@ where
323
326
return false ;
324
327
} ;
325
328
326
- for kvp in & self . 0 {
327
- if kvp. key == key {
328
- return true ;
329
- }
330
- }
331
-
332
- false
329
+ self . 0 . contains_key ( & key)
333
330
}
334
331
335
332
/// Returns an [`Iterator`] over [`KeyValuePairs`] yielding a reference to every [`KeyValuePair`] contained within.
336
- pub fn iter ( & self ) -> impl Iterator < Item = & KeyValuePair < T > > {
337
- self . 0 . iter ( )
333
+ pub fn iter ( & self ) -> impl Iterator < Item = KeyValuePair < T > > + ' _ {
334
+ self . 0 . iter ( ) . map ( |( k, v) | KeyValuePair {
335
+ key : k. clone ( ) ,
336
+ value : v. clone ( ) ,
337
+ } )
338
338
}
339
339
}
340
340
@@ -343,12 +343,15 @@ where
343
343
T : Value ,
344
344
{
345
345
type Item = KeyValuePair < T > ;
346
- type IntoIter = std:: collections:: btree_set:: IntoIter < Self :: Item > ;
346
+ type IntoIter =
347
+ std:: iter:: Map < std:: collections:: btree_map:: IntoIter < Key , T > , fn ( ( Key , T ) ) -> Self :: Item > ;
347
348
348
349
/// Returns a consuming [`Iterator`] over [`KeyValuePairs`] moving every [`KeyValuePair`] out.
349
350
/// The [`KeyValuePairs`] cannot be used again after calling this.
350
351
fn into_iter ( self ) -> Self :: IntoIter {
351
- self . 0 . into_iter ( )
352
+ self . 0
353
+ . into_iter ( )
354
+ . map ( |( key, value) | KeyValuePair { key, value } )
352
355
}
353
356
}
354
357
@@ -488,4 +491,17 @@ mod test {
488
491
let report = Report :: from_error ( err) ;
489
492
println ! ( "{report}" )
490
493
}
494
+
495
+ #[ test]
496
+ fn merge ( ) {
497
+ let mut merged_labels =
498
+ Labels :: try_from_iter ( [ ( "a" , "b" ) , ( "b" , "a" ) , ( "c" , "c" ) ] ) . unwrap ( ) ;
499
+ merged_labels. extend ( Labels :: try_from_iter ( [ ( "a" , "a" ) , ( "b" , "b" ) , ( "d" , "d" ) ] ) . unwrap ( ) ) ;
500
+ assert_eq ! (
501
+ BTreeMap :: from( merged_labels) ,
502
+ BTreeMap :: from(
503
+ Labels :: try_from_iter( [ ( "a" , "a" ) , ( "b" , "b" ) , ( "c" , "c" ) , ( "d" , "d" ) ] ) . unwrap( )
504
+ )
505
+ )
506
+ }
491
507
}
0 commit comments