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}