@@ -24,17 +24,18 @@ use ldk_server_client::ldk_server_protos::api::{
2424 Bolt12ReceiveRequest , Bolt12ReceiveResponse , Bolt12SendRequest , Bolt12SendResponse ,
2525 CloseChannelRequest , CloseChannelResponse , ForceCloseChannelRequest , ForceCloseChannelResponse ,
2626 GetBalancesRequest , GetBalancesResponse , GetNodeInfoRequest , GetNodeInfoResponse ,
27- ListChannelsRequest , ListChannelsResponse , ListPaymentsRequest , ListPaymentsResponse ,
28- OnchainReceiveRequest , OnchainReceiveResponse , OnchainSendRequest , OnchainSendResponse ,
29- OpenChannelRequest , OpenChannelResponse , SpliceInRequest , SpliceInResponse , SpliceOutRequest ,
30- SpliceOutResponse , UpdateChannelConfigRequest , UpdateChannelConfigResponse ,
27+ GetPaymentDetailsRequest , GetPaymentDetailsResponse , ListChannelsRequest , ListChannelsResponse ,
28+ ListForwardedPaymentsRequest , ListPaymentsRequest , OnchainReceiveRequest ,
29+ OnchainReceiveResponse , OnchainSendRequest , OnchainSendResponse , OpenChannelRequest ,
30+ OpenChannelResponse , SpliceInRequest , SpliceInResponse , SpliceOutRequest , SpliceOutResponse ,
31+ UpdateChannelConfigRequest , UpdateChannelConfigResponse ,
3132} ;
3233use ldk_server_client:: ldk_server_protos:: types:: {
3334 bolt11_invoice_description, Bolt11InvoiceDescription , ChannelConfig , PageToken ,
3435 RouteParametersConfig ,
3536} ;
3637use serde:: Serialize ;
37- use types:: CliListPaymentsResponse ;
38+ use types:: { CliListForwardedPaymentsResponse , CliListPaymentsResponse , CliPaginatedResponse } ;
3839
3940mod config;
4041mod types;
@@ -293,7 +294,22 @@ enum Commands {
293294 #[ arg( help = "Page token to continue from a previous page (format: token:index)" ) ]
294295 page_token : Option < String > ,
295296 } ,
296- #[ command( about = "Update the config for a previously opened channel" ) ]
297+ #[ command( about = "Get details of a specific payment by its payment ID" ) ]
298+ GetPaymentDetails {
299+ #[ arg( short, long, help = "The payment ID in hex-encoded form" ) ]
300+ payment_id : String ,
301+ } ,
302+ #[ command( about = "Retrieves list of all forwarded payments" ) ]
303+ ListForwardedPayments {
304+ #[ arg(
305+ short,
306+ long,
307+ 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."
308+ ) ]
309+ number_of_payments : Option < u64 > ,
310+ #[ arg( long, help = "Page token to continue from a previous page (format: token:index)" ) ]
311+ page_token : Option < String > ,
312+ } ,
297313 UpdateChannelConfig {
298314 #[ arg( short, long, help = "The local user_channel_id of this channel" ) ]
299315 user_channel_id : String ,
@@ -584,7 +600,36 @@ async fn main() {
584600 . map ( |token_str| parse_page_token ( & token_str) . unwrap_or_else ( |e| handle_error ( e) ) ) ;
585601
586602 handle_response_result :: < _ , CliListPaymentsResponse > (
587- handle_list_payments ( client, number_of_payments, page_token) . await ,
603+ fetch_paginated (
604+ number_of_payments,
605+ page_token,
606+ |pt| client. list_payments ( ListPaymentsRequest { page_token : pt } ) ,
607+ |r| ( r. payments , r. next_page_token ) ,
608+ )
609+ . await ,
610+ ) ;
611+ } ,
612+ Commands :: GetPaymentDetails { payment_id } => {
613+ handle_response_result :: < _ , GetPaymentDetailsResponse > (
614+ client. get_payment_details ( GetPaymentDetailsRequest { payment_id } ) . await ,
615+ ) ;
616+ } ,
617+ Commands :: ListForwardedPayments { number_of_payments, page_token } => {
618+ let page_token = page_token
619+ . map ( |token_str| parse_page_token ( & token_str) . unwrap_or_else ( |e| handle_error ( e) ) ) ;
620+
621+ handle_response_result :: < _ , CliListForwardedPaymentsResponse > (
622+ fetch_paginated (
623+ number_of_payments,
624+ page_token,
625+ |pt| {
626+ client. list_forwarded_payments ( ListForwardedPaymentsRequest {
627+ page_token : pt,
628+ } )
629+ } ,
630+ |r| ( r. forwarded_payments , r. next_page_token ) ,
631+ )
632+ . await ,
588633 ) ;
589634 } ,
590635 Commands :: UpdateChannelConfig {
@@ -638,37 +683,40 @@ fn build_open_channel_config(
638683 } )
639684}
640685
641- async fn handle_list_payments (
642- client : LdkServerClient , number_of_payments : Option < u64 > , initial_page_token : Option < PageToken > ,
643- ) -> Result < ListPaymentsResponse , LdkServerError > {
644- if let Some ( count) = number_of_payments {
645- list_n_payments ( client, count, initial_page_token) . await
646- } else {
647- // Fetch single page
648- client. list_payments ( ListPaymentsRequest { page_token : initial_page_token } ) . await
649- }
650- }
651-
652- async fn list_n_payments (
653- client : LdkServerClient , target_count : u64 , initial_page_token : Option < PageToken > ,
654- ) -> Result < ListPaymentsResponse , LdkServerError > {
655- let mut payments = Vec :: with_capacity ( target_count as usize ) ;
656- let mut page_token = initial_page_token;
657- let mut next_page_token;
658-
659- loop {
660- let response = client. list_payments ( ListPaymentsRequest { page_token } ) . await ?;
661-
662- payments. extend ( response. payments ) ;
663- next_page_token = response. next_page_token ;
686+ async fn fetch_paginated < T , R , Fut > (
687+ target_count : Option < u64 > , initial_page_token : Option < PageToken > ,
688+ fetch_page : impl Fn ( Option < PageToken > ) -> Fut ,
689+ extract : impl Fn ( R ) -> ( Vec < T > , Option < PageToken > ) ,
690+ ) -> Result < CliPaginatedResponse < T > , LdkServerError >
691+ where
692+ Fut : std:: future:: Future < Output = Result < R , LdkServerError > > ,
693+ {
694+ match target_count {
695+ Some ( count) => {
696+ let mut items = Vec :: with_capacity ( count as usize ) ;
697+ let mut page_token = initial_page_token;
698+ let mut next_page_token;
699+
700+ loop {
701+ let response = fetch_page ( page_token) . await ?;
702+ let ( new_items, new_next_page_token) = extract ( response) ;
703+ items. extend ( new_items) ;
704+ next_page_token = new_next_page_token;
705+
706+ if items. len ( ) >= count as usize || next_page_token. is_none ( ) {
707+ break ;
708+ }
709+ page_token = next_page_token;
710+ }
664711
665- if payments. len ( ) >= target_count as usize || next_page_token. is_none ( ) {
666- break ;
667- }
668- page_token = next_page_token;
712+ Ok ( CliPaginatedResponse :: new ( items, next_page_token) )
713+ } ,
714+ None => {
715+ let response = fetch_page ( initial_page_token) . await ?;
716+ let ( items, next_page_token) = extract ( response) ;
717+ Ok ( CliPaginatedResponse :: new ( items, next_page_token) )
718+ } ,
669719 }
670-
671- Ok ( ListPaymentsResponse { payments, next_page_token } )
672720}
673721
674722fn handle_response_result < Rs , Js > ( response : Result < Rs , LdkServerError > )
0 commit comments