From 47b3bd5015be7e19c3127e4d90e1d0fb6e6a1e88 Mon Sep 17 00:00:00 2001 From: Roman Moisieiev Date: Wed, 8 Oct 2025 11:39:28 +0100 Subject: [PATCH] Use separate .set and .set_mut methods --- src/channel.rs | 21 +++++++++++++++++++-- src/types.rs | 3 ++- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/channel.rs b/src/channel.rs index 06e1dfe..3f889e1 100644 --- a/src/channel.rs +++ b/src/channel.rs @@ -73,13 +73,23 @@ where Ok(()) } - /// Set a closure + /// Set a closure that implements [Fn] pub fn set(&self, closure: F) -> Result<(), Error> where F: Fn() -> T + Send + Sync + 'static, { self.state - .swap(Arc::new(ValueSource::Dynamic(Mutex::new(Box::new( + .swap(Arc::new(ValueSource::Dynamic(Box::new(closure)))); + Ok(()) + } + + /// Set a closure that implements [FnMut] + pub fn set_mut(&self, closure: F) -> Result<(), Error> + where + F: FnMut() -> T + Send + Sync + 'static, + { + self.state + .swap(Arc::new(ValueSource::DynamicMut(Mutex::new(Box::new( closure, ))))); Ok(()) @@ -122,6 +132,13 @@ where match &**state { ValueSource::Static(value) => Ok(Response::Value(value.clone())), ValueSource::Dynamic(closure) => { + let value = self.execute_closure_safely(&mut || closure()); + match value { + Ok(v) => Ok(Response::Value(v)), + Err(_) => Ok(Response::NoSource), // Closure execution failed + } + } + ValueSource::DynamicMut(closure) => { let mut closure = closure.lock().unwrap(); let value = self.execute_closure_safely(&mut *closure); match value { diff --git a/src/types.rs b/src/types.rs index d20e022..937ce51 100644 --- a/src/types.rs +++ b/src/types.rs @@ -18,7 +18,8 @@ pub enum Response { /// Represents the source of values: either static or dynamic pub(crate) enum ValueSource { Static(T), - Dynamic(Mutex T + Send + Sync + 'static>>), + DynamicMut(Mutex T + Send + Sync + 'static>>), + Dynamic(Box T + Send + Sync + 'static>), None, // Never set Cleared, // Was set but cleared (closed) }