@@ -19,17 +19,17 @@ use ldk_server_client::ldk_server_protos::api::{
1919 CloseChannelRequest , CloseChannelResponse , ForceCloseChannelRequest , ForceCloseChannelResponse ,
2020 GetBalancesRequest , GetBalancesResponse , GetNodeInfoRequest , GetNodeInfoResponse ,
2121 GetPaymentDetailsRequest , GetPaymentDetailsResponse , ListChannelsRequest , ListChannelsResponse ,
22- ListPaymentsRequest , ListPaymentsResponse , OnchainReceiveRequest , OnchainReceiveResponse ,
23- OnchainSendRequest , OnchainSendResponse , OpenChannelRequest , OpenChannelResponse ,
24- SpliceInRequest , SpliceInResponse , SpliceOutRequest , SpliceOutResponse ,
22+ ListForwardedPaymentsRequest , ListPaymentsRequest , OnchainReceiveRequest ,
23+ OnchainReceiveResponse , OnchainSendRequest , OnchainSendResponse , OpenChannelRequest ,
24+ OpenChannelResponse , SpliceInRequest , SpliceInResponse , SpliceOutRequest , SpliceOutResponse ,
2525 UpdateChannelConfigRequest , UpdateChannelConfigResponse ,
2626} ;
2727use ldk_server_client:: ldk_server_protos:: types:: {
2828 bolt11_invoice_description, Bolt11InvoiceDescription , ChannelConfig , PageToken ,
2929 RouteParametersConfig ,
3030} ;
3131use serde:: Serialize ;
32- use types:: CliListPaymentsResponse ;
32+ use types:: { CliListForwardedPaymentsResponse , CliListPaymentsResponse , CliPaginatedResponse } ;
3333
3434mod types;
3535
@@ -204,6 +204,16 @@ enum Commands {
204204 #[ arg( short, long, help = "The payment ID in hex-encoded form" ) ]
205205 payment_id : String ,
206206 } ,
207+ ListForwardedPayments {
208+ #[ arg( short, long) ]
209+ #[ arg(
210+ help = "Fetch at least this many forwarded payments by iterating through multiple pages. Returns combined results with the last page token. If not provided, returns only a single page."
211+ ) ]
212+ number_of_payments : Option < u64 > ,
213+ #[ arg( long) ]
214+ #[ arg( help = "Page token to continue from a previous page (format: token:index)" ) ]
215+ page_token : Option < String > ,
216+ } ,
207217 UpdateChannelConfig {
208218 #[ arg( short, long) ]
209219 user_channel_id : String ,
@@ -454,14 +464,38 @@ async fn main() {
454464 . map ( |token_str| parse_page_token ( & token_str) . unwrap_or_else ( |e| handle_error ( e) ) ) ;
455465
456466 handle_response_result :: < _ , CliListPaymentsResponse > (
457- handle_list_payments ( client, number_of_payments, page_token) . await ,
467+ fetch_paginated (
468+ number_of_payments,
469+ page_token,
470+ |pt| client. list_payments ( ListPaymentsRequest { page_token : pt } ) ,
471+ |r| ( r. payments , r. next_page_token ) ,
472+ )
473+ . await ,
458474 ) ;
459475 } ,
460476 Commands :: GetPaymentDetails { payment_id } => {
461477 handle_response_result :: < _ , GetPaymentDetailsResponse > (
462478 client. get_payment_details ( GetPaymentDetailsRequest { payment_id } ) . await ,
463479 ) ;
464480 } ,
481+ Commands :: ListForwardedPayments { number_of_payments, page_token } => {
482+ let page_token = page_token
483+ . map ( |token_str| parse_page_token ( & token_str) . unwrap_or_else ( |e| handle_error ( e) ) ) ;
484+
485+ handle_response_result :: < _ , CliListForwardedPaymentsResponse > (
486+ fetch_paginated (
487+ number_of_payments,
488+ page_token,
489+ |pt| {
490+ client. list_forwarded_payments ( ListForwardedPaymentsRequest {
491+ page_token : pt,
492+ } )
493+ } ,
494+ |r| ( r. forwarded_payments , r. next_page_token ) ,
495+ )
496+ . await ,
497+ ) ;
498+ } ,
465499 Commands :: UpdateChannelConfig {
466500 user_channel_id,
467501 counterparty_node_id,
@@ -513,37 +547,40 @@ fn build_open_channel_config(
513547 } )
514548}
515549
516- async fn handle_list_payments (
517- client : LdkServerClient , number_of_payments : Option < u64 > , initial_page_token : Option < PageToken > ,
518- ) -> Result < ListPaymentsResponse , LdkServerError > {
519- if let Some ( count) = number_of_payments {
520- list_n_payments ( client, count, initial_page_token) . await
521- } else {
522- // Fetch single page
523- client. list_payments ( ListPaymentsRequest { page_token : initial_page_token } ) . await
524- }
525- }
526-
527- async fn list_n_payments (
528- client : LdkServerClient , target_count : u64 , initial_page_token : Option < PageToken > ,
529- ) -> Result < ListPaymentsResponse , LdkServerError > {
530- let mut payments = Vec :: with_capacity ( target_count as usize ) ;
531- let mut page_token = initial_page_token;
532- let mut next_page_token;
550+ async fn fetch_paginated < T , R , Fut > (
551+ target_count : Option < u64 > , initial_page_token : Option < PageToken > ,
552+ fetch_page : impl Fn ( Option < PageToken > ) -> Fut ,
553+ extract : impl Fn ( R ) -> ( Vec < T > , Option < PageToken > ) ,
554+ ) -> Result < CliPaginatedResponse < T > , LdkServerError >
555+ where
556+ Fut : std:: future:: Future < Output = Result < R , LdkServerError > > ,
557+ {
558+ match target_count {
559+ Some ( count) => {
560+ let mut items = Vec :: with_capacity ( count as usize ) ;
561+ let mut page_token = initial_page_token;
562+ let mut next_page_token;
533563
534- loop {
535- let response = client. list_payments ( ListPaymentsRequest { page_token } ) . await ?;
564+ loop {
565+ let response = fetch_page ( page_token) . await ?;
566+ let ( new_items, new_next_page_token) = extract ( response) ;
567+ items. extend ( new_items) ;
568+ next_page_token = new_next_page_token;
536569
537- payments. extend ( response. payments ) ;
538- next_page_token = response. next_page_token ;
570+ if items. len ( ) >= count as usize || next_page_token. is_none ( ) {
571+ break ;
572+ }
573+ page_token = next_page_token;
574+ }
539575
540- if payments. len ( ) >= target_count as usize || next_page_token. is_none ( ) {
541- break ;
542- }
543- page_token = next_page_token;
576+ Ok ( CliPaginatedResponse :: new ( items, next_page_token) )
577+ } ,
578+ None => {
579+ let response = fetch_page ( initial_page_token) . await ?;
580+ let ( items, next_page_token) = extract ( response) ;
581+ Ok ( CliPaginatedResponse :: new ( items, next_page_token) )
582+ } ,
544583 }
545-
546- Ok ( ListPaymentsResponse { payments, next_page_token } )
547584}
548585
549586fn handle_response_result < Rs , Js > ( response : Result < Rs , LdkServerError > )
0 commit comments