Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 32 additions & 5 deletions message/src/versions/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -246,7 +246,9 @@ impl<'de> serde::Deserialize<'de> for VersionedMessage {
where
D: Deserializer<'de>,
{
struct MessageVisitor;
struct MessageVisitor {
is_human_readable: bool,
}

impl<'de> Visitor<'de> for MessageVisitor {
type Value = VersionedMessage;
Expand All @@ -259,10 +261,28 @@ impl<'de> serde::Deserialize<'de> for VersionedMessage {
where
A: SeqAccess<'de>,
{
let prefix: MessagePrefix = seq
.next_element()?
.ok_or_else(|| de::Error::invalid_length(0, &self))?;
let prefix = if self.is_human_readable {
#[derive(Deserialize)]
#[serde(untagged)]
enum PrefixOrLegacy {
Prefix(MessagePrefix),
Legacy(LegacyMessage),
}
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We cannot use this or other branching with deserialize_any for bincode as it doesn't support deserialize_any, so apply this iff the given deserializer is human readable.


let prefix_or_legacy: PrefixOrLegacy = seq
.next_element()?
.ok_or_else(|| de::Error::invalid_length(0, &self))?;

match prefix_or_legacy {
PrefixOrLegacy::Prefix(prefix) => prefix,
PrefixOrLegacy::Legacy(message) => {
return Ok(VersionedMessage::Legacy(message));
}
}
} else {
seq.next_element()?
.ok_or_else(|| de::Error::invalid_length(0, &self))?
};
match prefix {
MessagePrefix::Legacy(num_required_signatures) => {
// The remaining fields of the legacy Message struct after the first byte.
Expand Down Expand Up @@ -322,7 +342,8 @@ impl<'de> serde::Deserialize<'de> for VersionedMessage {
}
}

deserializer.deserialize_tuple(2, MessageVisitor)
let is_human_readable = deserializer.is_human_readable();
deserializer.deserialize_tuple(2, MessageVisitor { is_human_readable })
}
}

Expand Down Expand Up @@ -377,8 +398,14 @@ mod tests {
// serde_json
{
let string = serde_json::to_string(&message).unwrap();
let wrapped_string = serde_json::to_string(&wrapped_message).unwrap();

let message_from_string: LegacyMessage = serde_json::from_str(&string).unwrap();
let wrapped_message_from_string: VersionedMessage =
serde_json::from_str(&wrapped_string).unwrap();

assert_eq!(message, message_from_string);
assert_eq!(wrapped_message, wrapped_message_from_string);
}
}

Expand Down