swc_config/
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}
15
16impl Default for IsModule {
17    fn default() -> Self {
18        IsModule::Bool(true)
19    }
20}
21
22impl Merge for IsModule {
23    fn merge(&mut self, other: Self) {
24        if *self == Default::default() {
25            *self = other;
26        }
27    }
28}
29
30impl Serialize for IsModule {
31    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
32    where
33        S: Serializer,
34    {
35        match *self {
36            IsModule::Bool(ref b) => b.serialize(serializer),
37            IsModule::Unknown => "unknown".serialize(serializer),
38        }
39    }
40}
41
42struct IsModuleVisitor;
43
44impl Visitor<'_> for IsModuleVisitor {
45    type Value = IsModule;
46
47    fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
48        formatter.write_str("a boolean or the string 'unknown'")
49    }
50
51    fn visit_bool<E>(self, b: bool) -> Result<Self::Value, E>
52    where
53        E: serde::de::Error,
54    {
55        Ok(IsModule::Bool(b))
56    }
57
58    fn visit_str<E>(self, s: &str) -> Result<Self::Value, E>
59    where
60        E: serde::de::Error,
61    {
62        match s {
63            "unknown" => Ok(IsModule::Unknown),
64            _ => Err(serde::de::Error::invalid_value(Unexpected::Str(s), &self)),
65        }
66    }
67}
68
69impl<'de> Deserialize<'de> for IsModule {
70    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
71    where
72        D: Deserializer<'de>,
73    {
74        deserializer.deserialize_any(IsModuleVisitor)
75    }
76}