@@ -3,7 +3,6 @@ use std::collections::hash_map::{Entry, HashMap};
33use std:: collections:: { BTreeMap , BTreeSet , HashSet } ;
44use std:: path:: { Path , PathBuf } ;
55use std:: rc:: Rc ;
6- use std:: slice;
76
87use anyhow:: { bail, Context as _} ;
98use glob:: glob;
@@ -136,13 +135,6 @@ pub struct WorkspaceRootConfig {
136135 custom_metadata : Option < toml:: Value > ,
137136}
138137
139- /// An iterator over the member packages of a workspace, returned by
140- /// `Workspace::members`
141- pub struct Members < ' a , ' cfg > {
142- ws : & ' a Workspace < ' cfg > ,
143- iter : slice:: Iter < ' a , PathBuf > ,
144- }
145-
146138impl < ' cfg > Workspace < ' cfg > {
147139 /// Creates a new workspace given the target manifest pointed to by
148140 /// `manifest_path`.
@@ -466,19 +458,65 @@ impl<'cfg> Workspace<'cfg> {
466458 }
467459
468460 /// Returns an iterator over all packages in this workspace
469- pub fn members < ' a > ( & ' a self ) -> Members < ' a , ' cfg > {
470- Members {
471- ws : self ,
472- iter : self . members . iter ( ) ,
473- }
461+ pub fn members ( & self ) -> impl Iterator < Item = & Package > {
462+ let packages = & self . packages ;
463+ self . members
464+ . iter ( )
465+ . filter_map ( move |path| match packages. get ( path) {
466+ & MaybePackage :: Package ( ref p) => Some ( p) ,
467+ _ => None ,
468+ } )
469+ }
470+
471+ /// Returns a mutable iterator over all packages in this workspace
472+ pub fn members_mut ( & mut self ) -> impl Iterator < Item = & mut Package > {
473+ let packages = & mut self . packages . packages ;
474+ let members: HashSet < _ > = self
475+ . members
476+ . iter ( )
477+ . map ( |path| path. parent ( ) . unwrap ( ) . to_owned ( ) )
478+ . collect ( ) ;
479+
480+ packages. iter_mut ( ) . filter_map ( move |( path, package) | {
481+ if members. contains ( path) {
482+ if let MaybePackage :: Package ( ref mut p) = package {
483+ return Some ( p) ;
484+ }
485+ }
486+
487+ None
488+ } )
474489 }
475490
476491 /// Returns an iterator over default packages in this workspace
477- pub fn default_members < ' a > ( & ' a self ) -> Members < ' a , ' cfg > {
478- Members {
479- ws : self ,
480- iter : self . default_members . iter ( ) ,
481- }
492+ pub fn default_members < ' a > ( & ' a self ) -> impl Iterator < Item = & Package > {
493+ let packages = & self . packages ;
494+ self . default_members
495+ . iter ( )
496+ . filter_map ( move |path| match packages. get ( path) {
497+ & MaybePackage :: Package ( ref p) => Some ( p) ,
498+ _ => None ,
499+ } )
500+ }
501+
502+ /// Returns an iterator over default packages in this workspace
503+ pub fn default_members_mut ( & mut self ) -> impl Iterator < Item = & mut Package > {
504+ let packages = & mut self . packages . packages ;
505+ let members: HashSet < _ > = self
506+ . default_members
507+ . iter ( )
508+ . map ( |path| path. parent ( ) . unwrap ( ) . to_owned ( ) )
509+ . collect ( ) ;
510+
511+ packages. iter_mut ( ) . filter_map ( move |( path, package) | {
512+ if members. contains ( path) {
513+ if let MaybePackage :: Package ( ref mut p) = package {
514+ return Some ( p) ;
515+ }
516+ }
517+
518+ None
519+ } )
482520 }
483521
484522 /// Returns true if the package is a member of the workspace.
@@ -1529,26 +1567,6 @@ impl<'cfg> Packages<'cfg> {
15291567 }
15301568}
15311569
1532- impl < ' a , ' cfg > Iterator for Members < ' a , ' cfg > {
1533- type Item = & ' a Package ;
1534-
1535- fn next ( & mut self ) -> Option < & ' a Package > {
1536- loop {
1537- let next = self . iter . next ( ) . map ( |path| self . ws . packages . get ( path) ) ;
1538- match next {
1539- Some ( & MaybePackage :: Package ( ref p) ) => return Some ( p) ,
1540- Some ( & MaybePackage :: Virtual ( _) ) => { }
1541- None => return None ,
1542- }
1543- }
1544- }
1545-
1546- fn size_hint ( & self ) -> ( usize , Option < usize > ) {
1547- let ( _, upper) = self . iter . size_hint ( ) ;
1548- ( 0 , upper)
1549- }
1550- }
1551-
15521570impl MaybePackage {
15531571 fn workspace_config ( & self ) -> & WorkspaceConfig {
15541572 match * self {
0 commit comments