diff options
author | Matthias Schiffer <mschiffer@universe-factory.net> | 2021-10-27 00:20:50 +0200 |
---|---|---|
committer | Matthias Schiffer <mschiffer@universe-factory.net> | 2021-10-27 00:44:28 +0200 |
commit | 95b557b7f3b54a4685660d281bf5fc9b1fba2f70 (patch) | |
tree | bb7703209a516f6ef2e563d30f980472826803ae /crates/runner/src/util/steal.rs | |
parent | ddb92b57fb92a43dcd3ac03ba987636bbc5d1843 (diff) | |
download | rebel-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.rs | 40 |
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") + } +} |