@@ -5,7 +5,8 @@ use rustc_hash::FxHashMap;
55use schemars:: { gen:: SchemaGenerator , schema:: Schema , JsonSchema } ;
66use serde:: {
77 de:: { self , Deserializer , Visitor } ,
8- Deserialize ,
8+ ser:: SerializeMap ,
9+ Deserialize , Serialize ,
910} ;
1011
1112use crate :: {
@@ -58,6 +59,32 @@ impl JsonSchema for OxlintRules {
5859 }
5960}
6061
62+ impl Serialize for OxlintRules {
63+ fn serialize < S > ( & self , s : S ) -> Result < S :: Ok , S :: Error >
64+ where
65+ S : serde:: Serializer ,
66+ {
67+ let mut rules = s. serialize_map ( Some ( self . len ( ) ) ) ?;
68+
69+ for rule in & self . 0 {
70+ let key = rule. full_name ( ) ;
71+ match rule. config . as_ref ( ) {
72+ // e.g. unicorn/some-rule: ["warn", { foo: "bar" }]
73+ Some ( config) if !config. is_null ( ) => {
74+ let value = ( rule. severity . as_str ( ) , config) ;
75+ rules. serialize_entry ( & key, & value) ?;
76+ }
77+ // e.g. unicorn/some-rule: "warn"
78+ _ => {
79+ rules. serialize_entry ( & key, rule. severity . as_str ( ) ) ?;
80+ }
81+ }
82+ }
83+
84+ rules. end ( )
85+ }
86+ }
87+
6188// Manually implement Deserialize because the type is a bit complex...
6289// - Handle single value form and array form
6390// - SeverityConf into AllowWarnDeny
@@ -174,6 +201,18 @@ fn failed_to_parse_rule_value(value: &str, err: &str) -> OxcDiagnostic {
174201 OxcDiagnostic :: error ( format ! ( "Failed to rule value {value:?} with error {err:?}" ) )
175202}
176203
204+ impl ESLintRule {
205+ /// Returns `<plugin_name>/<rule_name>` for non-eslint rules. For eslint rules, returns
206+ /// `<rule_name>`. This is effectively the inverse operation for [`parse_rule_key`].
207+ fn full_name ( & self ) -> Cow < ' _ , str > {
208+ if self . plugin_name == "eslint" {
209+ Cow :: Borrowed ( self . rule_name . as_str ( ) )
210+ } else {
211+ Cow :: Owned ( format ! ( "{}/{}" , self . plugin_name, self . rule_name) )
212+ }
213+ }
214+ }
215+
177216#[ cfg( test) ]
178217mod test {
179218 use serde:: Deserialize ;
0 commit comments