Skip to content

Commit 5e3c70d

Browse files
committed
Add Fields::iter_member
1 parent 94d74d5 commit 5e3c70d

File tree

1 file changed

+49
-0
lines changed

1 file changed

+49
-0
lines changed

src/data.rs

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use crate::expr::Expr;
33
use crate::ident::Ident;
44
use crate::punctuated::{self, Punctuated};
55
use crate::restriction::{FieldMutability, Visibility};
6+
use crate::spanned::Spanned;
67
use crate::token;
78
use crate::ty::Type;
89

@@ -106,6 +107,54 @@ impl Fields {
106107
}
107108
}
108109

110+
#[cfg(any(feature = "full", feature = "derive"))]
111+
mod iter_member {
112+
use super::*;
113+
use crate::Member;
114+
115+
impl Fields {
116+
/// Get an iterator over the fields of a struct or variant as [`Member`]s.
117+
/// This iterator can be used to iterate over a named or unnamed struct or
118+
/// variant's fields uniformly.
119+
///
120+
/// The return type can considered as impl [`Iterator<Item = Member>`].
121+
#[cfg_attr(docsrs, doc(cfg(any(feature = "full", feature = "derive"))))]
122+
pub fn iter_member(&self) -> IterMember {
123+
IterMember {
124+
iter: self.iter(),
125+
unnamed_counter: 0,
126+
}
127+
}
128+
}
129+
130+
/// An iterator over the fields of a struct or variant as [`Member`]s.
131+
#[cfg_attr(docsrs, doc(cfg(any(feature = "full", feature = "derive"))))]
132+
#[derive(Clone)]
133+
pub struct IterMember<'a> {
134+
iter: punctuated::Iter<'a, Field>,
135+
unnamed_counter: u32,
136+
}
137+
138+
impl<'a> Iterator for IterMember<'a> {
139+
type Item = Member;
140+
141+
fn next(&mut self) -> Option<Self::Item> {
142+
let field = self.iter.next()?;
143+
match &field.ident {
144+
Some(ident) => Some(Member::Named(ident.clone())),
145+
None => {
146+
let m = Member::Unnamed(crate::Index {
147+
index: self.unnamed_counter,
148+
span: field.ty.span(),
149+
});
150+
self.unnamed_counter += 1;
151+
Some(m)
152+
}
153+
}
154+
}
155+
}
156+
}
157+
109158
impl IntoIterator for Fields {
110159
type Item = Field;
111160
type IntoIter = punctuated::IntoIter<Field>;

0 commit comments

Comments
 (0)