@@ -74,6 +74,14 @@ impl EnvVarSet {
7474 self . 0 . get ( env_var_name)
7575 }
7676
77+ /// Returns an iterator over the [`EnvVar`]s in this set
78+ ///
79+ /// The [`EnvVar`]s are sorted so that variables referencing other variables come after the
80+ /// referenced ones.
81+ pub fn iter ( & self ) -> vec:: IntoIter < & EnvVar > {
82+ self . into_iter ( )
83+ }
84+
7785 /// Moves all [`EnvVar`]s from the given set into this one.
7886 ///
7987 /// [`EnvVar`]s with the same name are overridden.
@@ -177,14 +185,24 @@ impl EnvVarSet {
177185 }
178186}
179187
180- impl From < EnvVarSet > for Vec < EnvVar > {
181- fn from ( value : EnvVarSet ) -> Self {
188+ impl < ' a > From < & ' a EnvVarSet > for Vec < & ' a EnvVar > {
189+ fn from ( value : & ' a EnvVarSet ) -> Self {
190+ value. into_iter ( ) . collect ( )
191+ }
192+ }
193+
194+ impl < ' a > IntoIterator for & ' a EnvVarSet {
195+ type IntoIter = vec:: IntoIter < Self :: Item > ;
196+ type Item = & ' a EnvVar ;
197+
198+ fn into_iter ( self ) -> Self :: IntoIter {
182199 let dependency_resolver =
183- EnvVarDependencyResolver :: new ( & value , ENV_VAR_DEPENDENCY_RESOLVER_MAX_RECURSION_DEPTH ) ;
200+ EnvVarDependencyResolver :: new ( self , ENV_VAR_DEPENDENCY_RESOLVER_MAX_RECURSION_DEPTH ) ;
184201
185- let mut vec: Self = value. 0 . values ( ) . cloned ( ) . collect ( ) ;
186- vec. sort_by_cached_key ( |env_var| dependency_resolver. sort_key ( env_var) ) ;
187- vec
202+ let mut env_vars: Vec < & EnvVar > = self . 0 . values ( ) . collect ( ) ;
203+ env_vars. sort_by_cached_key ( |env_var| dependency_resolver. sort_key ( env_var) ) ;
204+
205+ env_vars. into_iter ( )
188206 }
189207}
190208
@@ -193,7 +211,11 @@ impl IntoIterator for EnvVarSet {
193211 type Item = EnvVar ;
194212
195213 fn into_iter ( self ) -> Self :: IntoIter {
196- Vec :: from ( self ) . into_iter ( )
214+ Vec :: from ( & self )
215+ . into_iter ( )
216+ . cloned ( )
217+ . collect :: < Vec < _ > > ( )
218+ . into_iter ( )
197219 }
198220}
199221
@@ -282,30 +304,21 @@ impl<'a> EnvVarDependencyResolver<'a> {
282304 /// .unwrap();
283305 ///
284306 /// let resolver = EnvVarDependencyResolver::new(&env_vars, 2);
285- /// assert_eq!(
286- /// vec!["ENV4".to_owned(), "ENV2".to_owned(), "ENV1".to_owned()],
287- /// resolver.sort_key(&env_var1)
288- /// );
289- /// assert_eq!(
290- /// vec!["ENV4".to_owned(), "ENV2".to_owned()],
291- /// resolver.sort_key(&env_var2)
292- /// );
293- /// assert_eq!(
294- /// vec!["ENV4".to_owned(), "ENV3".to_owned()],
295- /// resolver.sort_key(&env_var3)
296- /// );
297- /// assert_eq!(vec!["ENV4".to_owned()], resolver.sort_key(&env_var4));
298- /// assert_eq!(vec!["ENV5".to_owned()], resolver.sort_key(&env_var5));
307+ /// assert_eq!(vec!["ENV4", "ENV2", "ENV1"], resolver.sort_key(&env_var1));
308+ /// assert_eq!(vec!["ENV4", "ENV2"], resolver.sort_key(&env_var2));
309+ /// assert_eq!(vec!["ENV4", "ENV3"], resolver.sort_key(&env_var3));
310+ /// assert_eq!(vec!["ENV4"], resolver.sort_key(&env_var4));
311+ /// assert_eq!(vec!["ENV5"], resolver.sort_key(&env_var5));
299312 /// ```
300- pub fn sort_key ( & self , env_var : & EnvVar ) -> Vec < String > {
313+ pub fn sort_key ( & self , env_var : & ' a EnvVar ) -> Vec < & ' a String > {
301314 if let Some ( mut closure) = self . calculate_closure ( env_var) {
302315 // Add the name of the variable to its closure so that every variable gets a unique
303316 // sort key.
304- closure. insert ( env_var. name . clone ( ) ) ;
317+ closure. insert ( & env_var. name ) ;
305318
306319 closure. into_iter ( ) . rev ( ) . collect ( )
307320 } else {
308- vec ! [ env_var. name. clone ( ) ]
321+ vec ! [ & env_var. name]
309322 }
310323 }
311324
@@ -397,15 +410,15 @@ impl<'a> EnvVarDependencyResolver<'a> {
397410 ///
398411 /// let resolver = EnvVarDependencyResolver::new(&env_vars, 2);
399412 /// assert_eq!(
400- /// Some(BTreeSet::from(["ENV2".to_owned(), "ENV4".to_owned() ])),
413+ /// Some(BTreeSet::from([&env_var2.name, &env_var4.name ])),
401414 /// resolver.calculate_closure(&env_var1)
402415 /// );
403416 /// assert_eq!(
404- /// Some(BTreeSet::from(["ENV4".to_owned() ])),
417+ /// Some(BTreeSet::from([&env_var4.name ])),
405418 /// resolver.calculate_closure(&env_var2)
406419 /// );
407420 /// assert_eq!(
408- /// Some(BTreeSet::from(["ENV4".to_owned() ])),
421+ /// Some(BTreeSet::from([&env_var4.name ])),
409422 /// resolver.calculate_closure(&env_var3)
410423 /// );
411424 /// assert_eq!(Some(BTreeSet::new()), resolver.calculate_closure(&env_var4));
@@ -414,15 +427,15 @@ impl<'a> EnvVarDependencyResolver<'a> {
414427 /// assert_eq!(None, resolver.calculate_closure(&env_var7));
415428 /// assert_eq!(None, resolver.calculate_closure(&env_var8));
416429 /// ```
417- pub fn calculate_closure ( & self , env_var : & EnvVar ) -> Option < BTreeSet < String > > {
430+ pub fn calculate_closure ( & self , env_var : & EnvVar ) -> Option < BTreeSet < & ' a String > > {
418431 self . calculate_closure_rec ( env_var, self . max_recursion_depth )
419432 }
420433
421434 fn calculate_closure_rec (
422435 & self ,
423436 env_var : & EnvVar ,
424437 remaining_recursion_depth : usize ,
425- ) -> Option < BTreeSet < String > > {
438+ ) -> Option < BTreeSet < & ' a String > > {
426439 if env_var. value . is_none ( ) {
427440 Some ( BTreeSet :: new ( ) )
428441 } else if let Some ( value) = & env_var. value
@@ -431,7 +444,7 @@ impl<'a> EnvVarDependencyResolver<'a> {
431444 let mut closure = BTreeSet :: new ( ) ;
432445
433446 for referenced_env_var in self . referenced_env_vars ( value) {
434- closure. insert ( referenced_env_var. name . clone ( ) ) ;
447+ closure. insert ( & referenced_env_var. name ) ;
435448 closure. extend (
436449 self . calculate_closure_rec ( referenced_env_var, remaining_recursion_depth - 1 ) ?,
437450 ) ;
@@ -597,17 +610,17 @@ mod tests {
597610
598611 assert_eq ! (
599612 vec![
600- EnvVar {
613+ & EnvVar {
601614 name: "ENV1" . to_owned( ) ,
602615 value: Some ( "value1 from env_var_set1" . to_owned( ) ) ,
603616 value_from: None
604617 } ,
605- EnvVar {
618+ & EnvVar {
606619 name: "ENV2" . to_owned( ) ,
607620 value: Some ( "value2 from env_var_set2" . to_owned( ) ) ,
608621 value_from: None
609622 } ,
610- EnvVar {
623+ & EnvVar {
611624 name: "ENV3" . to_owned( ) ,
612625 value: None ,
613626 value_from: Some ( EnvVarSource {
@@ -618,13 +631,13 @@ mod tests {
618631 ..EnvVarSource :: default ( )
619632 } ) ,
620633 } ,
621- EnvVar {
634+ & EnvVar {
622635 name: "ENV4" . to_owned( ) ,
623636 value: Some ( "value4 from env_var_set2" . to_owned( ) ) ,
624637 value_from: None
625638 }
626639 ] ,
627- Vec :: from( merged_env_var_set)
640+ Vec :: from( & merged_env_var_set)
628641 ) ;
629642 }
630643
@@ -637,18 +650,18 @@ mod tests {
637650
638651 assert_eq ! (
639652 vec![
640- EnvVar {
653+ & EnvVar {
641654 name: "ENV1" . to_owned( ) ,
642655 value: Some ( "value1" . to_owned( ) ) ,
643656 value_from: None
644657 } ,
645- EnvVar {
658+ & EnvVar {
646659 name: "ENV2" . to_owned( ) ,
647660 value: Some ( "value2" . to_owned( ) ) ,
648661 value_from: None
649662 }
650663 ] ,
651- Vec :: from( env_var_set)
664+ Vec :: from( & env_var_set)
652665 ) ;
653666 }
654667
@@ -721,23 +734,23 @@ mod tests {
721734
722735 assert_eq ! (
723736 vec![
724- EnvVar {
737+ & EnvVar {
725738 name: "ENV2" . to_owned( ) ,
726739 value: Some ( "value 2" . to_owned( ) ) ,
727740 value_from: None
728741 } ,
729- EnvVar {
742+ & EnvVar {
730743 name: "ENV1" . to_owned( ) ,
731744 value: Some ( "$(ENV2)" . to_owned( ) ) ,
732745 value_from: None
733746 } ,
734- EnvVar {
747+ & EnvVar {
735748 name: "ENV3" . to_owned( ) ,
736749 value: Some ( "value 3" . to_owned( ) ) ,
737750 value_from: None
738751 } ,
739752 ] ,
740- Vec :: from( env_var_set)
753+ Vec :: from( & env_var_set)
741754 ) ;
742755 }
743756
0 commit comments