summaryrefslogtreecommitdiffstats
path: root/crates/runner/src/util/steal.rs
diff options
context:
space:
mode:
authorMatthias Schiffer <mschiffer@universe-factory.net>2021-10-27 00:20:50 +0200
committerMatthias Schiffer <mschiffer@universe-factory.net>2021-10-27 00:44:28 +0200
commit95b557b7f3b54a4685660d281bf5fc9b1fba2f70 (patch)
treebb7703209a516f6ef2e563d30f980472826803ae /crates/runner/src/util/steal.rs
parentddb92b57fb92a43dcd3ac03ba987636bbc5d1843 (diff)
downloadrebel-95b557b7f3b54a4685660d281bf5fc9b1fba2f70.tar
rebel-95b557b7f3b54a4685660d281bf5fc9b1fba2f70.zip
runner: add Steal wrapper, use for socket
A deref wrapper that allows taking out its contents, which is convenient after a fork.
Diffstat (limited to 'crates/runner/src/util/steal.rs')
-rw-r--r--crates/runner/src/util/steal.rs40
1 files changed, 40 insertions, 0 deletions
diff --git a/crates/runner/src/util/steal.rs b/crates/runner/src/util/steal.rs
new file mode 100644
index 0000000..91b2cdf
--- /dev/null
+++ b/crates/runner/src/util/steal.rs
@@ -0,0 +1,40 @@
+use std::ops::{Deref, DerefMut};
+
+#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
+pub struct Steal<T>(pub Option<T>);
+
+impl<T> Steal<T> {
+ pub fn new(value: T) -> Steal<T> {
+ Steal(Some(value))
+ }
+
+ pub fn steal(&mut self) -> T {
+ self.0
+ .take()
+ .expect("Attempted to steal already stoken value")
+ }
+}
+
+impl<T> From<T> for Steal<T> {
+ fn from(value: T) -> Self {
+ Steal::new(value)
+ }
+}
+
+impl<T> Deref for Steal<T> {
+ type Target = T;
+
+ fn deref(&self) -> &Self::Target {
+ self.0
+ .as_ref()
+ .expect("Attempted to dereference stolen value")
+ }
+}
+
+impl<T> DerefMut for Steal<T> {
+ fn deref_mut(&mut self) -> &mut Self::Target {
+ self.0
+ .as_mut()
+ .expect("Attempted to dereference stolen value")
+ }
+}