@@ -47,12 +47,18 @@ pub enum Message {
47
47
NodeAnnouncement ( msgs:: NodeAnnouncement ) ,
48
48
ChannelUpdate ( msgs:: ChannelUpdate ) ,
49
49
/// A message that could not be decoded because its type is unknown.
50
- Unknown ( u16 ) ,
50
+ Unknown ( MessageType ) ,
51
+ }
52
+
53
+ /// A number identifying a message to determine how it is encoded on the wire.
54
+ #[ derive( Clone , Copy ) ]
55
+ pub struct MessageType {
56
+ number : u16 ,
51
57
}
52
58
53
59
impl Message {
54
60
/// Returns the type that was used to decode the message payload.
55
- pub fn type_id ( & self ) -> u16 {
61
+ pub fn type_id ( & self ) -> MessageType {
56
62
match self {
57
63
& Message :: Init ( ref msg) => msg. type_id ( ) ,
58
64
& Message :: Error ( ref msg) => msg. type_id ( ) ,
@@ -82,6 +88,19 @@ impl Message {
82
88
}
83
89
}
84
90
91
+ impl MessageType {
92
+ /// Returns whether the message type is even, indicating both endpoints must support it.
93
+ pub fn is_even ( & self ) -> bool {
94
+ ( self . number & 1 ) == 0
95
+ }
96
+ }
97
+
98
+ impl :: std:: fmt:: Display for MessageType {
99
+ fn fmt ( & self , f : & mut :: std:: fmt:: Formatter ) -> :: std:: fmt:: Result {
100
+ write ! ( f, "{}" , self . number)
101
+ }
102
+ }
103
+
85
104
/// Reads a message from the data buffer consisting of a 2-byte big-endian type and a
86
105
/// variable-length payload conforming to the type.
87
106
///
@@ -161,7 +180,7 @@ pub fn read<R: ::std::io::Read>(buffer: &mut R) -> Result<Message, msgs::DecodeE
161
180
Ok ( Message :: ChannelUpdate ( Readable :: read ( buffer) ?) )
162
181
} ,
163
182
_ => {
164
- Ok ( Message :: Unknown ( message_type) )
183
+ Ok ( Message :: Unknown ( MessageType { number : message_type } ) )
165
184
} ,
166
185
}
167
186
}
@@ -189,8 +208,8 @@ pub trait Encode {
189
208
190
209
/// Returns the type identifying the message payload. Convenience method for accessing
191
210
/// [`TYPE`](TYPE).
192
- fn type_id ( & self ) -> u16 {
193
- Self :: TYPE
211
+ fn type_id ( & self ) -> MessageType {
212
+ MessageType { number : Self :: TYPE }
194
213
}
195
214
}
196
215
@@ -339,7 +358,7 @@ mod tests {
339
358
let mut reader = :: std:: io:: Cursor :: new ( buffer) ;
340
359
let message = read ( & mut reader) . unwrap ( ) ;
341
360
match message {
342
- Message :: Unknown ( :: std:: u16:: MAX ) => ( ) ,
361
+ Message :: Unknown ( MessageType { number : :: std:: u16:: MAX } ) => ( ) ,
343
362
_ => panic ! ( "Expected message type {}; found: {}" , :: std:: u16 :: MAX , message. type_id( ) ) ,
344
363
}
345
364
}
@@ -372,4 +391,16 @@ mod tests {
372
391
_ => panic ! ( "Expected pong message; found message type: {}" , decoded_message. type_id( ) ) ,
373
392
}
374
393
}
394
+
395
+ #[ test]
396
+ fn is_even_message_type ( ) {
397
+ let message = Message :: Unknown ( MessageType { number : 42 } ) ;
398
+ assert ! ( message. type_id( ) . is_even( ) ) ;
399
+ }
400
+
401
+ #[ test]
402
+ fn is_odd_message_type ( ) {
403
+ let message = Message :: Unknown ( MessageType { number : 43 } ) ;
404
+ assert ! ( !message. type_id( ) . is_even( ) ) ;
405
+ }
375
406
}
0 commit comments