mithril_dmq/model/
message.rs1use std::ops::{Deref, DerefMut};
2
3use pallas_codec::minicbor::{Decode, Decoder, Encode, Encoder};
4use pallas_network::miniprotocols::localmsgsubmission::DmqMsg;
5use serde::{Deserialize, Deserializer, Serialize, Serializer};
6
7#[derive(Debug, Clone, PartialEq, Eq)]
9pub struct DmqMessage(DmqMsg);
10
11#[derive(Serialize, Deserialize)]
12struct RawBytes(#[serde(with = "serde_bytes")] Vec<u8>);
13
14impl Deref for DmqMessage {
15 type Target = DmqMsg;
16
17 fn deref(&self) -> &Self::Target {
18 &self.0
19 }
20}
21
22impl DerefMut for DmqMessage {
23 fn deref_mut(&mut self) -> &mut Self::Target {
24 &mut self.0
25 }
26}
27
28impl From<DmqMsg> for DmqMessage {
29 fn from(msg: DmqMsg) -> Self {
30 Self(msg)
31 }
32}
33
34impl From<DmqMessage> for DmqMsg {
35 fn from(msg: DmqMessage) -> Self {
36 msg.0
37 }
38}
39
40impl Serialize for DmqMessage {
41 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
42 where
43 S: Serializer,
44 {
45 let raw_bytes = RawBytes({
46 let mut e = Encoder::new(Vec::new());
47 self.0.encode(&mut e, &mut ()).map_err(|e| {
48 serde::ser::Error::custom(format!("DMQ message serialization error: {e}"))
49 })?;
50 Ok(e.into_writer())
51 }?);
52
53 raw_bytes.serialize(serializer)
54 }
55}
56
57impl<'de> Deserialize<'de> for DmqMessage {
58 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
59 where
60 D: Deserializer<'de>,
61 {
62 let raw_bytes = RawBytes::deserialize(deserializer)?;
63 let res = DmqMsg::decode(&mut Decoder::new(&raw_bytes.0), &mut ())
64 .map_err(|e| {
65 serde::de::Error::custom(format!("DMQ message deserialization error: {e}"))
66 })?
67 .into();
68
69 Ok(res)
70 }
71}
72
73#[cfg(test)]
74mod tests {
75 use super::*;
76
77 #[test]
78 fn test_dmq_message_serialize_deserialize() {
79 let dmq_msg = DmqMsg {
80 msg_id: vec![1, 2, 3],
81 msg_body: vec![4, 5, 6],
82 block_number: 123,
83 ttl: 10,
84 kes_signature: vec![7, 8, 9],
85 operational_certificate: vec![10, 11, 12],
86 kes_period: 0,
87 };
88
89 let dmq_message = DmqMessage::from(dmq_msg.clone());
90 let serialized = bincode::serde::encode_to_vec(&dmq_message, bincode::config::standard())
91 .expect("Serialization failed");
92
93 let (deserialized, _) =
94 bincode::serde::decode_from_slice(&serialized, bincode::config::standard())
95 .expect("Deserialization failed");
96
97 assert_eq!(dmq_message, deserialized);
98 assert_eq!(dmq_message.0, dmq_msg);
99 }
100}