Skip to content

Commit 847188a

Browse files
committed
fix: serialize and deserialize PackageId the way the runtime expects
1 parent 95a4b04 commit 847188a

File tree

1 file changed

+89
-6
lines changed

1 file changed

+89
-6
lines changed

src/types/package_id.rs

Lines changed: 89 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,17 +30,100 @@ impl Serialize for PackageId {
3030
where
3131
S: serde::ser::Serializer,
3232
{
33-
format!("{}", self).serialize(serializer)
33+
use serde::ser::SerializeStruct;
34+
let mut state = serializer.serialize_struct("PackageId", 2)?;
35+
state.serialize_field("package_name", &self.package_name)?;
36+
state.serialize_field("publisher_node", &self.publisher_node)?;
37+
state.end()
3438
}
3539
}
3640

37-
impl<'a> Deserialize<'a> for PackageId {
38-
fn deserialize<D>(deserializer: D) -> Result<PackageId, D::Error>
41+
impl<'de> Deserialize<'de> for PackageId {
42+
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
3943
where
40-
D: serde::de::Deserializer<'a>,
44+
D: serde::de::Deserializer<'de>,
4145
{
42-
let s = String::deserialize(deserializer)?;
43-
s.parse().map_err(serde::de::Error::custom)
46+
use serde::de::{Deserialize, Visitor};
47+
enum Field {
48+
PackageName,
49+
PublisherNode,
50+
}
51+
52+
impl<'de> Deserialize<'de> for Field {
53+
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
54+
where
55+
D: serde::de::Deserializer<'de>,
56+
{
57+
struct FieldVisitor;
58+
59+
impl<'de> Visitor<'de> for FieldVisitor {
60+
type Value = Field;
61+
62+
fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
63+
formatter.write_str("`package_name` or `publisher_node`")
64+
}
65+
66+
fn visit_str<E>(self, value: &str) -> Result<Field, E>
67+
where
68+
E: serde::de::Error,
69+
{
70+
match value {
71+
"package_name" => Ok(Field::PackageName),
72+
"publisher_node" => Ok(Field::PublisherNode),
73+
_ => Err(serde::de::Error::unknown_field(value, FIELDS)),
74+
}
75+
}
76+
}
77+
78+
const FIELDS: &'static [&'static str] = &["package_name", "publisher_node"];
79+
deserializer.deserialize_identifier(FieldVisitor)
80+
}
81+
}
82+
83+
struct PackageIdVisitor;
84+
85+
impl<'de> Visitor<'de> for PackageIdVisitor {
86+
type Value = PackageId;
87+
88+
fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
89+
formatter.write_str("struct PackageId")
90+
}
91+
92+
fn visit_map<V>(self, mut map: V) -> Result<PackageId, V::Error>
93+
where
94+
V: serde::de::MapAccess<'de>,
95+
{
96+
let mut package_name = None;
97+
let mut publisher_node = None;
98+
while let Some(key) = map.next_key()? {
99+
match key {
100+
Field::PackageName => {
101+
if package_name.is_some() {
102+
return Err(serde::de::Error::duplicate_field("package_name"));
103+
}
104+
package_name = Some(map.next_value()?);
105+
}
106+
Field::PublisherNode => {
107+
if publisher_node.is_some() {
108+
return Err(serde::de::Error::duplicate_field("publisher_node"));
109+
}
110+
publisher_node = Some(map.next_value()?);
111+
}
112+
}
113+
}
114+
let package_name =
115+
package_name.ok_or_else(|| serde::de::Error::missing_field("package_name"))?;
116+
let publisher_node = publisher_node
117+
.ok_or_else(|| serde::de::Error::missing_field("publisher_node"))?;
118+
Ok(PackageId {
119+
package_name,
120+
publisher_node,
121+
})
122+
}
123+
}
124+
125+
const FIELDS: &'static [&'static str] = &["package_name", "publisher_node"];
126+
deserializer.deserialize_struct("PackageId", FIELDS, PackageIdVisitor)
44127
}
45128
}
46129

0 commit comments

Comments
 (0)