Skip to content

Commit e2ef2a7

Browse files
committed
feat(dmq): add 'DmqMessage' type to wrap a 'DmqMsg'
1 parent bbaf832 commit e2ef2a7

File tree

4 files changed

+114
-0
lines changed

4 files changed

+114
-0
lines changed

Cargo.lock

Lines changed: 4 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/mithril-dmq/Cargo.toml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,24 @@ license.workspace = true
1010
repository.workspace = true
1111
include = ["**/*.rs", "Cargo.toml", "README.md", ".gitignore"]
1212

13+
[package.metadata.cargo-machete]
14+
# `serde_bytes` is used for DmqMessage serialization
15+
ignored = ["serde_bytes"]
16+
1317
[lib]
1418
crate-type = ["lib", "cdylib", "staticlib"]
1519

1620
[dependencies]
1721
anyhow = { workspace = true }
1822
async-trait = { workspace = true }
23+
bincode = { version = "2.0.1" }
1924
blake2 = "0.10.6"
2025
mithril-cardano-node-chain = { path = "../cardano-node/mithril-cardano-node-chain" }
2126
mithril-common = { path = "../../mithril-common" }
2227
pallas-network = { git = "https://github.com/txpipe/pallas.git", branch = "main" }
28+
pallas-codec = { git = "https://github.com/txpipe/pallas.git", branch = "main" }
29+
serde = { workspace = true }
30+
serde_bytes = "0.11.17"
2331
slog = { workspace = true }
2432
tokio = { workspace = true, features = ["sync"] }
2533

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
use std::ops::{Deref, DerefMut};
2+
3+
use pallas_codec::minicbor::{Decode, Decoder, Encode, Encoder};
4+
use pallas_network::miniprotocols::localmsgsubmission::DmqMsg;
5+
use serde::{Deserialize, Deserializer, Serialize, Serializer};
6+
7+
/// Type alias for a DMQ message.
8+
#[derive(Debug, Clone, PartialEq, Eq)]
9+
pub struct DmqMessage(DmqMsg);
10+
11+
#[derive(Serialize, Deserialize)]
12+
struct RawBytes(#[serde(with = "serde_bytes")] Vec<u8>);
13+
14+
impl Deref for DmqMessage {
15+
type Target = DmqMsg;
16+
17+
fn deref(&self) -> &Self::Target {
18+
&self.0
19+
}
20+
}
21+
22+
impl DerefMut for DmqMessage {
23+
fn deref_mut(&mut self) -> &mut Self::Target {
24+
&mut self.0
25+
}
26+
}
27+
28+
impl From<DmqMsg> for DmqMessage {
29+
fn from(msg: DmqMsg) -> Self {
30+
Self(msg)
31+
}
32+
}
33+
34+
impl From<DmqMessage> for DmqMsg {
35+
fn from(msg: DmqMessage) -> Self {
36+
msg.0
37+
}
38+
}
39+
40+
impl 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+
57+
impl<'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)]
74+
mod 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+
}

internal/mithril-dmq/src/model/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
11
mod builder;
2+
mod message;
23

34
pub use builder::*;
5+
pub use message::*;

0 commit comments

Comments
 (0)