@@ -11,6 +11,55 @@ use serde::{Deserialize, Serialize};
1111use std:: collections:: LinkedList ;
1212use 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+
1463pub struct Requester < S >
1564where
1665 S : RSocket + Clone ,
@@ -22,20 +71,25 @@ pub struct RequestSpec<S>
2271where
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 >
3281where
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 ( ) ;
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>
56110where
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
0 commit comments