133d722a9Sopenharmony_ci// We can expose more detail on the error as the need arises, but start with an
233d722a9Sopenharmony_ci// opaque error type for now.
333d722a9Sopenharmony_ci
433d722a9Sopenharmony_ciuse std::error::Error as StdError;
533d722a9Sopenharmony_ciuse std::fmt::{self, Debug, Display};
633d722a9Sopenharmony_ciuse std::iter;
733d722a9Sopenharmony_ci
833d722a9Sopenharmony_ci#[allow(missing_docs)]
933d722a9Sopenharmony_cipub struct Error {
1033d722a9Sopenharmony_ci    pub(crate) err: crate::gen::Error,
1133d722a9Sopenharmony_ci}
1233d722a9Sopenharmony_ci
1333d722a9Sopenharmony_ciimpl Error {
1433d722a9Sopenharmony_ci    /// Returns the span of the error, if available.
1533d722a9Sopenharmony_ci    pub fn span(&self) -> Option<proc_macro2::Span> {
1633d722a9Sopenharmony_ci        match &self.err {
1733d722a9Sopenharmony_ci            crate::gen::Error::Syn(err) => Some(err.span()),
1833d722a9Sopenharmony_ci            _ => None,
1933d722a9Sopenharmony_ci        }
2033d722a9Sopenharmony_ci    }
2133d722a9Sopenharmony_ci}
2233d722a9Sopenharmony_ci
2333d722a9Sopenharmony_ciimpl From<crate::gen::Error> for Error {
2433d722a9Sopenharmony_ci    fn from(err: crate::gen::Error) -> Self {
2533d722a9Sopenharmony_ci        Error { err }
2633d722a9Sopenharmony_ci    }
2733d722a9Sopenharmony_ci}
2833d722a9Sopenharmony_ci
2933d722a9Sopenharmony_ciimpl Display for Error {
3033d722a9Sopenharmony_ci    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
3133d722a9Sopenharmony_ci        Display::fmt(&self.err, f)
3233d722a9Sopenharmony_ci    }
3333d722a9Sopenharmony_ci}
3433d722a9Sopenharmony_ci
3533d722a9Sopenharmony_ciimpl Debug for Error {
3633d722a9Sopenharmony_ci    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
3733d722a9Sopenharmony_ci        Debug::fmt(&self.err, f)
3833d722a9Sopenharmony_ci    }
3933d722a9Sopenharmony_ci}
4033d722a9Sopenharmony_ci
4133d722a9Sopenharmony_ciimpl StdError for Error {
4233d722a9Sopenharmony_ci    fn source(&self) -> Option<&(dyn StdError + 'static)> {
4333d722a9Sopenharmony_ci        self.err.source()
4433d722a9Sopenharmony_ci    }
4533d722a9Sopenharmony_ci}
4633d722a9Sopenharmony_ci
4733d722a9Sopenharmony_ciimpl IntoIterator for Error {
4833d722a9Sopenharmony_ci    type Item = Error;
4933d722a9Sopenharmony_ci    type IntoIter = IntoIter;
5033d722a9Sopenharmony_ci
5133d722a9Sopenharmony_ci    fn into_iter(self) -> Self::IntoIter {
5233d722a9Sopenharmony_ci        match self.err {
5333d722a9Sopenharmony_ci            crate::gen::Error::Syn(err) => IntoIter::Syn(err.into_iter()),
5433d722a9Sopenharmony_ci            _ => IntoIter::Other(iter::once(self)),
5533d722a9Sopenharmony_ci        }
5633d722a9Sopenharmony_ci    }
5733d722a9Sopenharmony_ci}
5833d722a9Sopenharmony_ci
5933d722a9Sopenharmony_cipub enum IntoIter {
6033d722a9Sopenharmony_ci    Syn(<syn::Error as IntoIterator>::IntoIter),
6133d722a9Sopenharmony_ci    Other(iter::Once<Error>),
6233d722a9Sopenharmony_ci}
6333d722a9Sopenharmony_ci
6433d722a9Sopenharmony_ciimpl Iterator for IntoIter {
6533d722a9Sopenharmony_ci    type Item = Error;
6633d722a9Sopenharmony_ci
6733d722a9Sopenharmony_ci    fn next(&mut self) -> Option<Self::Item> {
6833d722a9Sopenharmony_ci        match self {
6933d722a9Sopenharmony_ci            IntoIter::Syn(iter) => iter
7033d722a9Sopenharmony_ci                .next()
7133d722a9Sopenharmony_ci                .map(|syn_err| Error::from(crate::gen::Error::Syn(syn_err))),
7233d722a9Sopenharmony_ci            IntoIter::Other(iter) => iter.next(),
7333d722a9Sopenharmony_ci        }
7433d722a9Sopenharmony_ci    }
7533d722a9Sopenharmony_ci}
76