Skip to content

Commit 28d356a

Browse files
committed
Refactor to use an enum.
1 parent 84426a7 commit 28d356a

File tree

1 file changed

+31
-20
lines changed

1 file changed

+31
-20
lines changed

crates/oxc_linter/src/rules/react/jsx_fragments.rs

Lines changed: 31 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,26 @@ fn jsx_fragments_diagnostic(span: Span, mode: FragmentMode) -> OxcDiagnostic {
2222
OxcDiagnostic::warn(msg).with_help(help).with_label(span)
2323
}
2424

25-
#[derive(Debug, Default, Clone)]
26-
pub struct JsxFragments {
27-
mode: FragmentMode,
25+
#[derive(Debug, Clone, JsonSchema, Deserialize)]
26+
#[serde(untagged)]
27+
pub enum JsxFragments {
28+
Mode(FragmentMode),
29+
Object { mode: FragmentMode },
30+
}
31+
32+
impl Default for JsxFragments {
33+
fn default() -> Self {
34+
JsxFragments::Mode(FragmentMode::Syntax)
35+
}
36+
}
37+
38+
impl JsxFragments {
39+
fn mode(&self) -> FragmentMode {
40+
match self {
41+
JsxFragments::Mode(m) => *m,
42+
JsxFragments::Object { mode } => *mode,
43+
}
44+
}
2845
}
2946

3047
#[derive(Debug, Default, Clone, PartialEq, Eq, Copy, JsonSchema, Deserialize, Serialize)]
@@ -66,12 +83,6 @@ pub enum FragmentMode {
6683
Element,
6784
}
6885

69-
impl From<&str> for FragmentMode {
70-
fn from(value: &str) -> Self {
71-
if value == "element" { Self::Element } else { Self::Syntax }
72-
}
73-
}
74-
7586
declare_oxc_lint!(
7687
/// ### What it does
7788
///
@@ -91,18 +102,18 @@ impl Rule for JsxFragments {
91102
// Generally we should prefer the string-only syntax for compatibility with the original ESLint rule,
92103
// but we originally implemented the rule with only the object syntax, so we support both now.
93104
fn from_configuration(value: Value) -> Self {
94-
Self {
95-
mode: value
96-
.get(0)
97-
.and_then(|v| v.as_str().or_else(|| v.get("mode").and_then(Value::as_str)))
98-
.map(FragmentMode::from)
99-
.unwrap_or_default(),
100-
}
105+
// We expect configuration to be an array with a single argument like ["syntax"] or [{"mode":"element"}]
106+
// Take the first element and deserialize that into our helper enum which supports both forms.
107+
value
108+
.get(0)
109+
.cloned()
110+
.and_then(|v| serde_json::from_value::<JsxFragments>(v).ok())
111+
.unwrap_or_default()
101112
}
102113

103114
fn run<'a>(&self, node: &AstNode<'a>, ctx: &LintContext<'a>) {
104115
match node.kind() {
105-
AstKind::JSXElement(jsx_elem) if self.mode == FragmentMode::Syntax => {
116+
AstKind::JSXElement(jsx_elem) if self.mode() == FragmentMode::Syntax => {
106117
let Some(closing_element) = &jsx_elem.closing_element else {
107118
return;
108119
};
@@ -112,7 +123,7 @@ impl Rule for JsxFragments {
112123
return;
113124
}
114125
ctx.diagnostic_with_fix(
115-
jsx_fragments_diagnostic(jsx_elem.opening_element.name.span(), self.mode),
126+
jsx_fragments_diagnostic(jsx_elem.opening_element.name.span(), self.mode()),
116127
|fixer| {
117128
let before_opening_tag = ctx.source_range(Span::new(
118129
jsx_elem.span().start,
@@ -136,9 +147,9 @@ impl Rule for JsxFragments {
136147
},
137148
);
138149
}
139-
AstKind::JSXFragment(jsx_frag) if self.mode == FragmentMode::Element => {
150+
AstKind::JSXFragment(jsx_frag) if self.mode() == FragmentMode::Element => {
140151
ctx.diagnostic_with_fix(
141-
jsx_fragments_diagnostic(jsx_frag.opening_fragment.span(), self.mode),
152+
jsx_fragments_diagnostic(jsx_frag.opening_fragment.span(), self.mode()),
142153
|fixer| {
143154
let before_opening_tag = ctx.source_range(Span::new(
144155
jsx_frag.span().start,

0 commit comments

Comments
 (0)