aboutsummaryrefslogtreecommitdiff
path: root/gen/lib/src/error.rs
diff options
context:
space:
mode:
Diffstat (limited to 'gen/lib/src/error.rs')
-rw-r--r--gen/lib/src/error.rs41
1 files changed, 41 insertions, 0 deletions
diff --git a/gen/lib/src/error.rs b/gen/lib/src/error.rs
index bb53a7fc..79a27bd9 100644
--- a/gen/lib/src/error.rs
+++ b/gen/lib/src/error.rs
@@ -3,12 +3,23 @@
use std::error::Error as StdError;
use std::fmt::{self, Debug, Display};
+use std::iter;
#[allow(missing_docs)]
pub struct Error {
pub(crate) err: crate::gen::Error,
}
+impl Error {
+ /// Returns the span of the error, if available.
+ pub fn span(&self) -> Option<proc_macro2::Span> {
+ match &self.err {
+ crate::gen::Error::Syn(err) => Some(err.span()),
+ _ => None,
+ }
+ }
+}
+
impl From<crate::gen::Error> for Error {
fn from(err: crate::gen::Error) -> Self {
Error { err }
@@ -32,3 +43,33 @@ impl StdError for Error {
self.err.source()
}
}
+
+impl IntoIterator for Error {
+ type Item = Error;
+ type IntoIter = IntoIter;
+
+ fn into_iter(self) -> Self::IntoIter {
+ match self.err {
+ crate::gen::Error::Syn(err) => IntoIter::Syn(err.into_iter()),
+ _ => IntoIter::Other(iter::once(self)),
+ }
+ }
+}
+
+pub enum IntoIter {
+ Syn(<syn::Error as IntoIterator>::IntoIter),
+ Other(iter::Once<Error>),
+}
+
+impl Iterator for IntoIter {
+ type Item = Error;
+
+ fn next(&mut self) -> Option<Self::Item> {
+ match self {
+ IntoIter::Syn(iter) => iter
+ .next()
+ .map(|syn_err| Error::from(crate::gen::Error::Syn(syn_err))),
+ IntoIter::Other(iter) => iter.next(),
+ }
+ }
+}