@@ -21,12 +21,12 @@ Add dependencies in your `Cargo.toml`.
21
21
22
22
``` toml
23
23
[dependencies ]
24
- tokio = " 0.3.6 "
25
- rsocket_rust = " 0.7.0 "
24
+ tokio = " 1.0 "
25
+ rsocket_rust = " 0.7"
26
26
27
27
# add transport dependencies:
28
- # rsocket_rust_transport_tcp = "0.7.0 "
29
- # rsocket_rust_transport_websocket = "0.7.0 "
28
+ # rsocket_rust_transport_tcp = "0.7"
29
+ # rsocket_rust_transport_websocket = "0.7"
30
30
```
31
31
32
32
### Server
@@ -74,7 +74,75 @@ async fn main() -> Result<()> {
74
74
. build ();
75
75
let res = cli . request_response (req ). await ? ;
76
76
println! (" got: {:?}" , res );
77
- cli . close ();
77
+
78
+ // If you want to block until socket disconnected.
79
+ cli . wait_for_close (). await ;
80
+
81
+ Ok (())
82
+ }
83
+
84
+ ```
85
+
86
+ ### Implement RSocket trait
87
+
88
+ Example for access Redis([ crates] ( https://crates.io/crates/redis ) ):
89
+
90
+ > NOTICE: add dependency in Cargo.toml => redis = { version = "0.19.0", features = [ "aio" ] }
91
+
92
+ ``` rust
93
+ use redis :: Client as RedisClient ;
94
+ use rsocket_rust :: async_trait;
95
+ use rsocket_rust :: prelude :: * ;
96
+ use rsocket_rust :: Result ;
97
+ use std :: str :: FromStr ;
98
+
99
+ #[derive(Clone )]
100
+ pub struct RedisDao {
101
+ inner : RedisClient ,
102
+ }
103
+
104
+ // Create RedisDao from str.
105
+ // Example: RedisDao::from_str("redis://127.0.0.1").expect("Connect redis failed!");
106
+ impl FromStr for RedisDao {
107
+ type Err = redis :: RedisError ;
108
+
109
+ fn from_str (s : & str ) -> std :: result :: Result <Self , Self :: Err > {
110
+ let client = redis :: Client :: open (s )? ;
111
+ Ok (RedisDao { inner : client })
112
+ }
113
+ }
114
+
115
+ #[async_trait]
116
+ impl RSocket for RedisDao {
117
+ async fn request_response (& self , req : Payload ) -> Result <Option <Payload >> {
118
+ let client = self . inner. clone ();
119
+ let mut conn = client . get_async_connection (). await ? ;
120
+ let value : redis :: RedisResult <Option <String >> = redis :: cmd (" GET" )
121
+ . arg (& [req . data_utf8 ()])
122
+ . query_async (& mut conn )
123
+ . await ;
124
+ match value {
125
+ Ok (Some (value )) => Ok (Some (Payload :: builder (). set_data_utf8 (& value ). build ())),
126
+ Ok (None ) => Ok (None ),
127
+ Err (e ) => Err (e . into ()),
128
+ }
129
+ }
130
+
131
+ async fn metadata_push (& self , _req : Payload ) -> Result <()> {
132
+ todo! ()
133
+ }
134
+
135
+ async fn fire_and_forget (& self , _req : Payload ) -> Result <()> {
136
+ todo! ()
137
+ }
138
+
139
+ fn request_stream (& self , _req : Payload ) -> Flux <Result <Payload >> {
140
+ todo! ()
141
+ }
142
+
143
+ fn request_channel (& self , _reqs : Flux <Result <Payload >>) -> Flux <Result <Payload >> {
144
+ todo! ()
145
+ }
78
146
}
79
147
80
148
```
0 commit comments