@@ -397,7 +397,7 @@ impl ConfigLayer {
397
397
. map_err ( |keys| ConfigUpdateError :: WouldOverwriteValue {
398
398
name : keys. join ( "." ) ,
399
399
} ) ?;
400
- match parent_table. entry ( leaf_key) {
400
+ match parent_table. entry_format ( leaf_key) {
401
401
toml_edit:: Entry :: Occupied ( mut entry) => {
402
402
if !entry. get ( ) . is_value ( ) {
403
403
return Err ( ConfigUpdateError :: WouldOverwriteTable {
@@ -409,6 +409,9 @@ impl ConfigLayer {
409
409
}
410
410
toml_edit:: Entry :: Vacant ( entry) => {
411
411
entry. insert ( toml_edit:: value ( new_value) ) ;
412
+ // Reset whitespace formatting (i.e. insert space before '=')
413
+ let mut new_key = parent_table. key_mut ( leaf_key) . unwrap ( ) ;
414
+ new_key. leaf_decor_mut ( ) . clear ( ) ;
412
415
Ok ( None )
413
416
}
414
417
}
@@ -476,7 +479,7 @@ fn ensure_parent_table<'a, 'b>(
476
479
let mut keys = name. components ( ) ;
477
480
let leaf_key = keys. next_back ( ) . ok_or ( & name. 0 [ ..] ) ?;
478
481
let parent_table = keys. enumerate ( ) . try_fold ( root_table, |table, ( i, key) | {
479
- let sub_item = table. entry ( key) . or_insert_with ( new_implicit_table) ;
482
+ let sub_item = table. entry_format ( key) . or_insert_with ( new_implicit_table) ;
480
483
sub_item. as_table_mut ( ) . ok_or ( & name. 0 [ ..=i] )
481
484
} ) ?;
482
485
Ok ( ( parent_table, leaf_key) )
@@ -918,6 +921,31 @@ mod tests {
918
921
"# ) ;
919
922
}
920
923
924
+ #[ test]
925
+ fn test_config_layer_set_value_formatting ( ) {
926
+ let mut layer = ConfigLayer :: empty ( ConfigSource :: User ) ;
927
+ // Quoting style should be preserved on insertion
928
+ layer
929
+ . set_value (
930
+ "'foo' . bar . 'baz'" ,
931
+ ConfigValue :: from_str ( "'value'" ) . unwrap ( ) ,
932
+ )
933
+ . unwrap ( ) ;
934
+ insta:: assert_snapshot!( layer. data, @r"
935
+ ['foo' . bar]
936
+ 'baz' = 'value'
937
+ " ) ;
938
+
939
+ // Style of existing keys isn't updated
940
+ layer. set_value ( "foo.bar.baz" , "new value" ) . unwrap ( ) ;
941
+ layer. set_value ( "foo.'bar'.blah" , 0 ) . unwrap ( ) ;
942
+ insta:: assert_snapshot!( layer. data, @r#"
943
+ ['foo' . bar]
944
+ 'baz' = "new value"
945
+ blah = 0
946
+ "# ) ;
947
+ }
948
+
921
949
#[ test]
922
950
fn test_config_layer_delete_value ( ) {
923
951
let mut layer = ConfigLayer :: empty ( ConfigSource :: User ) ;
0 commit comments