From 95b557b7f3b54a4685660d281bf5fc9b1fba2f70 Mon Sep 17 00:00:00 2001 From: Matthias Schiffer Date: Wed, 27 Oct 2021 00:20:50 +0200 Subject: runner: add Steal wrapper, use for socket A deref wrapper that allows taking out its contents, which is convenient after a fork. --- crates/runner/src/util/steal.rs | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 crates/runner/src/util/steal.rs (limited to 'crates/runner/src/util/steal.rs') 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(pub Option); + +impl Steal { + pub fn new(value: T) -> Steal { + Steal(Some(value)) + } + + pub fn steal(&mut self) -> T { + self.0 + .take() + .expect("Attempted to steal already stoken value") + } +} + +impl From for Steal { + fn from(value: T) -> Self { + Steal::new(value) + } +} + +impl Deref for Steal { + type Target = T; + + fn deref(&self) -> &Self::Target { + self.0 + .as_ref() + .expect("Attempted to dereference stolen value") + } +} + +impl DerefMut for Steal { + fn deref_mut(&mut self) -> &mut Self::Target { + self.0 + .as_mut() + .expect("Attempted to dereference stolen value") + } +} -- cgit v1.2.3