Add clonable FutureStateChange
This commit is contained in:
parent
4bf0607a11
commit
1baf6a488e
1 changed files with 24 additions and 3 deletions
|
@ -7,6 +7,27 @@ use std::collections::HashMap;
|
||||||
|
|
||||||
use std::sync::{Arc, Mutex, RwLock};
|
use std::sync::{Arc, Mutex, RwLock};
|
||||||
|
|
||||||
|
pub trait FutureStateChange: Fn() -> Result<()> + Send + Sync {
|
||||||
|
fn clone_box<'a>(&self) -> Box<dyn 'a + FutureStateChange>
|
||||||
|
where
|
||||||
|
Self: 'a;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<F: Fn() -> Result<()> + Clone + Send + Sync> FutureStateChange for F {
|
||||||
|
fn clone_box<'a>(&self) -> Box<dyn 'a + FutureStateChange>
|
||||||
|
where
|
||||||
|
Self: 'a,
|
||||||
|
{
|
||||||
|
Box::new(self.clone())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> Clone for Box<dyn 'a + FutureStateChange> {
|
||||||
|
fn clone(&self) -> Self {
|
||||||
|
(**self).clone_box()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
struct State {
|
struct State {
|
||||||
name: String,
|
name: String,
|
||||||
|
|
||||||
|
@ -295,7 +316,7 @@ impl States {
|
||||||
pub fn future_state_change<'b>(
|
pub fn future_state_change<'b>(
|
||||||
&self,
|
&self,
|
||||||
id: impl Into<Option<&'b str>>,
|
id: impl Into<Option<&'b str>>,
|
||||||
) -> Result<impl Fn() -> Result<()> + Clone + Send + Sync> {
|
) -> Result<Box<dyn FutureStateChange>> {
|
||||||
let state = id.into().map(|id| self.get_state(id)).transpose()?;
|
let state = id.into().map(|id| self.get_state(id)).transpose()?;
|
||||||
let current_state = self.current_state.clone();
|
let current_state = self.current_state.clone();
|
||||||
let gui_handler = if self.control_top_gui {
|
let gui_handler = if self.control_top_gui {
|
||||||
|
@ -305,14 +326,14 @@ impl States {
|
||||||
};
|
};
|
||||||
let logging = self.log_state_change;
|
let logging = self.log_state_change;
|
||||||
|
|
||||||
Ok(move || {
|
Ok(Box::new(move || {
|
||||||
Self::_set_state(
|
Self::_set_state(
|
||||||
state.clone(),
|
state.clone(),
|
||||||
&mut *current_state.lock().unwrap(),
|
&mut *current_state.lock().unwrap(),
|
||||||
gui_handler.clone(),
|
gui_handler.clone(),
|
||||||
logging,
|
logging,
|
||||||
)
|
)
|
||||||
})
|
}))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue