forked from x52dev/oas3-rs
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathspec_extensions.rs
66 lines (56 loc) · 1.71 KB
/
spec_extensions.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
use std::{
collections::{BTreeMap, HashMap},
fmt,
};
use serde::{de, Deserializer, Serializer};
#[cfg(feature = "yaml_spec")]
type KeyType = serde_yaml::Value;
#[cfg(not(feature = "yaml_spec"))]
type KeyType = serde_json::Value;
/// Deserializes fields of a map beginning with `x-`.
pub(crate) fn deserialize<'de, D>(
deserializer: D,
) -> Result<BTreeMap<String, serde_json::Value>, D::Error>
where
D: Deserializer<'de>,
{
struct ExtraFieldsVisitor;
impl<'de> de::Visitor<'de> for ExtraFieldsVisitor {
type Value = BTreeMap<String, serde_json::Value>;
fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
formatter.write_str("extensions")
}
fn visit_map<M>(self, mut access: M) -> Result<Self::Value, M::Error>
where
M: de::MapAccess<'de>,
{
let mut map = HashMap::<KeyType, serde_json::Value>::new();
while let Some((key, value)) = access.next_entry()? {
map.insert(key, value);
}
Ok(map
.into_iter()
.filter_map(|(key, value)| {
key.as_str()?
.strip_prefix("x-")
.map(|key| (key.to_owned(), value))
})
.collect())
}
}
deserializer.deserialize_map(ExtraFieldsVisitor)
}
/// Serializes fields of a map prefixed with `x-`.
pub(crate) fn serialize<S>(
extensions: &BTreeMap<String, serde_json::Value>,
serializer: S,
) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
serializer.collect_map(
extensions
.iter()
.map(|(key, value)| (format!("x-{key}"), value)),
)
}