ach_util/
error.rs

1use crate::MemoryState;
2use core::fmt;
3
4pub struct Error<T> {
5    pub state: MemoryState,
6    pub input: T,
7    pub retry: bool,
8}
9impl<T> Error<T> {
10    pub fn new(input: T) -> Self {
11        Self {
12            state: MemoryState::Unknown,
13            input,
14            retry: false,
15        }
16    }
17}
18impl<T> fmt::Debug for Error<T> {
19    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
20        fmt::Debug::fmt(&self.state, f)
21    }
22}
23
24pub fn retry<I, O, F>(mut f: F, mut input: I) -> Result<O, Error<I>>
25where
26    F: FnMut(I) -> Result<O, Error<I>>,
27{
28    loop {
29        match f(input) {
30            Ok(val) => return Ok(val),
31            Err(err) if err.retry => {
32                input = err.input;
33                spin_loop::spin();
34                continue;
35            }
36            Err(err) => return Err(err),
37        }
38    }
39}
40pub fn unwrap<I, O, F>(mut f: F, mut input: I) -> O
41where
42    F: FnMut(I) -> Result<O, Error<I>>,
43{
44    loop {
45        match f(input) {
46            Ok(val) => return val,
47            Err(err) => {
48                input = err.input;
49                spin_loop::spin();
50                continue;
51            }
52        }
53    }
54}