Skip to content

Commit bef4150

Browse files
committed
Converting built up vectors to iterators in the
`lightning-invoice/src/utils.rs` file - functions converted: - `select_phantom_hints` - `sort_and_filter_channels`
1 parent d87cc5b commit bef4150

File tree

1 file changed

+128
-121
lines changed

1 file changed

+128
-121
lines changed

lightning-invoice/src/utils.rs

Lines changed: 128 additions & 121 deletions
Original file line numberDiff line numberDiff line change
@@ -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.
279279
fn 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.
587587
fn 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

Comments
 (0)