Skip to content

Commit bb86d48

Browse files
committed
chore: add RSocket trait example in readme
1 parent e31d71c commit bb86d48

File tree

1 file changed

+73
-5
lines changed

1 file changed

+73
-5
lines changed

README.md

Lines changed: 73 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,12 @@ Add dependencies in your `Cargo.toml`.
2121

2222
```toml
2323
[dependencies]
24-
tokio = "0.3.6"
25-
rsocket_rust = "0.7.0"
24+
tokio = "1.0"
25+
rsocket_rust = "0.7"
2626

2727
# 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"
3030
```
3131

3232
### Server
@@ -74,7 +74,75 @@ async fn main() -> Result<()> {
7474
.build();
7575
let res = cli.request_response(req).await?;
7676
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+
}
78146
}
79147

80148
```

0 commit comments

Comments
 (0)