@@ -3,6 +3,7 @@ use crate::expr::Expr;
33use crate :: ident:: Ident ;
44use crate :: punctuated:: { self , Punctuated } ;
55use crate :: restriction:: { FieldMutability , Visibility } ;
6+ use crate :: spanned:: Spanned ;
67use crate :: token;
78use 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+
109158impl IntoIterator for Fields {
110159 type Item = Field ;
111160 type IntoIter = punctuated:: IntoIter < Field > ;
0 commit comments