getargs/
iter.rs

1use crate::{Argument, Options};
2
3/// An iterator over the positional arguments of an [`Options`].
4///
5/// For more information, see [`Options::positionals`].
6#[derive(Debug)]
7pub struct Positionals<'opts, A: Argument, I: Iterator<Item = A>> {
8    inner: &'opts mut Options<A, I>,
9}
10
11impl<'opts, A: Argument, I: Iterator<Item = A>> Positionals<'opts, A, I> {
12    pub(crate) fn new(inner: &'opts mut Options<A, I>) -> Self {
13        Self { inner }
14    }
15}
16
17impl<'opts, A: Argument, I: Iterator<Item = A>> Iterator for Positionals<'opts, A, I> {
18    type Item = A;
19
20    fn next(&mut self) -> Option<Self::Item> {
21        self.inner.next_positional()
22    }
23}
24
25/// An iterator over what used to be the positional arguments of an
26/// [`Options`][crate::Options].
27///
28/// For more information, see
29/// [`Options::into_positionals`][crate::Options::into_positionals].
30#[derive(Debug)]
31pub struct IntoPositionals<A: Argument, I: Iterator<Item = A>> {
32    positional: Option<A>,
33    iter: I,
34}
35
36impl<A: Argument, I: Iterator<Item = A>> IntoPositionals<A, I> {
37    pub(crate) fn new(positional: Option<A>, iter: I) -> Self {
38        Self { positional, iter }
39    }
40}
41
42impl<A: Argument, I: Iterator<Item = A>> Iterator for IntoPositionals<A, I> {
43    type Item = A;
44
45    fn next(&mut self) -> Option<Self::Item> {
46        self.positional.take().or_else(|| self.iter.next())
47    }
48}