2
2
//!
3
3
//! Please refer to the [LSPS0 specification](https://github.com/BitcoinAndLightningLayerSpecs/lsp/tree/main/LSPS0) for more information.
4
4
5
+ use crate :: lsps0:: ser:: LSPSMethod ;
6
+
5
7
#[ cfg( lsps1) ]
6
- use crate :: lsps1:: msgs:: {
7
- LSPS1Message , LSPS1Request , LSPS1Response , LSPS1_CREATE_ORDER_METHOD_NAME ,
8
- LSPS1_GET_INFO_METHOD_NAME , LSPS1_GET_ORDER_METHOD_NAME ,
9
- } ;
10
- use crate :: lsps2:: msgs:: {
11
- LSPS2Message , LSPS2Request , LSPS2Response , LSPS2_BUY_METHOD_NAME , LSPS2_GET_INFO_METHOD_NAME ,
12
- } ;
8
+ use crate :: lsps1:: msgs:: { LSPS1Message , LSPS1Request , LSPS1Response } ;
9
+ use crate :: lsps2:: msgs:: { LSPS2Message , LSPS2Request , LSPS2Response } ;
13
10
use crate :: prelude:: { HashMap , String , ToString , Vec } ;
14
11
15
12
use lightning:: impl_writeable_msg;
@@ -37,7 +34,7 @@ const JSONRPC_RESULT_FIELD_KEY: &str = "result";
37
34
const JSONRPC_ERROR_FIELD_KEY : & str = "error" ;
38
35
const JSONRPC_INVALID_MESSAGE_ERROR_CODE : i32 = -32700 ;
39
36
const JSONRPC_INVALID_MESSAGE_ERROR_MESSAGE : & str = "parse error" ;
40
- const LSPS0_LISTPROTOCOLS_METHOD_NAME : & str = "lsps0.list_protocols" ;
37
+ pub ( crate ) const LSPS0_LISTPROTOCOLS_METHOD_NAME : & str = "lsps0.list_protocols" ;
41
38
42
39
/// The Lightning message type id for LSPS messages.
43
40
pub const LSPS_MESSAGE_TYPE_ID : u16 = 37913 ;
@@ -74,7 +71,8 @@ impl wire::Type for RawLSPSMessage {
74
71
///
75
72
/// Please refer to the [JSON-RPC 2.0 specification](https://www.jsonrpc.org/specification#request_object) for
76
73
/// more information.
77
- #[ derive( Clone , Debug , PartialEq , Eq , Hash ) ]
74
+ #[ derive( Clone , Debug , PartialEq , Eq , Hash , Deserialize , Serialize ) ]
75
+ #[ serde( transparent) ]
78
76
pub struct RequestId ( pub String ) ;
79
77
80
78
/// An error returned in response to an JSON-RPC request.
@@ -190,26 +188,26 @@ impl LSPSMessage {
190
188
///
191
189
/// The given `request_id_to_method` associates request ids with method names, as response objects
192
190
/// don't carry the latter.
193
- pub fn from_str_with_id_map (
194
- json_str : & str , request_id_to_method_map : & mut HashMap < String , String > ,
191
+ pub ( crate ) fn from_str_with_id_map (
192
+ json_str : & str , request_id_to_method_map : & mut HashMap < RequestId , LSPSMethod > ,
195
193
) -> Result < Self , serde_json:: Error > {
196
194
let deserializer = & mut serde_json:: Deserializer :: from_str ( json_str) ;
197
195
let visitor = LSPSMessageVisitor { request_id_to_method_map } ;
198
196
deserializer. deserialize_any ( visitor)
199
197
}
200
198
201
199
/// Returns the request id and the method.
202
- pub fn get_request_id_and_method ( & self ) -> Option < ( String , String ) > {
200
+ pub ( crate ) fn get_request_id_and_method ( & self ) -> Option < ( RequestId , LSPSMethod ) > {
203
201
match self {
204
202
LSPSMessage :: LSPS0 ( LSPS0Message :: Request ( request_id, request) ) => {
205
- Some ( ( request_id. 0 . clone ( ) , request. method ( ) . to_string ( ) ) )
203
+ Some ( ( RequestId ( request_id. 0 . clone ( ) ) , request. into ( ) ) )
206
204
}
207
205
#[ cfg( lsps1) ]
208
206
LSPSMessage :: LSPS1 ( LSPS1Message :: Request ( request_id, request) ) => {
209
- Some ( ( request_id. 0 . clone ( ) , request. method ( ) . to_string ( ) ) )
207
+ Some ( ( RequestId ( request_id. 0 . clone ( ) ) , request. into ( ) ) )
210
208
}
211
209
LSPSMessage :: LSPS2 ( LSPS2Message :: Request ( request_id, request) ) => {
212
- Some ( ( request_id. 0 . clone ( ) , request. method ( ) . to_string ( ) ) )
210
+ Some ( ( RequestId ( request_id. 0 . clone ( ) ) , request. into ( ) ) )
213
211
}
214
212
_ => None ,
215
213
}
@@ -228,8 +226,9 @@ impl Serialize for LSPSMessage {
228
226
229
227
match self {
230
228
LSPSMessage :: LSPS0 ( LSPS0Message :: Request ( request_id, request) ) => {
231
- jsonrpc_object. serialize_field ( JSONRPC_METHOD_FIELD_KEY , request. method ( ) ) ?;
232
229
jsonrpc_object. serialize_field ( JSONRPC_ID_FIELD_KEY , & request_id. 0 ) ?;
230
+ jsonrpc_object
231
+ . serialize_field ( JSONRPC_METHOD_FIELD_KEY , & LSPSMethod :: from ( request) ) ?;
233
232
234
233
match request {
235
234
LSPS0Request :: ListProtocols ( params) => {
@@ -252,7 +251,8 @@ impl Serialize for LSPSMessage {
252
251
#[ cfg( lsps1) ]
253
252
LSPSMessage :: LSPS1 ( LSPS1Message :: Request ( request_id, request) ) => {
254
253
jsonrpc_object. serialize_field ( JSONRPC_ID_FIELD_KEY , & request_id. 0 ) ?;
255
- jsonrpc_object. serialize_field ( JSONRPC_METHOD_FIELD_KEY , request. method ( ) ) ?;
254
+ jsonrpc_object
255
+ . serialize_field ( JSONRPC_METHOD_FIELD_KEY , & LSPSMethod :: from ( request) ) ?;
256
256
257
257
match request {
258
258
LSPS1Request :: GetInfo ( params) => {
@@ -290,7 +290,8 @@ impl Serialize for LSPSMessage {
290
290
}
291
291
LSPSMessage :: LSPS2 ( LSPS2Message :: Request ( request_id, request) ) => {
292
292
jsonrpc_object. serialize_field ( JSONRPC_ID_FIELD_KEY , & request_id. 0 ) ?;
293
- jsonrpc_object. serialize_field ( JSONRPC_METHOD_FIELD_KEY , request. method ( ) ) ?;
293
+ jsonrpc_object
294
+ . serialize_field ( JSONRPC_METHOD_FIELD_KEY , & LSPSMethod :: from ( request) ) ?;
294
295
295
296
match request {
296
297
LSPS2Request :: GetInfo ( params) => {
@@ -336,7 +337,7 @@ impl Serialize for LSPSMessage {
336
337
}
337
338
338
339
struct LSPSMessageVisitor < ' a > {
339
- request_id_to_method_map : & ' a mut HashMap < String , String > ,
340
+ request_id_to_method_map : & ' a mut HashMap < RequestId , LSPSMethod > ,
340
341
}
341
342
342
343
impl < ' de , ' a > Visitor < ' de > for LSPSMessageVisitor < ' a > {
@@ -350,8 +351,8 @@ impl<'de, 'a> Visitor<'de> for LSPSMessageVisitor<'a> {
350
351
where
351
352
A : MapAccess < ' de > ,
352
353
{
353
- let mut id: Option < String > = None ;
354
- let mut method: Option < & str > = None ;
354
+ let mut id: Option < RequestId > = None ;
355
+ let mut method: Option < LSPSMethod > = None ;
355
356
let mut params = None ;
356
357
let mut result = None ;
357
358
let mut error: Option < ResponseError > = None ;
@@ -389,141 +390,134 @@ impl<'de, 'a> Visitor<'de> for LSPSMessageVisitor<'a> {
389
390
390
391
match method {
391
392
Some ( method) => match method {
392
- LSPS0_LISTPROTOCOLS_METHOD_NAME => Ok ( LSPSMessage :: LSPS0 ( LSPS0Message :: Request (
393
- RequestId ( id ) ,
393
+ LSPSMethod :: LSPS0ListProtocols => Ok ( LSPSMessage :: LSPS0 ( LSPS0Message :: Request (
394
+ id ,
394
395
LSPS0Request :: ListProtocols ( ListProtocolsRequest { } ) ,
395
396
) ) ) ,
396
397
#[ cfg( lsps1) ]
397
- LSPS1_GET_INFO_METHOD_NAME => {
398
+ LSPSMethod :: LSPS1GetInfo => {
398
399
let request = serde_json:: from_value ( params. unwrap_or ( json ! ( { } ) ) )
399
400
. map_err ( de:: Error :: custom) ?;
400
401
Ok ( LSPSMessage :: LSPS1 ( LSPS1Message :: Request (
401
- RequestId ( id ) ,
402
+ id ,
402
403
LSPS1Request :: GetInfo ( request) ,
403
404
) ) )
404
405
}
405
406
#[ cfg( lsps1) ]
406
- LSPS1_CREATE_ORDER_METHOD_NAME => {
407
+ LSPSMethod :: LSPS1CreateOrder => {
407
408
let request = serde_json:: from_value ( params. unwrap_or ( json ! ( { } ) ) )
408
409
. map_err ( de:: Error :: custom) ?;
409
410
Ok ( LSPSMessage :: LSPS1 ( LSPS1Message :: Request (
410
- RequestId ( id ) ,
411
+ id ,
411
412
LSPS1Request :: CreateOrder ( request) ,
412
413
) ) )
413
414
}
414
415
#[ cfg( lsps1) ]
415
- LSPS1_GET_ORDER_METHOD_NAME => {
416
+ LSPSMethod :: LSPS1GetOrder => {
416
417
let request = serde_json:: from_value ( params. unwrap_or ( json ! ( { } ) ) )
417
418
. map_err ( de:: Error :: custom) ?;
418
419
Ok ( LSPSMessage :: LSPS1 ( LSPS1Message :: Request (
419
- RequestId ( id ) ,
420
+ id ,
420
421
LSPS1Request :: GetOrder ( request) ,
421
422
) ) )
422
423
}
423
- LSPS2_GET_INFO_METHOD_NAME => {
424
+ LSPSMethod :: LSPS2GetInfo => {
424
425
let request = serde_json:: from_value ( params. unwrap_or ( json ! ( { } ) ) )
425
426
. map_err ( de:: Error :: custom) ?;
426
427
Ok ( LSPSMessage :: LSPS2 ( LSPS2Message :: Request (
427
- RequestId ( id ) ,
428
+ id ,
428
429
LSPS2Request :: GetInfo ( request) ,
429
430
) ) )
430
431
}
431
- LSPS2_BUY_METHOD_NAME => {
432
+ LSPSMethod :: LSPS2Buy => {
432
433
let request = serde_json:: from_value ( params. unwrap_or ( json ! ( { } ) ) )
433
434
. map_err ( de:: Error :: custom) ?;
434
- Ok ( LSPSMessage :: LSPS2 ( LSPS2Message :: Request (
435
- RequestId ( id) ,
436
- LSPS2Request :: Buy ( request) ,
437
- ) ) )
435
+ Ok ( LSPSMessage :: LSPS2 ( LSPS2Message :: Request ( id, LSPS2Request :: Buy ( request) ) ) )
438
436
}
439
- _ => Err ( de:: Error :: custom ( format ! (
440
- "Received request with unknown method: {}" ,
441
- method
442
- ) ) ) ,
443
437
} ,
444
438
None => match self . request_id_to_method_map . remove ( & id) {
445
- Some ( method) => match method. as_str ( ) {
446
- LSPS0_LISTPROTOCOLS_METHOD_NAME => {
439
+ Some ( method) => match method {
440
+ LSPSMethod :: LSPS0ListProtocols => {
447
441
if let Some ( error) = error {
448
442
Ok ( LSPSMessage :: LSPS0 ( LSPS0Message :: Response (
449
- RequestId ( id ) ,
443
+ id ,
450
444
LSPS0Response :: ListProtocolsError ( error) ,
451
445
) ) )
452
446
} else if let Some ( result) = result {
453
447
let list_protocols_response =
454
448
serde_json:: from_value ( result) . map_err ( de:: Error :: custom) ?;
455
449
Ok ( LSPSMessage :: LSPS0 ( LSPS0Message :: Response (
456
- RequestId ( id ) ,
450
+ id ,
457
451
LSPS0Response :: ListProtocols ( list_protocols_response) ,
458
452
) ) )
459
453
} else {
460
454
Err ( de:: Error :: custom ( "Received invalid JSON-RPC object: one of method, result, or error required" ) )
461
455
}
462
456
}
463
457
#[ cfg( lsps1) ]
464
- LSPS1_CREATE_ORDER_METHOD_NAME => {
458
+ LSPSMethod :: LSPS1CreateOrder => {
465
459
if let Some ( error) = error {
466
460
Ok ( LSPSMessage :: LSPS1 ( LSPS1Message :: Response (
467
- RequestId ( id ) ,
461
+ id ,
468
462
LSPS1Response :: CreateOrderError ( error) ,
469
463
) ) )
470
464
} else if let Some ( result) = result {
471
465
let response =
472
466
serde_json:: from_value ( result) . map_err ( de:: Error :: custom) ?;
473
467
Ok ( LSPSMessage :: LSPS1 ( LSPS1Message :: Response (
474
- RequestId ( id ) ,
468
+ id ,
475
469
LSPS1Response :: CreateOrder ( response) ,
476
470
) ) )
477
471
} else {
478
472
Err ( de:: Error :: custom ( "Received invalid JSON-RPC object: one of method, result, or error required" ) )
479
473
}
480
474
}
481
475
#[ cfg( lsps1) ]
482
- LSPS1_GET_ORDER_METHOD_NAME => {
476
+ LSPSMethod :: LSPS1GetOrder => {
483
477
if let Some ( error) = error {
484
478
Ok ( LSPSMessage :: LSPS1 ( LSPS1Message :: Response (
485
- RequestId ( id ) ,
479
+ id ,
486
480
LSPS1Response :: GetOrderError ( error) ,
487
481
) ) )
488
482
} else if let Some ( result) = result {
489
483
let response =
490
484
serde_json:: from_value ( result) . map_err ( de:: Error :: custom) ?;
491
485
Ok ( LSPSMessage :: LSPS1 ( LSPS1Message :: Response (
492
- RequestId ( id ) ,
486
+ id ,
493
487
LSPS1Response :: GetOrder ( response) ,
494
488
) ) )
495
489
} else {
496
490
Err ( de:: Error :: custom ( "Received invalid JSON-RPC object: one of method, result, or error required" ) )
497
491
}
498
492
}
499
- LSPS2_GET_INFO_METHOD_NAME => {
493
+ LSPSMethod :: LSPS2GetInfo => {
500
494
if let Some ( error) = error {
501
495
Ok ( LSPSMessage :: LSPS2 ( LSPS2Message :: Response (
502
- RequestId ( id ) ,
496
+ id ,
503
497
LSPS2Response :: GetInfoError ( error) ,
504
498
) ) )
505
499
} else if let Some ( result) = result {
506
500
let response =
507
501
serde_json:: from_value ( result) . map_err ( de:: Error :: custom) ?;
508
502
Ok ( LSPSMessage :: LSPS2 ( LSPS2Message :: Response (
509
- RequestId ( id ) ,
503
+ id ,
510
504
LSPS2Response :: GetInfo ( response) ,
511
505
) ) )
512
506
} else {
513
507
Err ( de:: Error :: custom ( "Received invalid JSON-RPC object: one of method, result, or error required" ) )
514
508
}
515
509
}
516
- LSPS2_BUY_METHOD_NAME => {
510
+ LSPSMethod :: LSPS2Buy => {
517
511
if let Some ( error) = error {
518
512
Ok ( LSPSMessage :: LSPS2 ( LSPS2Message :: Response (
519
- RequestId ( id ) ,
513
+ id ,
520
514
LSPS2Response :: BuyError ( error) ,
521
515
) ) )
522
516
} else if let Some ( result) = result {
523
517
let response =
524
518
serde_json:: from_value ( result) . map_err ( de:: Error :: custom) ?;
525
519
Ok ( LSPSMessage :: LSPS2 ( LSPS2Message :: Response (
526
- RequestId ( id ) ,
520
+ id ,
527
521
LSPS2Response :: Buy ( response) ,
528
522
) ) )
529
523
} else {
@@ -537,7 +531,7 @@ impl<'de, 'a> Visitor<'de> for LSPSMessageVisitor<'a> {
537
531
} ,
538
532
None => Err ( de:: Error :: custom ( format ! (
539
533
"Received response for unknown request id: {}" ,
540
- id
534
+ id. 0
541
535
) ) ) ,
542
536
} ,
543
537
}
@@ -579,7 +573,7 @@ mod tests {
579
573
let json = serde_json:: to_string ( & request) . unwrap ( ) ;
580
574
assert_eq ! (
581
575
json,
582
- r#"{"jsonrpc":"2.0","method":"lsps0.list_protocols"," id":"request:id:xyz123","params":{}}"#
576
+ r#"{"jsonrpc":"2.0","id":"request:id:xyz123","method":"lsps0.list_protocols ","params":{}}"#
583
577
) ;
584
578
}
585
579
@@ -594,7 +588,7 @@ mod tests {
594
588
}"# ;
595
589
let mut request_id_to_method_map = HashMap :: new ( ) ;
596
590
request_id_to_method_map
597
- . insert ( "request:id:xyz123" . to_string ( ) , "lsps0.list_protocols" . to_string ( ) ) ;
591
+ . insert ( RequestId ( "request:id:xyz123" . to_string ( ) ) , LSPSMethod :: LSPS0ListProtocols ) ;
598
592
599
593
let response =
600
594
LSPSMessage :: from_str_with_id_map ( json, & mut request_id_to_method_map) . unwrap ( ) ;
@@ -620,7 +614,7 @@ mod tests {
620
614
}"# ;
621
615
let mut request_id_to_method_map = HashMap :: new ( ) ;
622
616
request_id_to_method_map
623
- . insert ( "request:id:xyz123" . to_string ( ) , "lsps0.list_protocols" . to_string ( ) ) ;
617
+ . insert ( RequestId ( "request:id:xyz123" . to_string ( ) ) , LSPSMethod :: LSPS0ListProtocols ) ;
624
618
625
619
let response =
626
620
LSPSMessage :: from_str_with_id_map ( json, & mut request_id_to_method_map) . unwrap ( ) ;
@@ -649,7 +643,7 @@ mod tests {
649
643
}"# ;
650
644
let mut request_id_to_method_map = HashMap :: new ( ) ;
651
645
request_id_to_method_map
652
- . insert ( "request:id:xyz123" . to_string ( ) , "lsps0.list_protocols" . to_string ( ) ) ;
646
+ . insert ( RequestId ( "request:id:xyz123" . to_string ( ) ) , LSPSMethod :: LSPS0ListProtocols ) ;
653
647
654
648
let response = LSPSMessage :: from_str_with_id_map ( json, & mut request_id_to_method_map) ;
655
649
assert ! ( response. is_err( ) ) ;
0 commit comments