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