Skip to content

Commit 7b40f43

Browse files
authored
Merge pull request #4875 from epage/panic
fix(parser): Update iterator sizes as we go
2 parents a721454 + 937f1ed commit 7b40f43

File tree

1 file changed

+93
-10
lines changed

1 file changed

+93
-10
lines changed

clap_builder/src/parser/matches/arg_matches.rs

+93-10
Original file line numberDiff line numberDiff line change
@@ -1405,7 +1405,12 @@ impl<T> Iterator for Values<T> {
14051405
type Item = T;
14061406

14071407
fn next(&mut self) -> Option<Self::Item> {
1408-
self.iter.next()
1408+
if let Some(next) = self.iter.next() {
1409+
self.len -= 1;
1410+
Some(next)
1411+
} else {
1412+
None
1413+
}
14091414
}
14101415
fn size_hint(&self) -> (usize, Option<usize>) {
14111416
(self.len, Some(self.len))
@@ -1414,7 +1419,12 @@ impl<T> Iterator for Values<T> {
14141419

14151420
impl<T> DoubleEndedIterator for Values<T> {
14161421
fn next_back(&mut self) -> Option<Self::Item> {
1417-
self.iter.next_back()
1422+
if let Some(next) = self.iter.next_back() {
1423+
self.len -= 1;
1424+
Some(next)
1425+
} else {
1426+
None
1427+
}
14181428
}
14191429
}
14201430

@@ -1463,7 +1473,12 @@ impl<'a, T: 'a> Iterator for ValuesRef<'a, T> {
14631473
type Item = &'a T;
14641474

14651475
fn next(&mut self) -> Option<Self::Item> {
1466-
self.iter.next()
1476+
if let Some(next) = self.iter.next() {
1477+
self.len -= 1;
1478+
Some(next)
1479+
} else {
1480+
None
1481+
}
14671482
}
14681483
fn size_hint(&self) -> (usize, Option<usize>) {
14691484
(self.len, Some(self.len))
@@ -1472,7 +1487,12 @@ impl<'a, T: 'a> Iterator for ValuesRef<'a, T> {
14721487

14731488
impl<'a, T: 'a> DoubleEndedIterator for ValuesRef<'a, T> {
14741489
fn next_back(&mut self) -> Option<Self::Item> {
1475-
self.iter.next_back()
1490+
if let Some(next) = self.iter.next_back() {
1491+
self.len -= 1;
1492+
Some(next)
1493+
} else {
1494+
None
1495+
}
14761496
}
14771497
}
14781498

@@ -1526,7 +1546,12 @@ impl<'a> Iterator for RawValues<'a> {
15261546
type Item = &'a OsStr;
15271547

15281548
fn next(&mut self) -> Option<&'a OsStr> {
1529-
self.iter.next()
1549+
if let Some(next) = self.iter.next() {
1550+
self.len -= 1;
1551+
Some(next)
1552+
} else {
1553+
None
1554+
}
15301555
}
15311556
fn size_hint(&self) -> (usize, Option<usize>) {
15321557
(self.len, Some(self.len))
@@ -1535,7 +1560,12 @@ impl<'a> Iterator for RawValues<'a> {
15351560

15361561
impl<'a> DoubleEndedIterator for RawValues<'a> {
15371562
fn next_back(&mut self) -> Option<&'a OsStr> {
1538-
self.iter.next_back()
1563+
if let Some(next) = self.iter.next_back() {
1564+
self.len -= 1;
1565+
Some(next)
1566+
} else {
1567+
None
1568+
}
15391569
}
15401570
}
15411571

@@ -1570,7 +1600,12 @@ impl<'a> Iterator for GroupedValues<'a> {
15701600
type Item = Vec<&'a str>;
15711601

15721602
fn next(&mut self) -> Option<Self::Item> {
1573-
self.iter.next()
1603+
if let Some(next) = self.iter.next() {
1604+
self.len -= 1;
1605+
Some(next)
1606+
} else {
1607+
None
1608+
}
15741609
}
15751610
fn size_hint(&self) -> (usize, Option<usize>) {
15761611
(self.len, Some(self.len))
@@ -1580,7 +1615,12 @@ impl<'a> Iterator for GroupedValues<'a> {
15801615
#[allow(deprecated)]
15811616
impl<'a> DoubleEndedIterator for GroupedValues<'a> {
15821617
fn next_back(&mut self) -> Option<Self::Item> {
1583-
self.iter.next_back()
1618+
if let Some(next) = self.iter.next_back() {
1619+
self.len -= 1;
1620+
Some(next)
1621+
} else {
1622+
None
1623+
}
15841624
}
15851625
}
15861626

@@ -1830,7 +1870,12 @@ impl<'a> Iterator for Indices<'a> {
18301870
type Item = usize;
18311871

18321872
fn next(&mut self) -> Option<usize> {
1833-
self.iter.next()
1873+
if let Some(next) = self.iter.next() {
1874+
self.len -= 1;
1875+
Some(next)
1876+
} else {
1877+
None
1878+
}
18341879
}
18351880
fn size_hint(&self) -> (usize, Option<usize>) {
18361881
(self.len, Some(self.len))
@@ -1839,7 +1884,12 @@ impl<'a> Iterator for Indices<'a> {
18391884

18401885
impl<'a> DoubleEndedIterator for Indices<'a> {
18411886
fn next_back(&mut self) -> Option<usize> {
1842-
self.iter.next_back()
1887+
if let Some(next) = self.iter.next_back() {
1888+
self.len -= 1;
1889+
Some(next)
1890+
} else {
1891+
None
1892+
}
18431893
}
18441894
}
18451895

@@ -1948,4 +1998,37 @@ mod tests {
19481998
.len();
19491999
assert_eq!(l, 1);
19502000
}
2001+
2002+
#[test]
2003+
fn rev_iter() {
2004+
let mut matches = crate::Command::new("myprog")
2005+
.arg(crate::Arg::new("a").short('a').action(ArgAction::Append))
2006+
.arg(crate::Arg::new("b").short('b').action(ArgAction::Append))
2007+
.try_get_matches_from(vec!["myprog", "-a1", "-b1", "-b3"])
2008+
.unwrap();
2009+
2010+
let a_index = matches
2011+
.indices_of("a")
2012+
.expect("missing aopt indices")
2013+
.collect::<Vec<_>>();
2014+
dbg!(&a_index);
2015+
let a_value = matches
2016+
.remove_many::<String>("a")
2017+
.expect("missing aopt values");
2018+
dbg!(&a_value);
2019+
let a = a_index.into_iter().zip(a_value).rev().collect::<Vec<_>>();
2020+
dbg!(a);
2021+
2022+
let b_index = matches
2023+
.indices_of("b")
2024+
.expect("missing aopt indices")
2025+
.collect::<Vec<_>>();
2026+
dbg!(&b_index);
2027+
let b_value = matches
2028+
.remove_many::<String>("b")
2029+
.expect("missing aopt values");
2030+
dbg!(&b_value);
2031+
let b = b_index.into_iter().zip(b_value).rev().collect::<Vec<_>>();
2032+
dbg!(b);
2033+
}
19512034
}

0 commit comments

Comments
 (0)