Skip to content

Commit 5270ac9

Browse files
committed
foobar
1 parent 5c8a8ee commit 5270ac9

File tree

3 files changed

+108
-22
lines changed

3 files changed

+108
-22
lines changed

rsocket-messaging/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,4 @@ extern crate log;
44
mod misc;
55
mod requester;
66

7-
pub use requester::{RequestSpec, Requester};
7+
pub use requester::{RequestSpec, Requester, RequesterBuilder};

rsocket-messaging/src/requester.rs

Lines changed: 98 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,55 @@ use serde::{Deserialize, Serialize};
1111
use std::collections::LinkedList;
1212
use std::error::Error;
1313

14+
pub struct RequesterBuilder {
15+
data_mime_type: MimeType,
16+
route: Option<String>,
17+
data: Option<Vec<u8>>,
18+
}
19+
20+
impl Default for RequesterBuilder {
21+
fn default() -> Self {
22+
Self {
23+
data_mime_type: MIME_APPLICATION_JSON,
24+
route: None,
25+
data: None,
26+
}
27+
}
28+
}
29+
30+
impl RequesterBuilder {
31+
pub fn data_mime_type<I>(mut self, mime_type: I) -> Self
32+
where
33+
I: Into<MimeType>,
34+
{
35+
self.data_mime_type = mime_type.into();
36+
self
37+
}
38+
39+
pub fn setup_route<I>(mut self, route: I) -> Self
40+
where
41+
I: Into<String>,
42+
{
43+
self.route = Some(route.into());
44+
self
45+
}
46+
47+
pub fn setup_data<D>(mut self, data: D) -> Self
48+
where
49+
D: Into<Vec<u8>>,
50+
{
51+
self.data = Some(data.into());
52+
self
53+
}
54+
55+
pub fn build<S>(self) -> Requester<S>
56+
where
57+
S: RSocket + Clone,
58+
{
59+
todo!("build requester")
60+
}
61+
}
62+
1463
pub struct Requester<S>
1564
where
1665
S: RSocket + Clone,
@@ -22,20 +71,25 @@ pub struct RequestSpec<S>
2271
where
2372
S: RSocket + Clone,
2473
{
25-
data_buf: BytesMut,
74+
data: Option<Vec<u8>>,
2675
rsocket: S,
2776
data_mime_type: MimeType,
2877
metadatas: LinkedList<(MimeType, Vec<u8>)>,
2978
}
3079

