swc_vue_jsx_visitor/
options.rs1use serde::{
2 de::{Error, Unexpected, Visitor},
3 Deserialize, Deserializer,
4};
5use std::{fmt, ops::Deref};
6
7#[derive(Clone, Debug, Deserialize)]
8#[serde(rename_all = "camelCase", default)]
9pub struct Options {
10 pub transform_on: bool,
11 pub optimize: bool,
12 pub custom_element_patterns: Vec<Regex>,
13 pub merge_props: bool,
14 pub enable_object_slots: bool,
15 pub pragma: Option<String>,
16 pub resolve_type: bool,
17}
18
19impl Default for Options {
20 fn default() -> Self {
21 Self {
22 transform_on: false,
23 optimize: false,
24 custom_element_patterns: Default::default(),
25 merge_props: true,
26 enable_object_slots: true,
27 pragma: None,
28 resolve_type: false,
29 }
30 }
31}
32
33#[derive(Clone, Debug)]
34pub struct Regex(regex::Regex);
35
36impl Regex {
37 pub fn new(re: &str) -> Result<Self, regex::Error> {
38 regex::Regex::new(re).map(Self)
39 }
40}
41
42impl From<regex::Regex> for Regex {
43 fn from(value: regex::Regex) -> Self {
44 Self(value)
45 }
46}
47
48impl Deref for Regex {
49 type Target = regex::Regex;
50
51 fn deref(&self) -> &Self::Target {
52 &self.0
53 }
54}
55
56impl<'de> Deserialize<'de> for Regex {
57 fn deserialize<D>(deserializer: D) -> Result<Regex, D::Error>
58 where
59 D: Deserializer<'de>,
60 {
61 deserializer.deserialize_string(RegexVisitor)
62 }
63}
64
65struct RegexVisitor;
67
68impl Visitor<'_> for RegexVisitor {
69 type Value = Regex;
70
71 fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
72 write!(formatter, "a string that represents a regex")
73 }
74
75 fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>
76 where
77 E: Error,
78 {
79 regex::Regex::new(v)
80 .map(Regex)
81 .map_err(|_| E::invalid_value(Unexpected::Str(v), &"a valid regex"))
82 }
83
84 fn visit_string<E>(self, v: String) -> Result<Self::Value, E>
85 where
86 E: Error,
87 {
88 regex::Regex::new(&v)
89 .map(Regex)
90 .map_err(|_| E::invalid_value(Unexpected::Str(&v), &"a valid regex"))
91 }
92}