@@ -3,7 +3,6 @@ use std::collections::hash_map::{Entry, HashMap};
3
3
use std:: collections:: { BTreeMap , BTreeSet , HashSet } ;
4
4
use std:: path:: { Path , PathBuf } ;
5
5
use std:: rc:: Rc ;
6
- use std:: slice;
7
6
8
7
use anyhow:: { bail, Context as _} ;
9
8
use glob:: glob;
@@ -136,13 +135,6 @@ pub struct WorkspaceRootConfig {
136
135
custom_metadata : Option < toml:: Value > ,
137
136
}
138
137
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
-
146
138
impl < ' cfg > Workspace < ' cfg > {
147
139
/// Creates a new workspace given the target manifest pointed to by
148
140
/// `manifest_path`.
@@ -466,19 +458,65 @@ impl<'cfg> Workspace<'cfg> {
466
458
}
467
459
468
460
/// 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
+ } )
474
489
}
475
490
476
491
/// 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
+ } )
482
520
}
483
521
484
522
/// Returns true if the package is a member of the workspace.
@@ -1529,26 +1567,6 @@ impl<'cfg> Packages<'cfg> {
1529
1567
}
1530
1568
}
1531
1569
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
-
1552
1570
impl MaybePackage {
1553
1571
fn workspace_config ( & self ) -> & WorkspaceConfig {
1554
1572
match * self {
0 commit comments