Let's start with the using_recover() function:
- Any errors that have occurred within the future will be transformed into <Self as Future>::Item. Any <Self as Future>::Error type can be passed through, since we never produce an actual error.
- The futures::executor::block_on(F: Future) function will run a future until completion within the invoking thread. Any tasks within futures' default executor will also run on the invoking thread, but completion on the tasks may never occur since F may finish before the tasks have been completed. If this is the case, then the spawned tasks are dropped. LocalPool is often recommended for mitigating this issue, but for our examples block_on() will be sufficient.
All of these error handling functions can be found within the futures::FutureExt trait.
Now, onto our map_error() function:
- The <Self as Future>::map_err<E, F>(F: FnOnce(Self::Error) -> E) function will map a future's (Self...