@@ -88,35 +88,34 @@ impl AsRef<PackageManifest> for PackageManifest {
88
88
}
89
89
90
90
impl PackageManifest {
91
- pub fn get_internal_dependencies < ' a , T > (
91
+ pub fn internal_dependencies_iter < ' a , T > (
92
92
& ' a self ,
93
- package_manifests_by_package_name : & HashMap < String , & ' a T > ,
94
- ) -> Vec < & ' a PackageManifest >
93
+ package_manifests_by_package_name : & ' a HashMap < String , & ' a T > ,
94
+ ) -> impl Iterator < Item = & ' a PackageManifest >
95
95
where
96
96
T : AsRef < PackageManifest > ,
97
97
{
98
- let get_dependency_group = |dependency_group : & str | -> Vec < & ' a String > {
99
- self . contents
100
- . extra_fields
101
- . get ( dependency_group)
102
- . and_then ( serde_json:: Value :: as_object)
103
- . map ( |object| object. keys ( ) . collect ( ) )
104
- . unwrap_or_default ( )
105
- } ;
106
-
107
- get_dependency_group ( "dependencies" )
98
+ static DEPENDENCY_GROUPS : & [ & str ] = & [
99
+ "dependencies" ,
100
+ "devDependencies" ,
101
+ "optionalDependencies" ,
102
+ "peerDependencies" ,
103
+ ] ;
104
+
105
+ DEPENDENCY_GROUPS
108
106
. iter ( )
109
- . chain ( get_dependency_group ( "devDependencies" ) . iter ( ) )
110
- . chain ( get_dependency_group ( "optionalDependencies" ) . iter ( ) )
111
- . chain ( get_dependency_group ( "peerDependencies" ) . iter ( ) )
107
+ // only iterate over the objects corresponding to each dependency group
108
+ . filter_map ( |dependency_group| {
109
+ self . contents . extra_fields . get ( dependency_group) ?. as_object ( )
110
+ } )
111
+ // get all dependency names from all groups
112
+ . flat_map ( |dependency_group_value| dependency_group_value. keys ( ) )
112
113
// filter out external packages
113
114
. filter_map ( |package_name| {
114
115
package_manifests_by_package_name
115
- . get ( * package_name)
116
- . cloned ( )
117
- . map ( |thing| thing. as_ref ( ) )
116
+ . get ( package_name)
117
+ . map ( |& thing| thing. as_ref ( ) )
118
118
} )
119
- . collect ( )
120
119
}
121
120
122
121
pub fn transitive_internal_dependency_package_names < ' a > (
@@ -135,8 +134,7 @@ impl PackageManifest {
135
134
seen_package_names. insert ( & current_manifest. contents . name ) ;
136
135
137
136
for dependency in current_manifest
138
- . get_internal_dependencies ( package_manifest_by_package_name)
139
- . iter ( )
137
+ . internal_dependencies_iter ( package_manifest_by_package_name)
140
138
{
141
139
internal_dependencies. insert ( dependency. contents . name . to_owned ( ) ) ;
142
140
if !seen_package_names. contains ( & dependency. contents . name . as_ref ( ) ) {
0 commit comments