@@ -588,35 +588,47 @@ impl<'cfg> Workspace<'cfg> {
588588            return  Ok ( ( ) ) ; 
589589        } 
590590
591-         let   mut  roots =  Vec :: new ( ) ; 
592-         { 
593-              let   mut  names =  BTreeMap :: new ( ) ; 
594-              for  member  in   self . members . iter ( )   { 
595-                  let  package =  self . packages . get ( member ) ; 
596-                  match   * package . workspace_config ( )   { 
597-                      WorkspaceConfig :: Root ( _ )  =>  { 
598-                         roots . push ( member . parent ( ) . unwrap ( ) . to_path_buf ( ) ) ; 
599-                      } 
600-                      WorkspaceConfig :: Member   {  ..  }  =>  { } 
601-                  } 
602-                  let  name = match  * package { 
603-                      MaybePackage :: Package ( ref  p)  => p. name ( ) , 
604-                      MaybePackage :: Virtual ( _)  => continue , 
605-                  } ; 
606-                  if  let  Some ( prev)  = names. insert ( name,  member)  { 
607-                      anyhow:: bail!( 
608-                          "two packages named `{}` in this workspace:\n \  
591+         self . validate_unique_names ( ) ? ; 
592+         self . validate_workspace_roots ( ) ? ; 
593+         self . validate_members ( ) ? ; 
594+         self . error_if_manifest_not_in_members ( ) ? ; 
595+         self . validate_manifest ( ) 
596+     } 
597+ 
598+     fn   validate_unique_names ( & self )  ->  CargoResult < ( ) >   { 
599+         let   mut  names =  BTreeMap :: new ( ) ; 
600+         for  member  in   self . members . iter ( )   { 
601+             let  package =  self . packages . get ( member ) ; 
602+             let  name = match  * package { 
603+                 MaybePackage :: Package ( ref  p)  => p. name ( ) , 
604+                 MaybePackage :: Virtual ( _)  => continue , 
605+             } ; 
606+             if  let  Some ( prev)  = names. insert ( name,  member)  { 
607+                 anyhow:: bail!( 
608+                     "two packages named `{}` in this workspace:\n \  
609609\n \ 
610610, 
611-                         name, 
612-                         prev. display( ) , 
613-                         member. display( ) 
614-                     ) ; 
615-                 } 
611+                     name, 
612+                     prev. display( ) , 
613+                     member. display( ) 
614+                 ) ; 
616615            } 
617616        } 
617+         Ok ( ( ) ) 
618+     } 
618619
620+     fn  validate_workspace_roots ( & self )  -> CargoResult < ( ) >  { 
621+         let  roots:  Vec < PathBuf >  = self 
622+             . members 
623+             . iter ( ) 
624+             . filter ( |& member| { 
625+                 let  config = self . packages . get ( member) . workspace_config ( ) ; 
626+                 matches ! ( config,  WorkspaceConfig :: Root ( _) ) 
627+             } ) 
628+             . map ( |member| member. parent ( ) . unwrap ( ) . to_path_buf ( ) ) 
629+             . collect ( ) ; 
619630        match  roots. len ( )  { 
631+             1  => Ok ( ( ) ) , 
620632            0  => anyhow:: bail!( 
621633                "`package.workspace` configuration points to a crate \  
622634\n \ 
@@ -625,7 +637,6 @@ impl<'cfg> Workspace<'cfg> {
625637                self . current_manifest. display( ) , 
626638                self . root_manifest. as_ref( ) . unwrap( ) . display( ) 
627639            ) , 
628-             1  => { } 
629640            _ => { 
630641                anyhow:: bail!( 
631642                    "multiple workspace roots found in the same workspace:\n {}" , 
@@ -637,7 +648,9 @@ impl<'cfg> Workspace<'cfg> {
637648                ) ; 
638649            } 
639650        } 
651+     } 
640652
653+     fn  validate_members ( & mut  self )  -> CargoResult < ( ) >  { 
641654        for  member in  self . members . clone ( )  { 
642655            let  root = self . find_root ( & member) ?; 
643656            if  root == self . root_manifest  { 
@@ -665,62 +678,68 @@ impl<'cfg> Workspace<'cfg> {
665678                } 
666679            } 
667680        } 
681+         Ok ( ( ) ) 
682+     } 
683+ 
684+     fn  error_if_manifest_not_in_members ( & mut  self )  -> CargoResult < ( ) >  { 
685+         if  self . members . contains ( & self . current_manifest )  { 
686+             return  Ok ( ( ) ) ; 
687+         } 
668688
669-         if  !self . members . contains ( & self . current_manifest )  { 
670-             let  root = self . root_manifest . as_ref ( ) . unwrap ( ) ; 
671-             let  root_dir = root. parent ( ) . unwrap ( ) ; 
672-             let  current_dir = self . current_manifest . parent ( ) . unwrap ( ) ; 
673-             let  root_pkg = self . packages . get ( root) ; 
674- 
675-             // FIXME: Make this more generic by using a relative path resolver between member and 
676-             // root. 
677-             let  members_msg = match  current_dir. strip_prefix ( root_dir)  { 
678-                 Ok ( rel)  => format ! ( 
679-                     "this may be fixable by adding `{}` to the \  
689+         let  root = self . root_manifest . as_ref ( ) . unwrap ( ) ; 
690+         let  root_dir = root. parent ( ) . unwrap ( ) ; 
691+         let  current_dir = self . current_manifest . parent ( ) . unwrap ( ) ; 
692+         let  root_pkg = self . packages . get ( root) ; 
693+ 
694+         // FIXME: Make this more generic by using a relative path resolver between member and root. 
695+         let  members_msg = match  current_dir. strip_prefix ( root_dir)  { 
696+             Ok ( rel)  => format ! ( 
697+                 "this may be fixable by adding `{}` to the \  
680698\ 
681699, 
682-                      rel. display( ) , 
683-                      root. display( ) 
684-                  ) , 
685-                  Err ( _)  => format ! ( 
686-                      "this may be fixable by adding a member to \  
700+                 rel. display( ) , 
701+                 root. display( ) 
702+             ) , 
703+             Err ( _)  => format ! ( 
704+                 "this may be fixable by adding a member to \  
687705\ 
688706, 
689-                      root. display( ) 
690-                  ) , 
691-              } ; 
692-              let  extra = match  * root_pkg { 
693-                  MaybePackage :: Virtual ( _)  => members_msg, 
694-                  MaybePackage :: Package ( ref  p)  => { 
695-                      let  has_members_list = match  * p. manifest ( ) . workspace_config ( )  { 
696-                          WorkspaceConfig :: Root ( ref  root_config)  => root_config. has_members_list ( ) , 
697-                          WorkspaceConfig :: Member  {  .. }  => unreachable ! ( ) , 
698-                      } ; 
699-                      if  !has_members_list { 
700-                          format ! ( 
701-                              "this may be fixable by ensuring that this \  
707+                 root. display( ) 
708+             ) , 
709+         } ; 
710+         let  extra = match  * root_pkg { 
711+             MaybePackage :: Virtual ( _)  => members_msg, 
712+             MaybePackage :: Package ( ref  p)  => { 
713+                 let  has_members_list = match  * p. manifest ( ) . workspace_config ( )  { 
714+                     WorkspaceConfig :: Root ( ref  root_config)  => root_config. has_members_list ( ) , 
715+                     WorkspaceConfig :: Member  {  .. }  => unreachable ! ( ) , 
716+                 } ; 
717+                 if  !has_members_list { 
718+                     format ! ( 
719+                         "this may be fixable by ensuring that this \  
702720\ 
703721, 
704-                             root. display( ) 
705-                         ) 
706-                     }  else  { 
707-                         members_msg
708-                     } 
722+                         root. display( ) 
723+                     ) 
724+                 }  else  { 
725+                     members_msg
709726                } 
710-             } ; 
711-             anyhow:: bail!( 
712-                 "current package believes it's in a workspace when it's not:\n \  
727+             } 
728+         } ; 
729+         anyhow:: bail!( 
730+             "current package believes it's in a workspace when it's not:\n \  
713731\n \ 
714732\n \n {}\n \ 
715733\ 
716734\ 
717735, 
718-                  self . current_manifest. display( ) , 
719-                  root. display( ) , 
720-                  extra
721-              ) ; 
722-          } 
736+             self . current_manifest. display( ) , 
737+             root. display( ) , 
738+             extra
739+         ) ; 
740+     } 
723741
742+     fn  validate_manifest ( & mut  self )  -> CargoResult < ( ) >  { 
724743        if  let  Some ( ref  root_manifest)  = self . root_manifest  { 
725744            for  pkg in  self 
726745                . members ( ) 
@@ -751,7 +770,6 @@ impl<'cfg> Workspace<'cfg> {
751770                } 
752771            } 
753772        } 
754- 
755773        Ok ( ( ) ) 
756774    } 
757775
0 commit comments