-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathunique_ids.rs
85 lines (73 loc) · 1.82 KB
/
unique_ids.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
use serde::{Deserialize, Serialize};
use crate::{
client::{Client, Result},
messages::{Id, Message, MsgId},
};
pub fn from_client(client: Client) -> Workload {
Workload::new(client)
}
pub async fn new() -> Result<Workload> {
Client::connect().await.map(from_client)
}
#[derive(Debug)]
pub struct Workload {
client: Client,
}
impl Workload {
pub fn new(client: Client) -> Self {
Self { client }
}
pub fn node_id(&self) -> i32 {
self.client.id().id()
}
pub async fn recv(&self) -> Result<Option<Request>> {
self.client
.recv()
.await
.map(|maybe_msg| maybe_msg.map(|msg| self.handle_msg(msg)))
}
fn handle_msg(&self, msg: Message<RequestBody>) -> Request {
let RequestBody::Generate { msg_id } = msg.body;
Request {
from: msg.src,
in_reply_to: msg_id,
client: self.client.clone(),
}
}
}
pub struct Request {
from: Id,
in_reply_to: MsgId,
client: Client,
}
impl Request {
pub async fn generate<T>(self, id: T) -> Result<()>
where
T: std::fmt::Debug + Serialize,
{
self.client
.send(
self.from,
ResponseBody::GenerateOk {
msg_id: MsgId::next(),
in_reply_to: self.in_reply_to,
id,
},
)
.await
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum RequestBody {
Generate { msg_id: MsgId },
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum ResponseBody<T> {
GenerateOk {
id: T,
msg_id: MsgId,
in_reply_to: MsgId,
},
}