-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmessages.py
More file actions
169 lines (110 loc) · 2.88 KB
/
Copy pathmessages.py
File metadata and controls
169 lines (110 loc) · 2.88 KB
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
import dataclasses
import json
MSG_MAP = {}
def dataclass_from_dict(klass, d):
# https://stackoverflow.com/a/54769644/3197067
try:
fieldtypes = {f.name: f.type for f in dataclasses.fields(klass)}
return klass(**{f: dataclass_from_dict(fieldtypes[f], d[f]) for f in d})
except:
return d # Not a dataclass field
class MessageMeta(type):
def __new__(cls, class_name, parents, attrs):
global MSG_MAP
cls_obj = super().__new__(cls, class_name, parents, attrs)
MSG_MAP[class_name] = cls_obj
return cls_obj
@dataclasses.dataclass
class Msg(metaclass=MessageMeta):
MSG_NAME = "msg_name"
def to_dict(self):
data = {self.MSG_NAME: self.__class__.__name__,
"data": dataclasses.asdict(self),
}
return data
def to_str(self):
return json.dumps(self.to_dict())
def to_bytes(self):
return self.to_str().encode()
@classmethod
def from_str(cls, data):
jdata = json.loads(data)
return cls.from_dict(jdata)
@classmethod
def from_dict(cls, jdata):
name = jdata[cls.MSG_NAME]
cmd_cls = MSG_MAP[name]
obj = dataclass_from_dict(cmd_cls, jdata["data"])
return obj
@dataclasses.dataclass
class GetBallotNumberReq(Msg):
least: int = -1
@dataclasses.dataclass
class GetBallotNumberResp(Msg):
ballot_number: int
@dataclasses.dataclass
class StartPropose(Msg):
value: str
accs_idx: list | None = None
debug: bool = False
@dataclasses.dataclass
class Proposal(Msg):
ballot_number: int
@dataclasses.dataclass
class Promised(Msg):
max_accepted_number: int | None
value: str | None
@dataclasses.dataclass
class Rejected(Msg):
ballot_number: int | None
@dataclasses.dataclass
class AcceptReq(Msg):
ballot_number: int
value: str
@dataclasses.dataclass
class AcceptRejected(Msg):
ballot_number: int | None
@dataclasses.dataclass
class AcceptSucc(Msg):
ballot_number: int
@dataclasses.dataclass
class Close(Msg):
pass
@dataclasses.dataclass
class StartLearn(Msg):
pass
@dataclasses.dataclass
class LearnReq(Msg):
pass
@dataclasses.dataclass
class LearnResp(Msg):
value: str | None = None
msg: str | None = None
@dataclasses.dataclass
class AccpetedInfo(Msg):
max_accepted_bn: int | None
value: str | None
@dataclasses.dataclass
class P1ResumeReq(Msg):
p1_accs_idx: list | None = None
p2_accs_idx: list | None = None
@dataclasses.dataclass
class WaitP1PausedReq(Msg):
pass
@dataclasses.dataclass
class P2ResumeReq(Msg):
p1_accs_idx: list | None = None
p2_accs_idx: list | None = None
@dataclasses.dataclass
class WaitP2PausedReq(Msg):
pass
@dataclasses.dataclass
class WaitChosenReq(Msg):
pass
@dataclasses.dataclass
class ShowInfo(Msg):
pass
def main():
return
if __name__ == "__main__":
main()