1
- use crate :: targeting:: Rules ;
2
- use crate :: validator:: MessageTypes ;
3
- use crate :: { BigNum , Channel , ChannelId , ValidatorId } ;
1
+ use crate :: {
2
+ targeting:: Rules ,
3
+ validator:: Type as MessageType ,
4
+ validator:: { ApproveState , Heartbeat , MessageTypes , NewState } ,
5
+ BigNum , Channel , ChannelId , ValidatorId ,
6
+ } ;
4
7
use chrono:: { DateTime , Utc } ;
5
8
use serde:: { Deserialize , Serialize } ;
6
- use std:: collections:: HashMap ;
7
- use std:: fmt;
8
- use std:: hash:: Hash ;
9
+ use std:: { collections:: HashMap , fmt, hash:: Hash } ;
9
10
10
11
#[ derive( Serialize , Deserialize , Debug , PartialEq , Eq ) ]
11
12
#[ serde( rename_all = "camelCase" ) ]
12
13
pub struct LastApproved {
13
14
/// NewState can be None if the channel is brand new
14
- pub new_state : Option < NewStateValidatorMessage > ,
15
+ pub new_state : Option < MessageResponse < NewState > > ,
15
16
/// ApproveState can be None if the channel is brand new
16
- pub approve_state : Option < ApproveStateValidatorMessage > ,
17
+ pub approve_state : Option < MessageResponse < ApproveState > > ,
17
18
}
18
19
19
20
#[ derive( Serialize , Deserialize , Debug , PartialEq , Eq ) ]
20
- pub struct NewStateValidatorMessage {
21
+ pub struct MessageResponse < T : MessageType > {
21
22
pub from : ValidatorId ,
22
23
pub received : DateTime < Utc > ,
23
- pub msg : MessageTypes ,
24
+ pub msg : message :: Message < T > ,
24
25
}
25
26
26
- #[ derive( Serialize , Deserialize , Debug , PartialEq , Eq ) ]
27
- pub struct ApproveStateValidatorMessage {
28
- pub from : ValidatorId ,
29
- pub received : DateTime < Utc > ,
30
- pub msg : MessageTypes ,
31
- }
27
+ pub mod message {
28
+ use std:: { convert:: TryFrom , ops:: Deref } ;
32
29
33
- #[ derive( Serialize , Deserialize , Debug , PartialEq , Eq ) ]
34
- pub struct HeartbeatValidatorMessage {
35
- pub from : ValidatorId ,
36
- pub received : DateTime < Utc > ,
37
- pub msg : MessageTypes ,
30
+ use crate :: validator:: messages:: * ;
31
+ use serde:: { Deserialize , Serialize } ;
32
+
33
+ #[ derive( Serialize , Deserialize , Clone , Debug , PartialEq , Eq ) ]
34
+ #[ serde( try_from = "MessageTypes" , into = "MessageTypes" ) ]
35
+ pub struct Message < T : Type > ( T ) ;
36
+
37
+ impl < T : Type > Message < T > {
38
+ pub fn into_inner ( self ) -> T {
39
+ self . 0
40
+ }
41
+ }
42
+
43
+ impl < T : Type > Deref for Message < T > {
44
+ type Target = T ;
45
+
46
+ fn deref ( & self ) -> & Self :: Target {
47
+ & self . 0
48
+ }
49
+ }
50
+
51
+ impl < T : Type > TryFrom < MessageTypes > for Message < T > {
52
+ type Error = MessageTypeError < T > ;
53
+
54
+ fn try_from ( value : MessageTypes ) -> Result < Self , Self :: Error > {
55
+ <T as TryFrom < MessageTypes > >:: try_from ( value) . map ( Self )
56
+ }
57
+ }
58
+
59
+ impl < T : Type > Into < MessageTypes > for Message < T > {
60
+ fn into ( self ) -> MessageTypes {
61
+ self . 0 . into ( )
62
+ }
63
+ }
38
64
}
39
65
40
66
#[ serde( tag = "type" , rename_all = "SCREAMING_SNAKE_CASE" ) ]
@@ -119,7 +145,7 @@ pub struct LastApprovedResponse {
119
145
/// None -> withHeartbeat=true wasn't passed
120
146
/// Some(vec![]) (empty vec) or Some(heartbeats) - withHeartbeat=true was passed
121
147
#[ serde( default , skip_serializing_if = "Option::is_none" ) ]
122
- pub heartbeats : Option < Vec < HeartbeatValidatorMessage > > ,
148
+ pub heartbeats : Option < Vec < MessageResponse < Heartbeat > > > ,
123
149
}
124
150
125
151
#[ derive( Serialize , Deserialize , Debug ) ]
@@ -232,16 +258,16 @@ pub mod channel_list {
232
258
233
259
#[ cfg( feature = "postgres" ) ]
234
260
mod postgres {
235
- use super :: {
236
- ApproveStateValidatorMessage , HeartbeatValidatorMessage , NewStateValidatorMessage ,
237
- ValidatorMessage ,
261
+ use super :: { MessageResponse , ValidatorMessage } ;
262
+ use crate :: {
263
+ sentry:: EventAggregate ,
264
+ validator:: { messages:: Type as MessageType , MessageTypes } ,
238
265
} ;
239
- use crate :: sentry:: EventAggregate ;
240
- use crate :: validator:: MessageTypes ;
241
266
use bytes:: BytesMut ;
242
267
use postgres_types:: { accepts, to_sql_checked, IsNull , Json , ToSql , Type } ;
243
- use std:: error:: Error ;
244
- use tokio_postgres:: Row ;
268
+ use serde:: Deserialize ;
269
+ use std:: convert:: TryFrom ;
270
+ use tokio_postgres:: { Error , Row } ;
245
271
246
272
impl From < & Row > for EventAggregate {
247
273
fn from ( row : & Row ) -> Self {
@@ -263,33 +289,20 @@ mod postgres {
263
289
}
264
290
}
265
291
266
- impl From < & Row > for ApproveStateValidatorMessage {
267
- fn from ( row : & Row ) -> Self {
268
- Self {
269
- from : row. get ( "from" ) ,
270
- received : row. get ( "received" ) ,
271
- msg : row. get :: < _ , Json < MessageTypes > > ( "msg" ) . 0 ,
272
- }
273
- }
274
- }
292
+ impl < T > TryFrom < & Row > for MessageResponse < T >
293
+ where
294
+ T : MessageType ,
295
+ for < ' de > T : Deserialize < ' de > ,
296
+ {
297
+ type Error = Error ;
275
298
276
- impl From < & Row > for NewStateValidatorMessage {
277
- fn from ( row : & Row ) -> Self {
278
- Self {
299
+ fn try_from ( row : & Row ) -> Result < Self , Self :: Error > {
300
+ Ok ( Self {
279
301
from : row. get ( "from" ) ,
280
302
received : row. get ( "received" ) ,
281
- msg : row. get :: < _ , Json < MessageTypes > > ( "msg" ) . 0 ,
282
- }
283
- }
284
- }
285
-
286
- impl From < & Row > for HeartbeatValidatorMessage {
287
- fn from ( row : & Row ) -> Self {
288
- Self {
289
- from : row. get ( "from" ) ,
290
- received : row. get ( "received" ) ,
291
- msg : row. get :: < _ , Json < MessageTypes > > ( "msg" ) . 0 ,
292
- }
303
+ // guard against mistakes from wrong Queries
304
+ msg : row. try_get :: < _ , Json < _ > > ( "msg" ) ?. 0 ,
305
+ } )
293
306
}
294
307
}
295
308
@@ -298,7 +311,7 @@ mod postgres {
298
311
& self ,
299
312
ty : & Type ,
300
313
w : & mut BytesMut ,
301
- ) -> Result < IsNull , Box < dyn Error + Sync + Send > > {
314
+ ) -> Result < IsNull , Box < dyn std :: error :: Error + Sync + Send > > {
302
315
Json ( self ) . to_sql ( ty, w)
303
316
}
304
317
0 commit comments