swc_config/
is_module.rs

1use std::fmt;
2
3use serde::{
4    de::{Unexpected, Visitor},
5    Deserialize, Deserializer, Serialize, Serializer,
6};
7
8use crate::merge::Merge;
9
10#[derive(Clone, Debug, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
11pub enum IsModule {
12    Bool(bool),
13    Unknown,
14    CommonJS,
15}
16
17impl Default for IsModule {
18    fn default() -> Self {
19        IsModule::Bool(true)
20    }
21}
22
23impl Merge for IsModule {
24    fn merge(&mut self, other: Self) {
25        if *self == Default::default() {
26            *self = other;
27        }
28    }
29}
30
31impl Serialize for IsModule {
32    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
33    where
34        S: Serializer,
35    {
36        match *self {
37            IsModule::Bool(ref b) => b.serialize(serializer),
38            IsModule::Unknown => "unknown".serialize(serializer),
39            IsModule::CommonJS => "commonjs".serialize(serializer),
40        }
41    }
42}
43
44struct IsModuleVisitor;
45
46impl Visitor<'_> for IsModuleVisitor {
47    type Value = IsModule;
48
49    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
50        formatter.write_str("a boolean or the string 'unknown'")
51    }
52
53    fn visit_bool<E>(self, b: bool) -> Result<Self::Value, E>
54    where
55        E: serde::de::Error,
56    {
57        Ok(IsModule::Bool(b))
58    }
59
60    fn visit_str<E>(self, s: &str) -> Result<Self::Value, E>
61    where
62        E: serde::de::Error,
63    {
64        match s {
65            "unknown" => Ok(IsModule::Unknown),
66            "commonjs" => Ok(IsModule::CommonJS),
67            _ => Err(serde::de::Error::invalid_value(Unexpected::Str(s), &self)),
68        }
69    }
70}
71
72impl<'de> Deserialize<'de> for IsModule {
73    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
74    where
75        D: Deserializer<'de>,
76    {
77        deserializer.deserialize_any(IsModuleVisitor)
78    }
79}