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}