summaryrefslogtreecommitdiff
path: root/src/single.rs
diff options
context:
space:
mode:
authorOwen Jacobson <owen@grimoire.ca>2023-10-17 21:17:55 -0400
committerOwen Jacobson <owen@grimoire.ca>2023-10-17 22:32:21 -0400
commit288205e302d9f6afa06b8602184e983d2080a5b6 (patch)
treedfb307e8f3cb82d280e5a0392f11318194e09ef1 /src/single.rs
CLI tool for updating Route53 DNS for an ASG.
Diffstat (limited to 'src/single.rs')
-rw-r--r--src/single.rs24
1 files changed, 24 insertions, 0 deletions
diff --git a/src/single.rs b/src/single.rs
new file mode 100644
index 0000000..b3f0b18
--- /dev/null
+++ b/src/single.rs
@@ -0,0 +1,24 @@
+pub trait Single {
+ type Item;
+
+ fn single(self) -> Option<Self::Item>;
+}
+
+impl<T, I> Single for I
+where
+ I: IntoIterator<Item = T>,
+{
+ type Item = T;
+
+ fn single(self) -> Option<Self::Item> {
+ let mut iter = self.into_iter();
+
+ // There are three cases of interest:
+ //
+ // 1. `self` has zero items -> return None.
+ // 2. `self` has two or more items -> return None.
+ // 3. `self` has exactly one item -> return `iter.next()` unchanged, as
+ // it holds that item.
+ iter.next().filter(|_| iter.next().is_none())
+ }
+}