11use std:: collections:: { hash_set, HashSet } ;
22use std:: fmt;
33use std:: path:: { Path , PathBuf } ;
4+ use std:: str:: FromStr ;
45
56use rustfmt_config_proc_macro:: config_type;
67use serde:: de:: { SeqAccess , Visitor } ;
@@ -118,7 +119,7 @@ pub enum GroupImportsTactic {
118119 StdExternalCrate ,
119120}
120121
121- #[ config_type ]
122+ #[ derive ( Debug , Copy , Clone , Eq , PartialEq , Serialize ) ]
122123/// How to merge imports.
123124pub enum MergeImports {
124125 /// Do not merge imports.
@@ -129,6 +130,50 @@ pub enum MergeImports {
129130 Module ,
130131}
131132
133+ impl FromStr for MergeImports {
134+ type Err = & ' static str ;
135+
136+ fn from_str ( s : & str ) -> Result < Self , Self :: Err > {
137+ if "false" . eq_ignore_ascii_case ( s) {
138+ eprintln ! ( "Warning: merge_imports=false is being renamed to Never" ) ;
139+ return Ok ( MergeImports :: Never ) ;
140+ }
141+ if "true" . eq_ignore_ascii_case ( s) {
142+ eprintln ! ( "Warning: merge_imports=true is being renamed to Crate" ) ;
143+ return Ok ( MergeImports :: Crate ) ;
144+ }
145+ if "Never" . eq_ignore_ascii_case ( s) {
146+ return Ok ( MergeImports :: Never ) ;
147+ }
148+ if "Crate" . eq_ignore_ascii_case ( s) {
149+ return Ok ( MergeImports :: Crate ) ;
150+ }
151+ if "Module" . eq_ignore_ascii_case ( s) {
152+ return Ok ( MergeImports :: Module ) ;
153+ }
154+ return Err ( "Bad variant, expected one of: `Never` `Crate` `Module`" ) ;
155+ }
156+ }
157+
158+ impl fmt:: Display for MergeImports {
159+ fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
160+ write ! ( f, "{:?}" , self )
161+ }
162+ }
163+
164+ impl < ' de > Deserialize < ' de > for MergeImports {
165+ fn deserialize < D > ( deserializer : D ) -> Result < Self , D :: Error >
166+ where
167+ D : Deserializer < ' de > ,
168+ {
169+ let s = String :: deserialize ( deserializer) ?;
170+ Self :: from_str ( & s) . map_err ( |_| {
171+ static ALLOWED : & ' static [ & str ] = & [ "Never" , "Crate" , "Module" ] ;
172+ serde:: de:: Error :: unknown_variant ( & s, ALLOWED )
173+ } )
174+ }
175+ }
176+
132177#[ config_type]
133178pub enum ReportTactic {
134179 Always ,
@@ -328,7 +373,7 @@ impl IgnoreList {
328373 }
329374}
330375
331- impl std :: str :: FromStr for IgnoreList {
376+ impl FromStr for IgnoreList {
332377 type Err = & ' static str ;
333378
334379 fn from_str ( _: & str ) -> Result < Self , Self :: Err > {
0 commit comments