1- use std:: collections:: BTreeMap ;
1+ use std:: {
2+ collections:: { BTreeMap , btree_map} ,
3+ mem,
4+ } ;
25
36use schemars:: JsonSchema ;
47use serde:: { Deserialize , Serialize } ;
@@ -15,11 +18,54 @@ use crate::{
1518///
1619/// This is backwards-compatible with the existing flat key-value YAML format
1720/// used by `HashMap<String, String>`.
18- #[ derive( Clone , Debug , Default , Deserialize , Eq , JsonSchema , Merge , PartialEq , Serialize ) ]
19- #[ merge( path_overrides( merge = "crate::config::merge" ) ) ]
21+ #[ derive( Clone , Debug , Default , Deserialize , Eq , JsonSchema , PartialEq , Serialize ) ]
2022pub struct KeyValueConfigOverrides {
2123 #[ serde( flatten) ]
22- pub overrides : BTreeMap < String , Option < String > > ,
24+ pub overrides : BTreeMap < String , String > ,
25+ }
26+
27+ impl < ' a > KeyValueConfigOverrides {
28+ pub fn iter ( & ' a self ) -> btree_map:: Iter < ' a , String , String > {
29+ self . into_iter ( )
30+ }
31+ }
32+
33+ impl Merge for KeyValueConfigOverrides {
34+ fn merge ( & mut self , defaults : & Self ) {
35+ let mut overrides = defaults. overrides . clone ( ) ;
36+ overrides. extend ( mem:: take ( & mut self . overrides ) ) ;
37+ self . overrides = overrides;
38+ }
39+ }
40+
41+ impl IntoIterator for KeyValueConfigOverrides {
42+ type IntoIter = btree_map:: IntoIter < String , String > ;
43+ type Item = ( String , String ) ;
44+
45+ fn into_iter ( self ) -> Self :: IntoIter {
46+ self . overrides . into_iter ( )
47+ }
48+ }
49+
50+ impl < ' a > IntoIterator for & ' a KeyValueConfigOverrides {
51+ type IntoIter = btree_map:: Iter < ' a , String , String > ;
52+ type Item = ( & ' a String , & ' a String ) ;
53+
54+ fn into_iter ( self ) -> Self :: IntoIter {
55+ self . overrides . iter ( )
56+ }
57+ }
58+
59+ impl < K , V , const N : usize > From < [ ( K , V ) ; N ] > for KeyValueConfigOverrides
60+ where
61+ K : Into < String > ,
62+ V : Into < String > ,
63+ {
64+ fn from ( value : [ ( K , V ) ; N ] ) -> Self {
65+ Self {
66+ overrides : value. map ( |( k, v) | ( k. into ( ) , v. into ( ) ) ) . into ( ) ,
67+ }
68+ }
2369}
2470
2571// Variant of [`crate::config_overrides::JsonConfigOverrides`] with the following
@@ -398,7 +444,7 @@ mod tests {
398444 #[ test]
399445 fn test_json_config_overrides_from_key_value_config_overrides ( ) {
400446 let key_value_config_overrides = KeyValueConfigOverrides {
401- overrides : [ ( "key" . to_owned ( ) , Some ( "value" . to_owned ( ) ) ) ] . into ( ) ,
447+ overrides : [ ( "key" . to_owned ( ) , "value" . to_owned ( ) ) ] . into ( ) ,
402448 } ;
403449
404450 let actual_json_config_overrides: JsonConfigOverrides = key_value_config_overrides. into ( ) ;
@@ -413,7 +459,7 @@ mod tests {
413459 fn test_json_config_overrides_from_json_or_key_value_config_overrides ( ) {
414460 let key_value_config_overrides =
415461 JsonOrKeyValueConfigOverrides :: KeyValue ( KeyValueConfigOverrides {
416- overrides : [ ( "key" . to_owned ( ) , Some ( "value" . to_owned ( ) ) ) ] . into ( ) ,
462+ overrides : [ ( "key" . to_owned ( ) , "value" . to_owned ( ) ) ] . into ( ) ,
417463 } ) ;
418464
419465 let actual_json_config_overrides: JsonConfigOverrides = key_value_config_overrides. into ( ) ;
@@ -427,11 +473,11 @@ mod tests {
427473 #[ test]
428474 fn test_json_or_key_value_config_overrides_merge ( ) {
429475 let base = JsonOrKeyValueConfigOverrides :: KeyValue ( KeyValueConfigOverrides {
430- overrides : [ ( "key" . to_owned ( ) , Some ( "base" . to_owned ( ) ) ) ] . into ( ) ,
476+ overrides : [ ( "key" . to_owned ( ) , "base" . to_owned ( ) ) ] . into ( ) ,
431477 } ) ;
432478
433479 let patch = JsonOrKeyValueConfigOverrides :: KeyValue ( KeyValueConfigOverrides {
434- overrides : [ ( "key" . to_owned ( ) , Some ( "patch" . to_owned ( ) ) ) ] . into ( ) ,
480+ overrides : [ ( "key" . to_owned ( ) , "patch" . to_owned ( ) ) ] . into ( ) ,
435481 } ) ;
436482
437483 // The merge implementation internally converts KeyValueConfigOverrides to
0 commit comments