summaryrefslogtreecommitdiff
path: root/rust/schist_queries/src/utils/find_by_id_or.rs
diff options
context:
space:
mode:
Diffstat (limited to 'rust/schist_queries/src/utils/find_by_id_or.rs')
-rw-r--r--rust/schist_queries/src/utils/find_by_id_or.rs41
1 files changed, 41 insertions, 0 deletions
diff --git a/rust/schist_queries/src/utils/find_by_id_or.rs b/rust/schist_queries/src/utils/find_by_id_or.rs
new file mode 100644
index 0000000..8335e5c
--- /dev/null
+++ b/rust/schist_queries/src/utils/find_by_id_or.rs
@@ -0,0 +1,41 @@
+pub fn find_by_id_or<Id: PartialEq, Val: Copy>(
+ arr: &[(Id, Val)],
+ id: Id,
+ default: Val,
+) -> Val {
+ arr.iter()
+ .find(|(elem_id, _)| *elem_id == id)
+ .map_or(default, |row| row.1)
+}
+
+#[cfg(test)]
+mod test {
+ use super::find_by_id_or;
+
+ #[test]
+ fn when_no_elements_then_return_default() {
+ let arr = [];
+
+ let result = find_by_id_or(&arr, 1, 42);
+
+ assert_eq!(result, 42);
+ }
+
+ #[test]
+ fn when_id_not_in_elements_then_return_default() {
+ let arr = [(0, 100), (2, 200)];
+
+ let result = find_by_id_or(&arr, 1, 42);
+
+ assert_eq!(result, 42);
+ }
+
+ #[test]
+ fn when_id_in_elements_then_return_value() {
+ let arr = [(1, 67)];
+
+ let result = find_by_id_or(&arr, 1, 42);
+
+ assert_eq!(result, 67);
+ }
+}