1- use std:: collections:: BTreeMap ;
1+ use std:: {
2+ collections:: { BTreeMap , btree_map} ,
3+ mem,
4+ } ;
25
36use schemars:: JsonSchema ;
47use serde:: { Deserialize , Serialize } ;
@@ -12,14 +15,54 @@ use crate::{
1215// Variant of [`crate::config_overrides::KeyValueConfigOverrides`] that implements
1316// Merge
1417/// Flat key-value overrides for `*.properties`, Hadoop XML, etc.
15- ///
16- /// This is backwards-compatible with the existing flat key-value YAML format
17- /// used by `HashMap<String, String>`.
18- #[ derive( Clone , Debug , Default , Deserialize , Eq , JsonSchema , Merge , PartialEq , Serialize ) ]
19- #[ merge( path_overrides( merge = "crate::config::merge" ) ) ]
18+ #[ derive( Clone , Debug , Default , Deserialize , Eq , JsonSchema , PartialEq , Serialize ) ]
2019pub struct KeyValueConfigOverrides {
2120 #[ serde( flatten) ]
22- pub overrides : BTreeMap < String , Option < String > > ,
21+ pub overrides : BTreeMap < String , String > ,
22+ }
23+
24+ impl < ' a > KeyValueConfigOverrides {
25+ pub fn iter ( & ' a self ) -> btree_map:: Iter < ' a , String , String > {
26+ self . into_iter ( )
27+ }
28+ }
29+
30+ impl Merge for KeyValueConfigOverrides {
31+ fn merge ( & mut self , defaults : & Self ) {
32+ let mut overrides = defaults. overrides . clone ( ) ;
33+ overrides. extend ( mem:: take ( & mut self . overrides ) ) ;
34+ self . overrides = overrides;
35+ }
36+ }
37+
38+ impl IntoIterator for KeyValueConfigOverrides {
39+ type IntoIter = btree_map:: IntoIter < String , String > ;
40+ type Item = ( String , String ) ;
41+
42+ fn into_iter ( self ) -> Self :: IntoIter {
43+ self . overrides . into_iter ( )
44+ }
45+ }
46+
47+ impl < ' a > IntoIterator for & ' a KeyValueConfigOverrides {
48+ type IntoIter = btree_map:: Iter < ' a , String , String > ;
49+ type Item = ( & ' a String , & ' a String ) ;
50+
51+ fn into_iter ( self ) -> Self :: IntoIter {
52+ self . overrides . iter ( )
53+ }
54+ }
55+
56+ impl < K , V , const N : usize > From < [ ( K , V ) ; N ] > for KeyValueConfigOverrides
57+ where
58+ K : Into < String > ,
59+ V : Into < String > ,
60+ {
61+ fn from ( value : [ ( K , V ) ; N ] ) -> Self {
62+ Self {
63+ overrides : value. map ( |( k, v) | ( k. into ( ) , v. into ( ) ) ) . into ( ) ,
64+ }
65+ }
2366}
2467
2568// Variant of [`crate::config_overrides::JsonConfigOverrides`] with the following
@@ -398,7 +441,7 @@ mod tests {
398441 #[ test]
399442 fn test_json_config_overrides_from_key_value_config_overrides ( ) {
400443 let key_value_config_overrides = KeyValueConfigOverrides {
401- overrides : [ ( "key" . to_owned ( ) , Some ( "value" . to_owned ( ) ) ) ] . into ( ) ,
444+ overrides : [ ( "key" . to_owned ( ) , "value" . to_owned ( ) ) ] . into ( ) ,
402445 } ;
403446
404447 let actual_json_config_overrides: JsonConfigOverrides = key_value_config_overrides. into ( ) ;
@@ -413,7 +456,7 @@ mod tests {
413456 fn test_json_config_overrides_from_json_or_key_value_config_overrides ( ) {
414457 let key_value_config_overrides =
415458 JsonOrKeyValueConfigOverrides :: KeyValue ( KeyValueConfigOverrides {
416- overrides : [ ( "key" . to_owned ( ) , Some ( "value" . to_owned ( ) ) ) ] . into ( ) ,
459+ overrides : [ ( "key" . to_owned ( ) , "value" . to_owned ( ) ) ] . into ( ) ,
417460 } ) ;
418461
419462 let actual_json_config_overrides: JsonConfigOverrides = key_value_config_overrides. into ( ) ;
@@ -427,11 +470,11 @@ mod tests {
427470 #[ test]
428471 fn test_json_or_key_value_config_overrides_merge ( ) {
429472 let base = JsonOrKeyValueConfigOverrides :: KeyValue ( KeyValueConfigOverrides {
430- overrides : [ ( "key" . to_owned ( ) , Some ( "base" . to_owned ( ) ) ) ] . into ( ) ,
473+ overrides : [ ( "key" . to_owned ( ) , "base" . to_owned ( ) ) ] . into ( ) ,
431474 } ) ;
432475
433476 let patch = JsonOrKeyValueConfigOverrides :: KeyValue ( KeyValueConfigOverrides {
434- overrides : [ ( "key" . to_owned ( ) , Some ( "patch" . to_owned ( ) ) ) ] . into ( ) ,
477+ overrides : [ ( "key" . to_owned ( ) , "patch" . to_owned ( ) ) ] . into ( ) ,
435478 } ) ;
436479
437480 // The merge implementation internally converts KeyValueConfigOverrides to
0 commit comments