@@ -88,58 +88,55 @@ 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 > (
123
122
& self ,
124
123
package_manifest_by_package_name : & HashMap < String , & ' a PackageManifest > ,
125
124
) -> Vec < & ' a PackageManifest > {
126
125
// Depth-first search all transitive internal dependencies of package
127
- let mut seen_package_names: HashSet < & str > = HashSet :: new ( ) ;
128
- let mut internal_dependencies: HashSet < String > = HashSet :: new ( ) ;
129
- let mut to_visit_package_manifests: VecDeque < & PackageManifest > = VecDeque :: new ( ) ;
126
+ let mut seen_package_names = HashSet :: new ( ) ;
127
+ let mut internal_dependencies = HashSet :: new ( ) ;
128
+ let mut to_visit_package_manifests = VecDeque :: new ( ) ;
130
129
131
130
to_visit_package_manifests. push_back ( self ) ;
132
131
133
- while !to_visit_package_manifests. is_empty ( ) {
134
- let current_manifest = to_visit_package_manifests. pop_front ( ) . unwrap ( ) ;
132
+ while let Some ( current_manifest) = to_visit_package_manifests. pop_front ( ) {
135
133
seen_package_names. insert ( & current_manifest. contents . name ) ;
136
134
137
135
for dependency in current_manifest
138
- . get_internal_dependencies ( package_manifest_by_package_name)
139
- . iter ( )
136
+ . internal_dependencies_iter ( package_manifest_by_package_name)
140
137
{
141
138
internal_dependencies. insert ( dependency. contents . name . to_owned ( ) ) ;
142
- if !seen_package_names. contains ( & dependency. contents . name . as_ref ( ) ) {
139
+ if !seen_package_names. contains ( & dependency. contents . name ) {
143
140
to_visit_package_manifests. push_back ( dependency) ;
144
141
}
145
142
}
@@ -156,10 +153,10 @@ impl PackageManifest {
156
153
. collect ( )
157
154
}
158
155
159
- pub fn get_dependency_group_mut < ' a > (
160
- & ' a mut self ,
156
+ pub fn get_dependency_group_mut (
157
+ & mut self ,
161
158
group : & DependencyGroup ,
162
- ) -> Option < & ' a mut serde_json:: Map < String , serde_json:: Value > > {
159
+ ) -> Option < & mut serde_json:: Map < String , serde_json:: Value > > {
163
160
let group_index = match group {
164
161
DependencyGroup :: Dependencies => "dependencies" ,
165
162
DependencyGroup :: DevDependencies => "devDependencies" ,
0 commit comments