specs_task/
manager.rs

1use crate::{
2    components::{FinalTag, OnCompletion},
3    user::TaskUser,
4};
5
6use log::debug;
7use specs::prelude::*;
8
9/// Traverses all descendents of all finalized entities and unblocks them if possible.
10///
11/// Also does some garbage collection:
12///   - deletes task graphs with `OnCompletion::Delete`
13///   - removes `FinalTag` components from completed entities
14pub struct TaskManagerSystem;
15
16impl<'a> System<'a> for TaskManagerSystem {
17    type SystemData = (TaskUser<'a>, WriteStorage<'a, FinalTag>);
18
19    fn run(&mut self, (task_user, mut finalized): Self::SystemData) {
20        let final_ents: Vec<(Entity, FinalTag)> = (&task_user.entities, &finalized)
21            .join()
22            .map(|(e, f)| (e, *f))
23            .collect();
24        for (entity, FinalTag { on_completion }) in final_ents.into_iter() {
25            let final_complete = task_user.maintain_entity_and_descendents(entity);
26            if final_complete {
27                match on_completion {
28                    OnCompletion::Delete => {
29                        task_user.delete_entity_and_descendents(entity);
30                    }
31                    OnCompletion::None => {
32                        debug!("Removing FinalTag from {:?}", entity);
33                        finalized.remove(entity);
34                    }
35                }
36            }
37        }
38    }
39}