typeshare_model/
config.rs

1/*!
2Utilities for configuration for Language implementations
3 */
4
5use serde::{de, ser};
6
7/// Languages that take no configuration can use this as their
8/// `Language::Config` type
9#[derive(Debug, Clone, Copy, Default)]
10pub struct Unconfigured;
11
12struct DeadKey;
13
14impl<'de> de::Deserialize<'de> for DeadKey {
15    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
16    where
17        D: de::Deserializer<'de>,
18    {
19        deserializer.deserialize_identifier({
20            struct Visitor;
21
22            impl<'de> de::Visitor<'de> for Visitor {
23                type Value = DeadKey;
24
25                fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
26                    formatter.write_str("a struct key")
27                }
28
29                fn visit_str<E>(self, _v: &str) -> Result<Self::Value, E>
30                where
31                    E: de::Error,
32                {
33                    Ok(DeadKey)
34                }
35
36                fn visit_bytes<E>(self, _v: &[u8]) -> Result<Self::Value, E>
37                where
38                    E: de::Error,
39                {
40                    Ok(DeadKey)
41                }
42            }
43
44            Visitor
45        })
46    }
47}
48
49impl ser::Serialize for Unconfigured {
50    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
51    where
52        S: serde::Serializer,
53    {
54        use ser::SerializeStruct as _;
55
56        serializer.serialize_struct("Unconfigured", 0)?.end()
57    }
58}
59
60impl<'de> serde::Deserialize<'de> for Unconfigured {
61    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
62    where
63        D: serde::Deserializer<'de>,
64    {
65        deserializer.deserialize_struct("Unconfigured", &[], {
66            struct Visitor;
67
68            impl<'de> de::Visitor<'de> for Visitor {
69                type Value = Unconfigured;
70
71                fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
72                    write!(formatter, "an empty struct")
73                }
74
75                fn visit_map<A>(self, mut map: A) -> Result<Self::Value, A::Error>
76                where
77                    A: de::MapAccess<'de>,
78                {
79                    while let Some((DeadKey, de::IgnoredAny)) = map.next_entry()? {}
80                    Ok(Unconfigured)
81                }
82            }
83
84            Visitor
85        })
86    }
87}