use core::{iter, marker::PhantomData, ops::ControlFlow};
use crate::{Error, Visitor, VisitorExt as _, sealed::SealedError};
#[expect(private_bounds)]
pub trait ErrorExt: SealedError + Error {
fn has_children(&self) -> bool {
struct VisitorImpl<D> {
has_children: bool,
details: PhantomData<D>,
}
impl<D> Visitor for VisitorImpl<D> {
type Details = D;
fn push(&mut self) -> ControlFlow<()> {
self.has_children = true;
ControlFlow::Break(())
}
}
let mut visitor = VisitorImpl {
has_children: false,
details: PhantomData::<Self::Details>,
};
let _: ControlFlow<(), ()> = visitor.visit_many(iter::once(self));
visitor.has_children
}
}
impl<T> ErrorExt for T where T: Error + ?Sized {}