@@ -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 r#type ( & self ) -> u16 {
61
+ pub fn r#type ( & self ) -> MessageType {
56
62
match self {
57
63
Message :: Init ( msg) => msg. r#type ( ) ,
58
64
Message :: Error ( msg) => msg. r#type ( ) ,
@@ -77,11 +83,24 @@ impl Message {
77
83
Message :: ChannelAnnouncement ( msg) => msg. r#type ( ) ,
78
84
Message :: NodeAnnouncement ( msg) => msg. r#type ( ) ,
79
85
Message :: ChannelUpdate ( msg) => msg. r#type ( ) ,
80
- Message :: Unknown ( r#type ) => * r#type ,
86
+ Message :: Unknown ( message_type ) => * message_type ,
81
87
}
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::DecodeErr
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: Writeable {
189
208
190
209
/// Returns the type identifying the message payload. Convenience method for accessing
191
210
/// [`TYPE`](TYPE).
192
- fn r#type ( & self ) -> u16 {
193
- Self :: TYPE
211
+ fn r#type ( & self ) -> MessageType {
212
+ MessageType { number : Self :: TYPE }
194
213
}
195
214
196
215
/// Writes the type and message payload to the given data buffer.
@@ -345,7 +364,7 @@ mod tests {
345
364
let mut reader = :: std:: io:: Cursor :: new ( buffer) ;
346
365
let message = read ( & mut reader) ?;
347
366
match message {
348
- Message :: Unknown ( std:: u16:: MAX ) => Ok ( ( ) ) ,
367
+ Message :: Unknown ( MessageType { number : std:: u16:: MAX } ) => Ok ( ( ) ) ,
349
368
_ => panic ! ( "Expected message type {}; found: {}" , std:: u16 :: MAX , message. r#type( ) ) ,
350
369
}
351
370
}
@@ -378,4 +397,16 @@ mod tests {
378
397
_ => panic ! ( "Expected pong message; found message type: {}" , decoded_message. r#type( ) ) ,
379
398
}
380
399
}
400
+
401
+ #[ test]
402
+ fn is_even_message_type ( ) {
403
+ let message = Message :: Unknown ( MessageType { number : 42 } ) ;
404
+ assert ! ( message. r#type( ) . is_even( ) ) ;
405
+ }
406
+
407
+ #[ test]
408
+ fn is_odd_message_type ( ) {
409
+ let message = Message :: Unknown ( MessageType { number : 43 } ) ;
410
+ assert ! ( !message. r#type( ) . is_even( ) ) ;
411
+ }
381
412
}
0 commit comments