@@ -21,6 +21,11 @@ use crate::lsps1::msgs::{
2121use  crate :: lsps2:: msgs:: { 
2222	LSPS2Message ,  LSPS2Request ,  LSPS2Response ,  LSPS2_BUY_METHOD_NAME ,  LSPS2_GET_INFO_METHOD_NAME , 
2323} ; 
24+ use  crate :: lsps5:: msgs:: { 
25+ 	LSPS5Message ,  LSPS5Request ,  LSPS5Response ,  LSPS5_LIST_WEBHOOKS_METHOD_NAME , 
26+ 	LSPS5_REMOVE_WEBHOOK_METHOD_NAME ,  LSPS5_SET_WEBHOOK_METHOD_NAME , 
27+ } ; 
28+ 
2429use  crate :: prelude:: HashMap ; 
2530
2631use  lightning:: ln:: msgs:: { DecodeError ,  LightningError } ; 
@@ -61,6 +66,9 @@ pub(crate) enum LSPSMethod {
6166	LSPS1CreateOrder , 
6267	LSPS2GetInfo , 
6368	LSPS2Buy , 
69+ 	LSPS5SetWebhook , 
70+ 	LSPS5ListWebhooks , 
71+ 	LSPS5RemoveWebhook , 
6472} 
6573
6674impl  LSPSMethod  { 
@@ -72,6 +80,9 @@ impl LSPSMethod {
7280			Self :: LSPS1GetOrder  => LSPS1_GET_ORDER_METHOD_NAME , 
7381			Self :: LSPS2GetInfo  => LSPS2_GET_INFO_METHOD_NAME , 
7482			Self :: LSPS2Buy  => LSPS2_BUY_METHOD_NAME , 
83+ 			Self :: LSPS5SetWebhook  => LSPS5_SET_WEBHOOK_METHOD_NAME , 
84+ 			Self :: LSPS5ListWebhooks  => LSPS5_LIST_WEBHOOKS_METHOD_NAME , 
85+ 			Self :: LSPS5RemoveWebhook  => LSPS5_REMOVE_WEBHOOK_METHOD_NAME , 
7586		} 
7687	} 
7788} 
@@ -86,6 +97,9 @@ impl FromStr for LSPSMethod {
8697			LSPS1_GET_ORDER_METHOD_NAME  => Ok ( Self :: LSPS1GetOrder ) , 
8798			LSPS2_GET_INFO_METHOD_NAME  => Ok ( Self :: LSPS2GetInfo ) , 
8899			LSPS2_BUY_METHOD_NAME  => Ok ( Self :: LSPS2Buy ) , 
100+ 			LSPS5_SET_WEBHOOK_METHOD_NAME  => Ok ( Self :: LSPS5SetWebhook ) , 
101+ 			LSPS5_LIST_WEBHOOKS_METHOD_NAME  => Ok ( Self :: LSPS5ListWebhooks ) , 
102+ 			LSPS5_REMOVE_WEBHOOK_METHOD_NAME  => Ok ( Self :: LSPS5RemoveWebhook ) , 
89103			_ => Err ( & "Unknown method name" ) , 
90104		} 
91105	} 
@@ -118,6 +132,16 @@ impl From<&LSPS2Request> for LSPSMethod {
118132	} 
119133} 
120134
135+ impl  From < & LSPS5Request >  for  LSPSMethod  { 
136+ 	fn  from ( value :  & LSPS5Request )  -> Self  { 
137+ 		match  value { 
138+ 			LSPS5Request :: SetWebhook ( _)  => Self :: LSPS5SetWebhook , 
139+ 			LSPS5Request :: ListWebhooks ( _)  => Self :: LSPS5ListWebhooks , 
140+ 			LSPS5Request :: RemoveWebhook ( _)  => Self :: LSPS5RemoveWebhook , 
141+ 		} 
142+ 	} 
143+ } 
144+ 
121145impl < ' de >  Deserialize < ' de >  for  LSPSMethod  { 
122146	fn  deserialize < D > ( deserializer :  D )  -> Result < Self ,  D :: Error > 
123147	where 
@@ -266,6 +290,8 @@ pub enum LSPSMessage {
266290 	LSPS1 ( LSPS1Message ) , 
267291	/// An LSPS2 message. 
268292 	LSPS2 ( LSPS2Message ) , 
293+ 	/// An LSPS5 message. 
294+  	LSPS5 ( LSPS5Message ) , 
269295} 
270296
271297impl  LSPSMessage  { 
@@ -293,6 +319,9 @@ impl LSPSMessage {
293319			LSPSMessage :: LSPS2 ( LSPS2Message :: Request ( request_id,  request) )  => { 
294320				Some ( ( LSPSRequestId ( request_id. 0 . clone ( ) ) ,  request. into ( ) ) ) 
295321			} , 
322+ 			LSPSMessage :: LSPS5 ( LSPS5Message :: Request ( request_id,  request) )  => { 
323+ 				Some ( ( LSPSRequestId ( request_id. 0 . clone ( ) ) ,  request. into ( ) ) ) 
324+ 			} , 
296325			_ => None , 
297326		} 
298327	} 
@@ -409,6 +438,44 @@ impl Serialize for LSPSMessage {
409438				jsonrpc_object. serialize_field ( JSONRPC_ID_FIELD_KEY ,  & serde_json:: Value :: Null ) ?; 
410439				jsonrpc_object. serialize_field ( JSONRPC_ERROR_FIELD_KEY ,  & error) ?; 
411440			} , 
441+ 			LSPSMessage :: LSPS5 ( LSPS5Message :: Request ( request_id,  request) )  => { 
442+ 				jsonrpc_object. serialize_field ( JSONRPC_ID_FIELD_KEY ,  & request_id. 0 ) ?; 
443+ 				jsonrpc_object
444+ 					. serialize_field ( JSONRPC_METHOD_FIELD_KEY ,  & LSPSMethod :: from ( request) ) ?; 
445+ 
446+ 				match  request { 
447+ 					LSPS5Request :: SetWebhook ( params)  => { 
448+ 						jsonrpc_object. serialize_field ( JSONRPC_PARAMS_FIELD_KEY ,  params) ?
449+ 					} , 
450+ 					LSPS5Request :: ListWebhooks ( params)  => { 
451+ 						jsonrpc_object. serialize_field ( JSONRPC_PARAMS_FIELD_KEY ,  params) ?
452+ 					} , 
453+ 					LSPS5Request :: RemoveWebhook ( params)  => { 
454+ 						jsonrpc_object. serialize_field ( JSONRPC_PARAMS_FIELD_KEY ,  params) ?
455+ 					} , 
456+ 				} 
457+ 			} , 
458+ 			LSPSMessage :: LSPS5 ( LSPS5Message :: Response ( request_id,  response) )  => { 
459+ 				jsonrpc_object. serialize_field ( JSONRPC_ID_FIELD_KEY ,  & request_id. 0 ) ?; 
460+ 
461+ 				match  response { 
462+ 					LSPS5Response :: SetWebhook ( result)  => { 
463+ 						jsonrpc_object. serialize_field ( JSONRPC_RESULT_FIELD_KEY ,  result) ?
464+ 					} , 
465+ 					LSPS5Response :: SetWebhookError ( error)  => { 
466+ 						jsonrpc_object. serialize_field ( JSONRPC_ERROR_FIELD_KEY ,  error) ?
467+ 					} , 
468+ 					LSPS5Response :: ListWebhooks ( result)  => { 
469+ 						jsonrpc_object. serialize_field ( JSONRPC_RESULT_FIELD_KEY ,  result) ?
470+ 					} , 
471+ 					LSPS5Response :: RemoveWebhook ( result)  => { 
472+ 						jsonrpc_object. serialize_field ( JSONRPC_RESULT_FIELD_KEY ,  result) ?
473+ 					} , 
474+ 					LSPS5Response :: RemoveWebhookError ( error)  => { 
475+ 						jsonrpc_object. serialize_field ( JSONRPC_ERROR_FIELD_KEY ,  error) ?
476+ 					} , 
477+ 				} 
478+ 			} , 
412479		} 
413480
414481		jsonrpc_object. end ( ) 
@@ -522,6 +589,30 @@ impl<'de, 'a> Visitor<'de> for LSPSMessageVisitor<'a> {
522589						. map_err ( de:: Error :: custom) ?; 
523590					Ok ( LSPSMessage :: LSPS2 ( LSPS2Message :: Request ( id,  LSPS2Request :: Buy ( request) ) ) ) 
524591				} , 
592+ 				LSPSMethod :: LSPS5SetWebhook  => { 
593+ 					let  request = serde_json:: from_value ( params. unwrap_or ( json ! ( { } ) ) ) 
594+ 						. map_err ( de:: Error :: custom) ?; 
595+ 					Ok ( LSPSMessage :: LSPS5 ( LSPS5Message :: Request ( 
596+ 						id, 
597+ 						LSPS5Request :: SetWebhook ( request) , 
598+ 					) ) ) 
599+ 				} , 
600+ 				LSPSMethod :: LSPS5ListWebhooks  => { 
601+ 					let  request = serde_json:: from_value ( params. unwrap_or ( json ! ( { } ) ) ) 
602+ 						. map_err ( de:: Error :: custom) ?; 
603+ 					Ok ( LSPSMessage :: LSPS5 ( LSPS5Message :: Request ( 
604+ 						id, 
605+ 						LSPS5Request :: ListWebhooks ( request) , 
606+ 					) ) ) 
607+ 				} , 
608+ 				LSPSMethod :: LSPS5RemoveWebhook  => { 
609+ 					let  request = serde_json:: from_value ( params. unwrap_or ( json ! ( { } ) ) ) 
610+ 						. map_err ( de:: Error :: custom) ?; 
611+ 					Ok ( LSPSMessage :: LSPS5 ( LSPS5Message :: Request ( 
612+ 						id, 
613+ 						LSPS5Request :: RemoveWebhook ( request) , 
614+ 					) ) ) 
615+ 				} , 
525616			} , 
526617			None  => match  self . request_id_to_method_map . remove ( & id)  { 
527618				Some ( method)  => match  method { 
@@ -627,6 +718,52 @@ impl<'de, 'a> Visitor<'de> for LSPSMessageVisitor<'a> {
627718							Err ( de:: Error :: custom ( "Received invalid JSON-RPC object: one of method, result, or error required" ) ) 
628719						} 
629720					} , 
721+ 					LSPSMethod :: LSPS5SetWebhook  => { 
722+ 						if  let  Some ( error)  = error { 
723+ 							Ok ( LSPSMessage :: LSPS5 ( LSPS5Message :: Response ( 
724+ 								id, 
725+ 								LSPS5Response :: SetWebhookError ( error. into ( ) ) , 
726+ 							) ) ) 
727+ 						}  else  if  let  Some ( result)  = result { 
728+ 							let  response =
729+ 								serde_json:: from_value ( result) . map_err ( de:: Error :: custom) ?; 
730+ 							Ok ( LSPSMessage :: LSPS5 ( LSPS5Message :: Response ( 
731+ 								id, 
732+ 								LSPS5Response :: SetWebhook ( response) , 
733+ 							) ) ) 
734+ 						}  else  { 
735+ 							Err ( de:: Error :: custom ( "Received invalid JSON-RPC object: one of method, result, or error required" ) ) 
736+ 						} 
737+ 					} , 
738+ 					LSPSMethod :: LSPS5ListWebhooks  => { 
739+ 						if  let  Some ( result)  = result { 
740+ 							let  response =
741+ 								serde_json:: from_value ( result) . map_err ( de:: Error :: custom) ?; 
742+ 							Ok ( LSPSMessage :: LSPS5 ( LSPS5Message :: Response ( 
743+ 								id, 
744+ 								LSPS5Response :: ListWebhooks ( response) , 
745+ 							) ) ) 
746+ 						}  else  { 
747+ 							Err ( de:: Error :: custom ( "Received invalid JSON-RPC object: one of method, result, or error required" ) ) 
748+ 						} 
749+ 					} , 
750+ 					LSPSMethod :: LSPS5RemoveWebhook  => { 
751+ 						if  let  Some ( error)  = error { 
752+ 							Ok ( LSPSMessage :: LSPS5 ( LSPS5Message :: Response ( 
753+ 								id, 
754+ 								LSPS5Response :: RemoveWebhookError ( error. into ( ) ) , 
755+ 							) ) ) 
756+ 						}  else  if  let  Some ( result)  = result { 
757+ 							let  response =
758+ 								serde_json:: from_value ( result) . map_err ( de:: Error :: custom) ?; 
759+ 							Ok ( LSPSMessage :: LSPS5 ( LSPS5Message :: Response ( 
760+ 								id, 
761+ 								LSPS5Response :: RemoveWebhook ( response) , 
762+ 							) ) ) 
763+ 						}  else  { 
764+ 							Err ( de:: Error :: custom ( "Received invalid JSON-RPC object: one of method, result, or error required" ) ) 
765+ 						} 
766+ 					} , 
630767				} , 
631768				None  => Err ( de:: Error :: custom ( format ! ( 
632769					"Received response for unknown request id: {}" , 
0 commit comments