@@ -19,6 +19,9 @@ impl Merge {
1919 /// The `merge.<driver>.recursive` key.
2020 pub const DRIVER_RECURSIVE : keys:: String = keys:: String :: new_string ( "recursive" , & config:: Tree :: MERGE )
2121 . with_subsection_requirement ( Some ( SubSectionRequirement :: Parameter ( "driver" ) ) ) ;
22+ /// The `merge.conflictStyle` key.
23+ pub const CONFLICT_STYLE : ConflictStyle =
24+ ConflictStyle :: new_with_validate ( "conflictStyle" , & config:: Tree :: MERGE , validate:: ConflictStyle ) ;
2225}
2326
2427impl Section for Merge {
@@ -36,3 +39,46 @@ impl Section for Merge {
3639 ]
3740 }
3841}
42+
43+ /// The `merge.conflictStyle` key.
44+ pub type ConflictStyle = keys:: Any < validate:: ConflictStyle > ;
45+
46+ mod conflict_style {
47+ use crate :: { bstr:: BStr , config, config:: tree:: sections:: merge:: ConflictStyle } ;
48+ use gix_merge:: blob:: builtin_driver:: text;
49+ use std:: borrow:: Cow ;
50+
51+ impl ConflictStyle {
52+ /// Derive the diff algorithm identified by `name`, case-insensitively.
53+ pub fn try_into_conflict_style (
54+ & ' static self ,
55+ name : Cow < ' _ , BStr > ,
56+ ) -> Result < text:: ConflictStyle , config:: key:: GenericErrorWithValue > {
57+ let style = if name. as_ref ( ) == "merge" {
58+ text:: ConflictStyle :: Merge
59+ } else if name. as_ref ( ) == "diff3" {
60+ text:: ConflictStyle :: Diff3
61+ } else if name. as_ref ( ) == "zdiff3" {
62+ text:: ConflictStyle :: ZealousDiff3
63+ } else {
64+ return Err ( config:: key:: GenericErrorWithValue :: from_value ( self , name. into_owned ( ) ) ) ;
65+ } ;
66+ Ok ( style)
67+ }
68+ }
69+ }
70+
71+ mod validate {
72+ use crate :: {
73+ bstr:: BStr ,
74+ config:: tree:: { keys, Merge } ,
75+ } ;
76+
77+ pub struct ConflictStyle ;
78+ impl keys:: Validate for ConflictStyle {
79+ fn validate ( & self , value : & BStr ) -> Result < ( ) , Box < dyn std:: error:: Error + Send + Sync + ' static > > {
80+ Merge :: CONFLICT_STYLE . try_into_conflict_style ( value. into ( ) ) ?;
81+ Ok ( ( ) )
82+ }
83+ }
84+ }
0 commit comments