Skip to content

Commit 05660fa

Browse files
chore: Use references when sorting environment variables
1 parent 9a3111d commit 05660fa

1 file changed

Lines changed: 55 additions & 42 deletions

File tree

crates/stackable-operator/src/v2/builder/pod/container.rs

Lines changed: 55 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)