efibootnext/
load_option_iter.rs

1//! The load option iterator.
2
3use crate::error::GetLoadOptionError;
4use crate::Adapter;
5use crate::LoadOption;
6use std::iter::Iterator;
7
8/// The load option iterator.
9pub struct LoadOptionIter<'a, I>
10where
11    I: Iterator<Item = u16>,
12{
13    /// The adapter reference.
14    adapter: &'a Adapter,
15    /// The numeric iterator to go over the boot options.
16    number_iter: I,
17}
18
19impl<'a, I> Iterator for LoadOptionIter<'a, I>
20where
21    I: Iterator<Item = u16>,
22{
23    type Item = Result<LoadOption, GetLoadOptionError>;
24
25    fn next(&mut self) -> Option<Self::Item> {
26        loop {
27            let number = match self.number_iter.next() {
28                None => return None,
29                Some(number) => number,
30            };
31            match self.adapter.get_load_option(number) {
32                Ok(Some(load_option)) => return Some(Ok(load_option)),
33                Ok(None) => continue, // skip to the next value
34                Err(err) => return Some(Err(err)),
35            };
36        }
37    }
38}
39
40impl<'a, I> LoadOptionIter<'a, I>
41where
42    I: Iterator<Item = u16>,
43{
44    /// Construct a new [`Self`] with the number iterator.
45    pub fn with_number_iter(adapter: &'a Adapter, number_iter: I) -> Self {
46        Self {
47            adapter,
48            number_iter,
49        }
50    }
51}