1 use self::ChainState::*;
4 #[cfg(feature = "std")]
7 #[cfg(feature = "std")]
8 pub(crate) use crate::Chain;
10 #[cfg(not(feature = "std"))]
11 pub(crate) struct Chain<'a> {
12 state: ChainState<'a>,
16 pub(crate) enum ChainState<'a> {
18 next: Option<&'a (dyn StdError + 'static)>,
20 #[cfg(feature = "std")]
22 rest: vec::IntoIter<&'a (dyn StdError + 'static)>,
28 pub fn new(head: &'a (dyn StdError + 'static)) -> Self {
30 state: ChainState::Linked { next: Some(head) },
35 impl<'a> Iterator for Chain<'a> {
36 type Item = &'a (dyn StdError + 'static);
38 fn next(&mut self) -> Option<Self::Item> {
39 match &mut self.state {
42 *next = error.source();
45 #[cfg(feature = "std")]
46 Buffered { rest } => rest.next(),
50 fn size_hint(&self) -> (usize, Option<usize>) {
56 #[cfg(feature = "std")]
57 impl DoubleEndedIterator for Chain<'_> {
58 fn next_back(&mut self) -> Option<Self::Item> {
59 match &mut self.state {
60 Linked { mut next } => {
61 let mut rest = Vec::new();
62 while let Some(cause) = next {
63 next = cause.source();
66 let mut rest = rest.into_iter();
67 let last = rest.next_back();
68 self.state = Buffered { rest };
71 Buffered { rest } => rest.next_back(),
76 impl ExactSizeIterator for Chain<'_> {
77 fn len(&self) -> usize {
79 Linked { mut next } => {
81 while let Some(cause) = next {
82 next = cause.source();
87 #[cfg(feature = "std")]
88 Buffered { rest } => rest.len(),
93 #[cfg(feature = "std")]
94 impl Default for Chain<'_> {
95 fn default() -> Self {
97 state: ChainState::Buffered {
98 rest: Vec::new().into_iter(),