31-
impl<C> Requester<C>
80+
impl<S> From<S> for Requester<S>
3281
where
33-
C: RSocket + Clone,
82+
S: RSocket + Clone,
3483
{
35-
pub fn new(rsocket: C) -> Requester<C> {
84+
fn from(rsocket: S) -> Requester<S> {
3685
Requester { rsocket }
3786
}
87+
}
3888

89+
impl<C> Requester<C>
90+
where
91+
C: RSocket + Clone,
92+
{
3993
pub fn route(&self, route: &str) -> RequestSpec<C> {
4094
let routing = RoutingMetadata::builder().push_str(route).build();
4195
let mut buf = BytesMut::new();
@@ -44,7 +98,7 @@ where
4498
let mut metadatas: LinkedList<(MimeType, Vec<u8>)> = Default::default();
4599
metadatas.push_back((MIME_MESSAGE_X_RSOCKET_ROUTING_V0, buf.to_vec()));
46100
RequestSpec {
47-
data_buf: BytesMut::new(),
101+
data: None,
48102
rsocket: self.rsocket.clone(),
49103
data_mime_type: MIME_APPLICATION_JSON,
50104
metadatas,
@@ -56,44 +110,69 @@ impl<C> RequestSpec<C>
56110
where
57111
C: RSocket + Clone,
58112
{
59-
pub fn metadata<T>(&mut self, metadata: &T, mime_type: &str) -> Result<(), Box<dyn Error>>
113+
pub fn metadata<T, M>(&mut self, metadata: &T, mime_type: M) -> Result<(), Box<dyn Error>>
60114
where
61115
T: Sized + Serialize,
116+
M: Into<MimeType>,
62117
{
63-
let mime_type = MimeType::from(mime_type);
118+
let mime_type = mime_type.into();
64119
let mut b = BytesMut::new();
65120
marshal(&mime_type, &mut b, metadata)?;
66121
self.metadatas.push_back((mime_type, b.to_vec()));
67122
Ok(())
68123
}
69124

125+
pub fn metadata_raw<I, M>(&mut self, metadata: I, mime_type: M) -> Result<(), Box<dyn Error>>
126+
where
127+
I: Into<Vec<u8>>,
128+
M: Into<MimeType>,
129+
{
130+
self.metadatas
131+
.push_back((mime_type.into(), metadata.into()));
132+
Ok(())
133+
}
134+
70135
pub fn data<T>(&mut self, data: &T) -> Result<(), Box<dyn Error>>
71136
where
72137
T: Sized + Serialize,
73138
{
74-
marshal(&self.data_mime_type, &mut self.data_buf, data)
139+
let mut bf = BytesMut::new();
140+
marshal(&self.data_mime_type, &mut bf, data)?;
141+
self.data = Some(bf.to_vec());
142+
Ok(())
75143
}
76144

77-
pub async fn retrieve_mono(&self) -> Unpacker {
78-
let req = self.to_req();
79-
let res = self.rsocket.request_response(req).await;
145+
pub fn data_raw<I>(&mut self, data: I) -> Result<(), Box<dyn Error>>
146+
where
147+
I: Into<Vec<u8>>,
148+
{
149+
self.data = Some(data.into());
150+
Ok(())
151+
}
152+
153+
pub async fn retrieve_mono(self) -> Unpacker {
154+
let (req, mime_type, rsocket) = self.preflight();
155+
let res = rsocket.request_response(req).await;
80156
Unpacker {
81-
mime_type: self.data_mime_type.clone(),
157+
mime_type,
82158
inner: res,
83159
}
84160
}
85161

86-
fn to_req(&self) -> Payload {
162+
#[inline]
163+
fn preflight(self) -> (Payload, MimeType, C) {
87164
let mut b = BytesMut::new();
88165
let mut c = CompositeMetadata::builder();
89-
for (a, b) in self.metadatas.iter() {
90-
c = c.push(a.clone(), b);
166+
for (mime_type, raw) in self.metadatas.into_iter() {
167+
c = c.push(mime_type, raw);
91168
}
92169
c.build().write_to(&mut b);
93-
Payload::builder()
94-
.set_metadata(b.to_vec())
95-
.set_data(self.data_buf.to_vec())
96-
.build()
170+
171+
let mut bu = Payload::builder().set_metadata(b.to_vec());
172+
if let Some(raw) = self.data {
173+
bu = bu.set_data(raw);
174+
}
175+
(bu.build(), self.data_mime_type, self.rsocket)
97176
}
98177
}
99178

rsocket-test/tests/test_messaging.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,17 @@ async fn test_messaging() {
3232
.start()
3333
.await
3434
.expect("Connect failed!");
35-
let requester = Requester::new(rsocket);
35+
let requester = Requester::from(rsocket);
3636

3737
let post = Student {
3838
id: 1234,
3939
name: "Jeffsky".to_owned(),
4040
birth: "2020-01-01".to_owned(),
4141
};
4242
let mut req = requester.route("student.v1.upsert");
43+
req.metadata_raw("raw metadata", "application/json")
44+
.unwrap();
45+
req.metadata(&post, "application/json").unwrap();
4346
req.data(&post).unwrap();
4447
let res: Response<Student> = req
4548
.retrieve_mono()
@@ -48,5 +51,9 @@ async fn test_messaging() {
4851
.expect("Retrieve failed!")
4952
.expect("Empty result!");
5053
println!("------> RESPONSE: {:?}", res);
51-
()
54+
}
55+
56+
#[test]
57+
fn test_builder() {
58+
RequesterBuilder::default().data_mime_type("application/json");
5259
}

0 commit comments

Comments
 (0)