Skip to content

Commit b146a57

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

File tree

4 files changed

+76
-0
lines changed

4 files changed

+76
-0
lines changed

Cargo.lock

Lines changed: 3 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: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,13 @@ crate-type = ["lib", "cdylib", "staticlib"]
1616
[dependencies]
1717
anyhow = { workspace = true }
1818
async-trait = { workspace = true }
19+
bincode = { version = "2.0.1" }
1920
blake2 = "0.10.6"
2021
mithril-cardano-node-chain = { path = "../cardano-node/mithril-cardano-node-chain" }
2122
mithril-common = { path = "../../mithril-common" }
2223
pallas-network = { git = "https://github.com/txpipe/pallas.git", branch = "main" }
24+
serde = { workspace = true }
25+
serde_bytes = "0.11.17"
2326
slog = { workspace = true }
2427
tokio = { workspace = true, features = ["sync"] }
2528

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
use std::ops::{Deref, DerefMut};
2+
3+
use pallas_network::miniprotocols::localmsgsubmission::DmqMsg;
4+
use serde::{Deserialize, Deserializer, Serialize, Serializer};
5+
6+
/// Type alias for a DMQ message.
7+
#[derive(Debug, Clone, PartialEq, Eq)]
8+
pub struct DmqMessage(DmqMsg);
9+
10+
#[derive(Serialize, Deserialize)]
11+
struct RawBytes(#[serde(with = "serde_bytes")] Vec<u8>);
12+
13+
impl Deref for DmqMessage {
14+
type Target = DmqMsg;
15+
16+
fn deref(&self) -> &Self::Target {
17+
&self.0
18+
}
19+
}
20+
21+
impl DerefMut for DmqMessage {
22+
fn deref_mut(&mut self) -> &mut Self::Target {
23+
&mut self.0
24+
}
25+
}
26+
27+
impl From<DmqMsg> for DmqMessage {
28+
fn from(msg: DmqMsg) -> Self {
29+
Self(msg)
30+
}
31+
}
32+
33+
impl From<DmqMessage> for DmqMsg {
34+
fn from(msg: DmqMessage) -> Self {
35+
msg.0
36+
}
37+
}
38+
39+
impl Serialize for DmqMessage {
40+
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
41+
where
42+
S: Serializer,
43+
{
44+
let raw_bytes = RawBytes(
45+
bincode::serde::encode_to_vec(self, bincode::config::standard()).map_err(|e| {
46+
serde::ser::Error::custom(format!("DMQ message serialization error: {e}"))
47+
})?,
48+
);
49+
50+
raw_bytes.serialize(serializer)
51+
}
52+
}
53+
54+
impl<'de> Deserialize<'de> for DmqMessage {
55+
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
56+
where
57+
D: Deserializer<'de>,
58+
{
59+
let raw_bytes = RawBytes::deserialize(deserializer)?;
60+
let (res, _) =
61+
bincode::serde::decode_from_slice::<Self, _>(&raw_bytes.0, bincode::config::standard())
62+
.map_err(|e| {
63+
serde::de::Error::custom(format!("DMQ message deserialization error: {e}"))
64+
})?;
65+
66+
Ok(res)
67+
}
68+
}

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)