Skip to content

Commit 7288c7c

Browse files
feat: add payload_json to publish and request builders
1 parent d064720 commit 7288c7c

File tree

2 files changed

+36
-8
lines changed

2 files changed

+36
-8
lines changed

watermelon/src/client/commands/publish.rs

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use std::{
44
};
55

66
use bytes::Bytes;
7+
use serde::Serialize;
78
use watermelon_proto::{
89
MessageBase, Subject,
910
headers::{HeaderMap, HeaderName, HeaderValue},
@@ -65,7 +66,7 @@ pub struct DoOwnedClientPublish {
6566
}
6667

6768
macro_rules! publish {
68-
() => {
69+
($payload_t:ty) => {
6970
#[must_use]
7071
pub fn reply_subject(mut self, reply_subject: Option<Subject>) -> Self {
7172
self.publish_mut().reply_subject = reply_subject;
@@ -83,6 +84,19 @@ macro_rules! publish {
8384
self.publish_mut().headers = headers;
8485
self
8586
}
87+
88+
/// Serialize `payload` to JSON and use it as the payload
89+
///
90+
/// # Errors
91+
///
92+
/// Returns an error if the serializer fails
93+
pub fn payload_json<T: Serialize>(
94+
self,
95+
payload: &T,
96+
) -> Result<$payload_t, serde_json::Error> {
97+
let payload = serde_json::to_vec(payload)?;
98+
Ok(self.payload(payload.into()))
99+
}
86100
};
87101
}
88102

@@ -145,7 +159,7 @@ impl PublishBuilder {
145159
}
146160
}
147161

148-
publish!();
162+
publish!(Publish);
149163

150164
#[must_use]
151165
pub fn payload(mut self, payload: Bytes) -> Publish {
@@ -166,7 +180,7 @@ impl<'a> ClientPublish<'a> {
166180
}
167181
}
168182

169-
publish!();
183+
publish!(DoClientPublish<'a>);
170184

171185
pub fn payload(mut self, payload: Bytes) -> DoClientPublish<'a> {
172186
self.publish.payload = payload;
@@ -195,7 +209,7 @@ impl OwnedClientPublish {
195209
}
196210
}
197211

198-
publish!();
212+
publish!(DoOwnedClientPublish);
199213

200214
pub fn payload(mut self, payload: Bytes) -> DoOwnedClientPublish {
201215
self.publish.payload = payload;

watermelon/src/client/commands/request.rs

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ use std::{
1010
use bytes::Bytes;
1111
use futures_core::Stream;
1212
use pin_project_lite::pin_project;
13+
use serde::Serialize;
1314
use tokio::time::{Sleep, sleep};
1415
use watermelon_proto::{
1516
ServerMessage, StatusCode, Subject,
@@ -109,7 +110,7 @@ pub enum ResponseError {
109110
}
110111

111112
macro_rules! request {
112-
() => {
113+
($payload_t:ty) => {
113114
#[must_use]
114115
pub fn reply_subject(mut self, reply_subject: Option<Subject>) -> Self {
115116
self.request_mut().publish.reply_subject = reply_subject;
@@ -133,6 +134,19 @@ macro_rules! request {
133134
self.request_mut().response_timeout = Some(timeout);
134135
self
135136
}
137+
138+
/// Serialize `payload` to JSON and use it as the payload
139+
///
140+
/// # Errors
141+
///
142+
/// Returns an error if the serializer fails
143+
pub fn payload_json<T: Serialize>(
144+
self,
145+
payload: &T,
146+
) -> Result<$payload_t, serde_json::Error> {
147+
let payload = serde_json::to_vec(payload)?;
148+
Ok(self.payload(payload.into()))
149+
}
136150
};
137151
}
138152

@@ -176,7 +190,7 @@ impl RequestBuilder {
176190
}
177191
}
178192

179-
request!();
193+
request!(Request);
180194

181195
#[must_use]
182196
pub fn payload(mut self, payload: Bytes) -> Request {
@@ -197,7 +211,7 @@ impl<'a> ClientRequest<'a> {
197211
}
198212
}
199213

200-
request!();
214+
request!(DoClientRequest<'a>);
201215

202216
pub fn payload(mut self, payload: Bytes) -> DoClientRequest<'a> {
203217
self.request.publish.payload = payload;
@@ -226,7 +240,7 @@ impl OwnedClientRequest {
226240
}
227241
}
228242

229-
request!();
243+
request!(DoOwnedClientRequest);
230244

231245
pub fn payload(mut self, payload: Bytes) -> DoOwnedClientRequest {
232246
self.request.publish.payload = payload;

0 commit comments

Comments
 (0)