@@ -241,7 +241,7 @@ where
241241 for PhantomRouteHints { channels, phantom_scid, real_node_pubkey } in phantom_route_hints {
242242 log_trace ! ( logger, "Generating phantom route hints for node {}" ,
243243 log_pubkey!( real_node_pubkey) ) ;
244- let mut route_hints = sort_and_filter_channels ( channels, amt_msat, & logger) ;
244+ let mut route_hints: Vec < RouteHint > = sort_and_filter_channels ( channels, amt_msat, & logger) . collect ( ) ;
245245
246246 // If we have any public channel, the route hints from `sort_and_filter_channels` will be
247247 // empty. In that case we create a RouteHint on which we will push a single hop with the
@@ -270,36 +270,36 @@ where
270270 // the hints across our real nodes we add one hint from each in turn until no node has any hints
271271 // left (if one node has more hints than any other, these will accumulate at the end of the
272272 // vector).
273- rotate_nested_vectors ( phantom_hints)
273+ rotate_nested_vectors ( phantom_hints)
274274
275275}
276276
277277// Draw items iteratively from multiple nested vectors. The items are retrieved by index and
278278// rotates through the vectors - first the zero index then the first index then second index, etc.
279279fn rotate_nested_vectors < T : Clone > ( vecs : Vec < Vec < T > > ) -> impl Iterator < Item = T > {
280- let max_vector_length: usize = vecs. iter ( ) . map ( |x| x. len ( ) ) . max ( ) . unwrap ( ) ;
281- let mut hint_index = 0 ;
282- let mut vector_index = 0 ;
283- let number_inner_vectors: usize = vecs. len ( ) ;
284-
285- core:: iter:: from_fn ( move || loop {
286- if hint_index == max_vector_length {
287- return None ;
288- } ;
289- let hint_value = if vecs[ vector_index] . len ( ) != 0 && vecs[ vector_index] . len ( ) > hint_index {
290- Some ( vecs[ vector_index] [ hint_index] . clone ( ) )
291- } else {
292- None // no value retrieved - continue looping
293- } ;
294- vector_index += 1 ;
295- if hint_index < max_vector_length && vector_index == number_inner_vectors {
296- vector_index = 0 ;
297- hint_index += 1 ;
298- } ;
299- if !hint_value. is_none ( ) {
300- return hint_value;
301- } ;
302- } )
280+ let max_vector_length: usize = vecs. iter ( ) . map ( |x| x. len ( ) ) . max ( ) . unwrap ( ) ;
281+ let mut hint_index = 0 ;
282+ let mut vector_index = 0 ;
283+ let number_inner_vectors: usize = vecs. len ( ) ;
284+
285+ core:: iter:: from_fn ( move || loop {
286+ if hint_index == max_vector_length {
287+ return None ;
288+ } ;
289+ let hint_value = if vecs[ vector_index] . len ( ) != 0 && vecs[ vector_index] . len ( ) > hint_index {
290+ Some ( vecs[ vector_index] [ hint_index] . clone ( ) )
291+ } else {
292+ None // no value retrieved - continue looping
293+ } ;
294+ vector_index += 1 ;
295+ if hint_index < max_vector_length && vector_index == number_inner_vectors {
296+ vector_index = 0 ;
297+ hint_index += 1 ;
298+ } ;
299+ if !hint_value. is_none ( ) {
300+ return hint_value;
301+ } ;
302+ } )
303303}
304304
305305#[ cfg( feature = "std" ) ]
@@ -585,15 +585,34 @@ fn _create_invoice_from_channelmanager_and_duration_since_epoch_with_payment_has
585585/// * Sorted by lowest inbound capacity if an online channel with the minimum amount requested exists,
586586/// otherwise sort by highest inbound capacity to give the payment the best chance of succeeding.
587587fn sort_and_filter_channels < L : Deref > (
588- channels : Vec < ChannelDetails > , min_inbound_capacity_msat : Option < u64 > , logger : & L
589- ) -> Vec < RouteHint > where L :: Target : Logger {
588+ channels : Vec < ChannelDetails > ,
589+ min_inbound_capacity_msat : Option < u64 > ,
590+ logger : & L ,
591+ ) -> impl Iterator < Item = RouteHint >
592+ where
593+ L :: Target : Logger ,
594+ {
590595 let mut filtered_channels: HashMap < PublicKey , ChannelDetails > = HashMap :: new ( ) ;
591596 let min_inbound_capacity = min_inbound_capacity_msat. unwrap_or ( 0 ) ;
592597 let mut min_capacity_channel_exists = false ;
593598 let mut online_channel_exists = false ;
594599 let mut online_min_capacity_channel_exists = false ;
595600 let mut has_pub_unconf_chan = false ;
596601
602+ let route_hint_from_channel = |channel : ChannelDetails | {
603+ let forwarding_info = channel. counterparty . forwarding_info . as_ref ( ) . unwrap ( ) ;
604+ RouteHint ( vec ! [ RouteHintHop {
605+ src_node_id: channel. counterparty. node_id,
606+ short_channel_id: channel. get_inbound_payment_scid( ) . unwrap( ) ,
607+ fees: RoutingFees {
608+ base_msat: forwarding_info. fee_base_msat,
609+ proportional_millionths: forwarding_info. fee_proportional_millionths,
610+ } ,
611+ cltv_expiry_delta: forwarding_info. cltv_expiry_delta,
612+ htlc_minimum_msat: channel. inbound_htlc_minimum_msat,
613+ htlc_maximum_msat: channel. inbound_htlc_maximum_msat, } ] )
614+ } ;
615+
597616 log_trace ! ( logger, "Considering {} channels for invoice route hints" , channels. len( ) ) ;
598617 for channel in channels. into_iter ( ) . filter ( |chan| chan. is_channel_ready ) {
599618 if channel. get_inbound_payment_scid ( ) . is_none ( ) || channel. counterparty . forwarding_info . is_none ( ) {
@@ -612,7 +631,7 @@ fn sort_and_filter_channels<L: Deref>(
612631 // look at the public channels instead.
613632 log_trace ! ( logger, "Not including channels in invoice route hints on account of public channel {}" ,
614633 log_bytes!( channel. channel_id) ) ;
615- return vec ! [ ]
634+ return vec ! [ ] . into_iter ( ) . take ( 3 ) . map ( route_hint_from_channel ) ;
616635 }
617636 }
618637
@@ -672,19 +691,6 @@ fn sort_and_filter_channels<L: Deref>(
672691 }
673692 }
674693
675- let route_hint_from_channel = |channel : ChannelDetails | {
676- let forwarding_info = channel. counterparty . forwarding_info . as_ref ( ) . unwrap ( ) ;
677- RouteHint ( vec ! [ RouteHintHop {
678- src_node_id: channel. counterparty. node_id,
679- short_channel_id: channel. get_inbound_payment_scid( ) . unwrap( ) ,
680- fees: RoutingFees {
681- base_msat: forwarding_info. fee_base_msat,
682- proportional_millionths: forwarding_info. fee_proportional_millionths,
683- } ,
684- cltv_expiry_delta: forwarding_info. cltv_expiry_delta,
685- htlc_minimum_msat: channel. inbound_htlc_minimum_msat,
686- htlc_maximum_msat: channel. inbound_htlc_maximum_msat, } ] )
687- } ;
688694 // If all channels are private, prefer to return route hints which have a higher capacity than
689695 // the payment value and where we're currently connected to the channel counterparty.
690696 // Even if we cannot satisfy both goals, always ensure we include *some* hints, preferring
@@ -734,7 +740,8 @@ fn sort_and_filter_channels<L: Deref>(
734740 } else {
735741 b. inbound_capacity_msat . cmp ( & a. inbound_capacity_msat )
736742 } } ) ;
737- eligible_channels. into_iter ( ) . take ( 3 ) . map ( route_hint_from_channel) . collect :: < Vec < RouteHint > > ( )
743+
744+ eligible_channels. into_iter ( ) . take ( 3 ) . map ( route_hint_from_channel)
738745}
739746
740747/// prefer_current_channel chooses a channel to use for route hints between a currently selected and candidate
@@ -1898,110 +1905,110 @@ mod test {
18981905 }
18991906
19001907
1901- #[ test]
1902- fn test_zip_nested_vectors ( ) {
1908+ #[ test]
1909+ fn test_zip_nested_vectors ( ) {
19031910 // two nested vectors
1904- let a = vec ! [ vec![ "a0" , "b0" , "c0" ] , vec![ "a1" , "b1" ] ] ;
1905- let result = rotate_nested_vectors ( a) . collect :: < Vec < _ > > ( ) ;
1911+ let a = vec ! [ vec![ "a0" , "b0" , "c0" ] , vec![ "a1" , "b1" ] ] ;
1912+ let result = rotate_nested_vectors ( a) . collect :: < Vec < _ > > ( ) ;
19061913
1907- let expected = vec ! [ "a0" , "a1" , "b0" , "b1" , "c0" ] ;
1908- assert_eq ! ( expected, result) ;
1914+ let expected = vec ! [ "a0" , "a1" , "b0" , "b1" , "c0" ] ;
1915+ assert_eq ! ( expected, result) ;
19091916
1910- // test single nested vector
1911- let a = vec ! [ vec![ "a0" , "b0" , "c0" ] ] ;
1912- let result = rotate_nested_vectors ( a) . collect :: < Vec < _ > > ( ) ;
1917+ // test single nested vector
1918+ let a = vec ! [ vec![ "a0" , "b0" , "c0" ] ] ;
1919+ let result = rotate_nested_vectors ( a) . collect :: < Vec < _ > > ( ) ;
19131920
1914- let expected = vec ! [ "a0" , "b0" , "c0" ] ;
1915- assert_eq ! ( expected, result) ;
1921+ let expected = vec ! [ "a0" , "b0" , "c0" ] ;
1922+ assert_eq ! ( expected, result) ;
19161923
1917- // test second vector with only one element
1918- let a = vec ! [ vec![ "a0" , "b0" , "c0" ] , vec![ "a1" ] ] ;
1919- let result = rotate_nested_vectors ( a) . collect :: < Vec < _ > > ( ) ;
1924+ // test second vector with only one element
1925+ let a = vec ! [ vec![ "a0" , "b0" , "c0" ] , vec![ "a1" ] ] ;
1926+ let result = rotate_nested_vectors ( a) . collect :: < Vec < _ > > ( ) ;
19201927
1921- let expected = vec ! [ "a0" , "a1" , "b0" , "c0" ] ;
1922- assert_eq ! ( expected, result) ;
1928+ let expected = vec ! [ "a0" , "a1" , "b0" , "c0" ] ;
1929+ assert_eq ! ( expected, result) ;
19231930
1924- // test three nestend vectors
1925- let a = vec ! [ vec![ "a0" ] , vec![ "a1" , "b1" , "c1" ] , vec![ "a2" ] ] ;
1926- let result = rotate_nested_vectors ( a) . collect :: < Vec < _ > > ( ) ;
1931+ // test three nestend vectors
1932+ let a = vec ! [ vec![ "a0" ] , vec![ "a1" , "b1" , "c1" ] , vec![ "a2" ] ] ;
1933+ let result = rotate_nested_vectors ( a) . collect :: < Vec < _ > > ( ) ;
19271934
1928- let expected = vec ! [ "a0" , "a1" , "a2" , "b1" , "c1" ] ;
1929- assert_eq ! ( expected, result) ;
1935+ let expected = vec ! [ "a0" , "a1" , "a2" , "b1" , "c1" ] ;
1936+ assert_eq ! ( expected, result) ;
19301937
1931- // test single nested vector with a single value
1932- let a = vec ! [ vec![ "a0" ] ] ;
1933- let result = rotate_nested_vectors ( a) . collect :: < Vec < _ > > ( ) ;
1938+ // test single nested vector with a single value
1939+ let a = vec ! [ vec![ "a0" ] ] ;
1940+ let result = rotate_nested_vectors ( a) . collect :: < Vec < _ > > ( ) ;
19341941
1935- let expected = vec ! [ "a0" ] ;
1936- assert_eq ! ( expected, result) ;
1942+ let expected = vec ! [ "a0" ] ;
1943+ assert_eq ! ( expected, result) ;
19371944
1938- // test single empty nested vector
1939- let a: Vec < Vec < & str > > = vec ! [ vec![ ] ] ;
1940- let result = rotate_nested_vectors ( a) . collect :: < Vec < _ > > ( ) ;
1941- let expected: Vec < & str > = vec ! [ ] ;
1945+ // test single empty nested vector
1946+ let a: Vec < Vec < & str > > = vec ! [ vec![ ] ] ;
1947+ let result = rotate_nested_vectors ( a) . collect :: < Vec < _ > > ( ) ;
1948+ let expected: Vec < & str > = vec ! [ ] ;
19421949
1943- assert_eq ! ( expected, result) ;
1950+ assert_eq ! ( expected, result) ;
19441951
1945- // test first nested vector is empty
1946- let a = vec ! [ vec![ ] , vec![ "a1" , "b1" , "c1" ] ] ;
1947- let result = rotate_nested_vectors ( a) . collect :: < Vec < _ > > ( ) ;
1952+ // test first nested vector is empty
1953+ let a = vec ! [ vec![ ] , vec![ "a1" , "b1" , "c1" ] ] ;
1954+ let result = rotate_nested_vectors ( a) . collect :: < Vec < _ > > ( ) ;
19481955
1949- let expected = vec ! [ "a1" , "b1" , "c1" ] ;
1950- assert_eq ! ( expected, result) ;
1956+ let expected = vec ! [ "a1" , "b1" , "c1" ] ;
1957+ assert_eq ! ( expected, result) ;
19511958
1952- // test two empty vectors
1953- let a: Vec < Vec < & str > > = vec ! [ vec![ ] , vec![ ] ] ;
1954- let result = rotate_nested_vectors ( a) . collect :: < Vec < _ > > ( ) ;
1959+ // test two empty vectors
1960+ let a: Vec < Vec < & str > > = vec ! [ vec![ ] , vec![ ] ] ;
1961+ let result = rotate_nested_vectors ( a) . collect :: < Vec < _ > > ( ) ;
19551962
1956- let expected: Vec < & str > = vec ! [ ] ;
1957- assert_eq ! ( expected, result) ;
1963+ let expected: Vec < & str > = vec ! [ ] ;
1964+ assert_eq ! ( expected, result) ;
19581965
1959- // test an empty vector amongst other filled vectors
1960- let a = vec ! [
1961- vec![ "a0" , "b0" , "c0" ] ,
1962- vec![ ] ,
1963- vec![ "a1" , "b1" , "c1" ] ,
1964- vec![ "a2" , "b2" , "c2" ] ,
1965- ] ;
1966- let result = rotate_nested_vectors ( a) . collect :: < Vec < _ > > ( ) ;
1966+ // test an empty vector amongst other filled vectors
1967+ let a = vec ! [
1968+ vec![ "a0" , "b0" , "c0" ] ,
1969+ vec![ ] ,
1970+ vec![ "a1" , "b1" , "c1" ] ,
1971+ vec![ "a2" , "b2" , "c2" ] ,
1972+ ] ;
1973+ let result = rotate_nested_vectors ( a) . collect :: < Vec < _ > > ( ) ;
19671974
1968- let expected = vec ! [ "a0" , "a1" , "a2" , "b0" , "b1" , "b2" , "c0" , "c1" , "c2" ] ;
1969- assert_eq ! ( expected, result) ;
1975+ let expected = vec ! [ "a0" , "a1" , "a2" , "b0" , "b1" , "b2" , "c0" , "c1" , "c2" ] ;
1976+ assert_eq ! ( expected, result) ;
19701977
1971- // test a filled vector between two empty vectors
1972- let a = vec ! [ vec![ ] , vec![ "a1" , "b1" , "c1" ] , vec![ ] ] ;
1973- let result = rotate_nested_vectors ( a) . collect :: < Vec < _ > > ( ) ;
1978+ // test a filled vector between two empty vectors
1979+ let a = vec ! [ vec![ ] , vec![ "a1" , "b1" , "c1" ] , vec![ ] ] ;
1980+ let result = rotate_nested_vectors ( a) . collect :: < Vec < _ > > ( ) ;
19741981
1975- let expected = vec ! [ "a1" , "b1" , "c1" ] ;
1976- assert_eq ! ( expected, result) ;
1982+ let expected = vec ! [ "a1" , "b1" , "c1" ] ;
1983+ assert_eq ! ( expected, result) ;
19771984
1978- // test an empty vector at the end of the vectors
1979- let a = vec ! [ vec![ "a0" , "b0" , "c0" ] , vec![ ] ] ;
1980- let result = rotate_nested_vectors ( a) . collect :: < Vec < _ > > ( ) ;
1985+ // test an empty vector at the end of the vectors
1986+ let a = vec ! [ vec![ "a0" , "b0" , "c0" ] , vec![ ] ] ;
1987+ let result = rotate_nested_vectors ( a) . collect :: < Vec < _ > > ( ) ;
19811988
1982- let expected = vec ! [ "a0" , "b0" , "c0" ] ;
1983- assert_eq ! ( expected, result) ;
1989+ let expected = vec ! [ "a0" , "b0" , "c0" ] ;
1990+ assert_eq ! ( expected, result) ;
19841991
1985- // test multiple empty vectors amongst multiple filled vectors
1986- let a = vec ! [
1987- vec![ ] ,
1988- vec![ "a1" , "b1" , "c1" ] ,
1989- vec![ ] ,
1990- vec![ "a3" , "b3" ] ,
1991- vec![ ] ,
1992- ] ;
1992+ // test multiple empty vectors amongst multiple filled vectors
1993+ let a = vec ! [
1994+ vec![ ] ,
1995+ vec![ "a1" , "b1" , "c1" ] ,
1996+ vec![ ] ,
1997+ vec![ "a3" , "b3" ] ,
1998+ vec![ ] ,
1999+ ] ;
19932000
1994- let result = rotate_nested_vectors ( a) . collect :: < Vec < _ > > ( ) ;
2001+ let result = rotate_nested_vectors ( a) . collect :: < Vec < _ > > ( ) ;
19952002
1996- let expected = vec ! [ "a1" , "a3" , "b1" , "b3" , "c1" ] ;
1997- assert_eq ! ( expected, result) ;
2003+ let expected = vec ! [ "a1" , "a3" , "b1" , "b3" , "c1" ] ;
2004+ assert_eq ! ( expected, result) ;
19982005
1999- // test one element in the first nested vectore and two elements in the second nested
2000- // vector
2001- let a = vec ! [ vec![ "a0" ] , vec![ "a1" , "b1" ] ] ;
2002- let result = rotate_nested_vectors ( a) . collect :: < Vec < _ > > ( ) ;
2006+ // test one element in the first nested vectore and two elements in the second nested
2007+ // vector
2008+ let a = vec ! [ vec![ "a0" ] , vec![ "a1" , "b1" ] ] ;
2009+ let result = rotate_nested_vectors ( a) . collect :: < Vec < _ > > ( ) ;
20032010
2004- let expected = vec ! [ "a0" , "a1" , "b1" ] ;
2005- assert_eq ! ( expected, result) ;
2006- }
2011+ let expected = vec ! [ "a0" , "a1" , "b1" ] ;
2012+ assert_eq ! ( expected, result) ;
2013+ }
20072014}
0 commit comments