swc_vue_jsx_visitor/
options.rs

1use 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
65/// Serde visitor for parsing string as the [`Regex`] type.
66struct 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}