@@ -145,18 +145,75 @@ pub enum KeyValuePairsError {
145
145
}
146
146
147
147
/// A validated set/list of Kubernetes key/value pairs.
148
+ ///
149
+ /// It implements various traits which allows conversion from and to different
150
+ /// data types. Traits to construct [`KeyValuePairs`] from other data types are:
151
+ ///
152
+ /// - `TryFrom<&BTreeMap<String, String>>`
153
+ /// - `TryFrom<BTreeMap<String, String>>`
154
+ /// - `FromIterator<KeyValuePair<T>>`
155
+ /// - `TryFrom<[(K, V); N]>`
156
+ ///
157
+ /// Traits to convert [`KeyValuePairs`] into a different data type are:
158
+ ///
159
+ /// - `From<KeyValuePairs<T>> for BTreeMap<String, String>`
160
+ ///
161
+ /// ## Examples
162
+ ///
163
+ /// ### Converting a BTreeMap into a list of labels
164
+ ///
165
+ /// ```
166
+ /// # use std::collections::BTreeMap;
167
+ /// # use stackable_operator::kvp::Labels;
168
+ /// let map = BTreeMap::from([
169
+ /// ("stackable.tech/managed-by", "stackablectl"),
170
+ /// ("stackable.tech/vendor", "Stackable"),
171
+ /// ]);
172
+ ///
173
+ /// let labels = Labels::try_from(map).unwrap();
174
+ /// ```
175
+ ///
176
+ /// ### Creating a list of labels from an array
177
+ ///
178
+ /// ```
179
+ /// # use stackable_operator::kvp::Labels;
180
+ /// let labels = Labels::try_from([
181
+ /// ("stackable.tech/managed-by", "stackablectl"),
182
+ /// ("stackable.tech/vendor", "Stackable"),
183
+ /// ]).unwrap();
184
+ /// ```
148
185
#[ derive( Clone , Debug , Default ) ]
149
186
pub struct KeyValuePairs < T : Value > ( BTreeSet < KeyValuePair < T > > ) ;
150
187
151
- impl < T > TryFrom < BTreeMap < String , String > > for KeyValuePairs < T >
188
+ impl < K , V , T > TryFrom < BTreeMap < K , V > > for KeyValuePairs < T >
189
+ where
190
+ K : AsRef < str > ,
191
+ V : AsRef < str > ,
192
+ T : Value ,
193
+ {
194
+ type Error = KeyValuePairError < T :: Error > ;
195
+
196
+ fn try_from ( map : BTreeMap < K , V > ) -> Result < Self , Self :: Error > {
197
+ let pairs = map
198
+ . iter ( )
199
+ . map ( KeyValuePair :: try_from)
200
+ . collect :: < Result < BTreeSet < _ > , KeyValuePairError < T :: Error > > > ( ) ?;
201
+
202
+ Ok ( Self ( pairs) )
203
+ }
204
+ }
205
+
206
+ impl < K , V , T > TryFrom < & BTreeMap < K , V > > for KeyValuePairs < T >
152
207
where
208
+ K : AsRef < str > ,
209
+ V : AsRef < str > ,
153
210
T : Value ,
154
211
{
155
212
type Error = KeyValuePairError < T :: Error > ;
156
213
157
- fn try_from ( map : BTreeMap < String , String > ) -> Result < Self , Self :: Error > {
214
+ fn try_from ( map : & BTreeMap < K , V > ) -> Result < Self , Self :: Error > {
158
215
let pairs = map
159
- . into_iter ( )
216
+ . iter ( )
160
217
. map ( KeyValuePair :: try_from)
161
218
. collect :: < Result < BTreeSet < _ > , KeyValuePairError < T :: Error > > > ( ) ?;
162
219
@@ -357,11 +414,8 @@ mod test {
357
414
#[ test]
358
415
fn labels_try_from_map ( ) {
359
416
let map = BTreeMap :: from ( [
360
- ( "stackable.tech/vendor" . to_string ( ) , "Stackable" . to_string ( ) ) ,
361
- (
362
- "stackable.tech/managed-by" . to_string ( ) ,
363
- "stackablectl" . to_string ( ) ,
364
- ) ,
417
+ ( "stackable.tech/managed-by" , "stackablectl" ) ,
418
+ ( "stackable.tech/vendor" , "Stackable" ) ,
365
419
] ) ;
366
420
367
421
let labels = Labels :: try_from ( map) . unwrap ( ) ;
@@ -370,14 +424,13 @@ mod test {
370
424
371
425
#[ test]
372
426
fn labels_into_map ( ) {
373
- let pairs = BTreeSet :: from ( [
374
- KeyValuePair :: try_from ( ( "stackable.tech/managed-by" , "stackablectl" ) ) . unwrap ( ) ,
375
- KeyValuePair :: try_from ( ( "stackable.tech/vendor" , "Stackable" ) ) . unwrap ( ) ,
376
- ] ) ;
427
+ let labels = Labels :: try_from ( [
428
+ ( "stackable.tech/managed-by" , "stackablectl" ) ,
429
+ ( "stackable.tech/vendor" , "Stackable" ) ,
430
+ ] )
431
+ . unwrap ( ) ;
377
432
378
- let labels = Labels :: new_with ( pairs) ;
379
433
let map: BTreeMap < String , String > = labels. into ( ) ;
380
-
381
434
assert_eq ! ( map. len( ) , 2 ) ;
382
435
}
383
436
0 commit comments