@@ -60,8 +60,85 @@ pub trait CustomMessageHandler: wire::CustomMessageReader {
60
60
fn get_and_clear_pending_msg ( & self ) -> Vec < ( PublicKey , Self :: CustomMessage ) > ;
61
61
}
62
62
63
+ macro_rules! composite_custom_message_handler {
64
+ (
65
+ $handler_visibility: vis struct $handler: ident {
66
+ $( $field_visibility: vis $field: ident: $type: ty) ,* $( , ) *
67
+ }
68
+
69
+ $message_visibility: vis enum $message: ident {
70
+ $( $variant: ident( $range: pat) ) ,* $( , ) *
71
+ }
72
+ ) => {
73
+ #[ allow( missing_docs) ]
74
+ $handler_visibility struct $handler {
75
+ $(
76
+ $field_visibility $field: $type,
77
+ ) *
78
+ }
79
+
80
+ #[ allow( missing_docs) ]
81
+ #[ derive( Debug ) ]
82
+ $message_visibility enum $message {
83
+ $(
84
+ $variant( <$type as wire:: CustomMessageReader >:: CustomMessage ) ,
85
+ ) *
86
+ }
87
+
88
+ impl wire:: CustomMessageReader for $handler {
89
+ type CustomMessage = $message;
90
+ fn read<R : io:: Read >(
91
+ & self , message_type: u16 , buffer: & mut R
92
+ ) -> Result <Option <Self :: CustomMessage >, msgs:: DecodeError > {
93
+ match message_type {
94
+ $(
95
+ $range => match <$type>:: read( & self . $field, message_type, buffer) ? {
96
+ None => unreachable!( ) ,
97
+ Some ( message) => Ok ( Some ( $message:: $variant( message) ) ) ,
98
+ } ,
99
+ ) *
100
+ _ => Ok ( None ) ,
101
+ }
102
+ }
103
+ }
104
+
105
+ impl wire:: Type for $message {
106
+ fn type_id( & self ) -> u16 {
107
+ match self {
108
+ $(
109
+ Self :: $variant( message) => message. type_id( ) ,
110
+ ) *
111
+ }
112
+ }
113
+ }
114
+
115
+ impl Writeable for $message {
116
+ fn write<W : Writer >( & self , writer: & mut W ) -> Result <( ) , io:: Error > {
117
+ match self {
118
+ $(
119
+ Self :: $variant( message) => message. write( writer) ,
120
+ ) *
121
+ }
122
+ }
123
+ }
124
+ }
125
+ }
126
+
127
+ composite_custom_message_handler ! (
128
+ pub struct CompositeMessageHandler {
129
+ ignoring: IgnoringMessageHandler ,
130
+ ignoring2: IgnoringMessageHandler ,
131
+ }
132
+
133
+ pub enum CompositeMessage {
134
+ Infallible ( 0 ) ,
135
+ Infallible2 ( 1 ..=10 ) ,
136
+ }
137
+ ) ;
138
+
63
139
/// A dummy struct which implements `RoutingMessageHandler` without storing any routing information
64
140
/// or doing any processing. You can provide one of these as the route_handler in a MessageHandler.
141
+ #[ derive( Debug ) ]
65
142
pub struct IgnoringMessageHandler { }
66
143
impl MessageSendEventsProvider for IgnoringMessageHandler {
67
144
fn get_and_clear_pending_msg_events ( & self ) -> Vec < MessageSendEvent > { Vec :: new ( ) }
0 commit comments