pub struct MessageToParent<ParentType, ReturnType> {
side_effects: Vec<fn(&mut ParentType) -> ReturnType>,
results: Vec<ReturnType>,
executed: bool,
has_results: bool,
}
impl<ParentType, ReturnType> MessageToParent<ParentType, ReturnType> {
pub fn new() -> Self {
MessageToParent {
side_effects: vec![],
results: vec![],
executed: false,
has_results: false,
}
}
pub fn add_side_effect(&mut self, new_side_effect: fn(&mut ParentType) -> ReturnType) {
self.side_effects.push(new_side_effect);
}
pub fn run_side_effects_accumulate_results(&mut self, parent: &mut ParentType) {
self.has_results = true;
if self.executed {
panic!(
"MessageToParent: Attempted to execute side effects after side effects already executed!"
)
}
for side_effect in &self.side_effects {
self.results.push(side_effect(parent));
}
self.executed = true;
}
pub fn run_side_effects(&mut self, parent: &mut ParentType) {
if self.executed {
panic!(
"MessageToParent: Attempted to execute side effects after side effects already executed!"
)
}
for side_effect in &self.side_effects {
side_effect(parent);
}
self.executed = true
}
pub fn get_results(&self) -> &Vec<ReturnType> {
if !self.has_results {
panic!("MessageToParent: You forgot to execute run_side_effects_accumulate_results().");
}
&self.results
}
}