@@ -3,6 +3,7 @@ use std::{
33 path:: { Path , PathBuf } ,
44} ;
55
6+ use rustc_hash:: FxHashMap ;
67use schemars:: JsonSchema ;
78use serde:: { Deserialize , Serialize } ;
89
@@ -141,6 +142,56 @@ impl Oxlintrc {
141142
142143 Ok ( config)
143144 }
145+
146+ /// Merges two [Oxlintrc] files together
147+ /// [Self] takes priority over `other`
148+ #[ must_use]
149+ pub fn merge ( & self , other : Oxlintrc ) -> Oxlintrc {
150+ let mut categories = other. categories . clone ( ) ;
151+ categories. extend ( self . categories . iter ( ) ) ;
152+
153+ let rules = self
154+ . rules
155+ . rules
156+ . iter ( )
157+ . chain ( & other. rules . rules )
158+ . fold ( FxHashMap :: default ( ) , |mut rules_set, rule| {
159+ if rules_set. contains_key ( & ( & rule. plugin_name , & rule. rule_name ) ) {
160+ return rules_set;
161+ }
162+ rules_set. insert ( ( & rule. plugin_name , & rule. rule_name ) , rule) ;
163+ rules_set
164+ } )
165+ . values ( )
166+ . map ( |rule| ( * * rule) . clone ( ) )
167+ . collect :: < Vec < _ > > ( ) ;
168+
169+ let settings = self . settings . clone ( ) ;
170+ let env = self . env . clone ( ) ;
171+ let globals = self . globals . clone ( ) ;
172+
173+ let mut overrides = self . overrides . clone ( ) ;
174+ overrides. extend ( other. overrides ) ;
175+
176+ Oxlintrc {
177+ plugins : other. plugins . union ( self . plugins ) ,
178+ categories,
179+ rules : OxlintRules :: new ( rules) ,
180+ settings,
181+ env,
182+ globals,
183+ overrides,
184+ path : self . path . clone ( ) ,
185+ ignore_patterns : self
186+ . ignore_patterns
187+ . clone ( )
188+ . iter ( )
189+ . chain ( & other. ignore_patterns )
190+ . map ( std:: string:: ToString :: to_string)
191+ . collect :: < Vec < _ > > ( ) ,
192+ extends : self . extends . clone ( ) ,
193+ }
194+ }
144195}
145196
146197fn is_json_ext ( ext : & str ) -> bool {
0 commit comments