Go with sgrif's Fields::iter implementation but without pub(crate)
diff --git a/src/data.rs b/src/data.rs
index b6199a7..4f5b4cb 100644
--- a/src/data.rs
+++ b/src/data.rs
@@ -65,42 +65,24 @@
}
}
-/// The `Iterator` type returned by [`Fields::iter`].
-///
-/// [`Fields::iter`]: struct.Fields.html#method.iter
-///
-/// *This type is available if Syn is build with the `"derive"` or `"full"`
-/// feature.*
-pub struct FieldsIter<'a>(Option<punctuated::Iter<'a, Field, Token![,]>>);
-
-impl<'a> Iterator for FieldsIter<'a> {
- type Item = &'a Field;
- fn next(&mut self) -> Option<&'a Field> {
- match self.0 {
- Some(ref mut i) => i.next(),
- None => None,
- }
- }
-}
-
impl Fields {
/// Get an iterator over the [`Field`] items in this object. This iterator
/// can be used to iterate over a named or unnamed struct or variant's
/// fields uniformly.
///
/// [`Field`]: struct.Field.html
- pub fn iter(&self) -> FieldsIter {
+ pub fn iter(&self) -> punctuated::Iter<Field, Token![,]> {
match *self {
- Fields::Unit => FieldsIter(None),
- Fields::Named(ref f) => FieldsIter(Some(f.named.iter())),
- Fields::Unnamed(ref f) => FieldsIter(Some(f.unnamed.iter())),
+ Fields::Unit => punctuated::Iter::private_empty(),
+ Fields::Named(ref f) => f.named.iter(),
+ Fields::Unnamed(ref f) => f.unnamed.iter(),
}
}
}
impl<'a> IntoIterator for &'a Fields {
type Item = &'a Field;
- type IntoIter = FieldsIter<'a>;
+ type IntoIter = punctuated::Iter<'a, Field, Token![,]>;
fn into_iter(self) -> Self::IntoIter {
self.iter()
diff --git a/src/lib.rs b/src/lib.rs
index 380552c..77b0d23 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -287,8 +287,8 @@
#[cfg(any(feature = "full", feature = "derive"))]
mod data;
#[cfg(any(feature = "full", feature = "derive"))]
-pub use data::{Field, Fields, FieldsNamed, FieldsUnnamed, FieldsIter, Variant,
- VisCrate, VisPublic, VisRestricted, Visibility};
+pub use data::{Field, Fields, FieldsNamed, FieldsUnnamed, Variant, VisCrate, VisPublic,
+ VisRestricted, Visibility};
#[cfg(any(feature = "full", feature = "derive"))]
mod expr;
diff --git a/src/punctuated.rs b/src/punctuated.rs
index afc163c..a826de5 100644
--- a/src/punctuated.rs
+++ b/src/punctuated.rs
@@ -398,6 +398,17 @@
inner: slice::Iter<'a, (T, Option<P>)>,
}
+#[cfg(any(feature = "full", feature = "derive"))]
+impl<'a, T, P> Iter<'a, T, P> {
+ // Not public API.
+ #[doc(hidden)]
+ pub fn private_empty() -> Self {
+ Iter {
+ inner: [].iter(),
+ }
+ }
+}
+
impl<'a, T, P> Iterator for Iter<'a, T, P> {
type Item = &'a T;