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}