oxygengine_script_flow/
resource.rs

1use crate::{
2    ast::Program,
3    vm::{Vm, VmError},
4};
5use std::collections::HashMap;
6
7#[derive(Default)]
8pub struct FlowScriptManager {
9    /// {name: (vm, paused)}
10    vms: HashMap<String, (Vm, bool)>,
11}
12
13impl FlowScriptManager {
14    pub fn create_vm(&mut self, name: &str, ast: Program) -> Result<(), VmError> {
15        let vm = Vm::new(ast)?;
16        self.vms.insert(name.to_owned(), (vm, false));
17        Ok(())
18    }
19
20    pub fn destroy_vm(&mut self, name: &str) -> bool {
21        self.vms.remove(name).is_some()
22    }
23
24    pub fn is_paused(&self, name: &str) -> Option<bool> {
25        Some(self.vms.get(name)?.1)
26    }
27
28    pub fn set_paused(&mut self, name: &str, paused: bool) -> Option<()> {
29        self.vms.get_mut(name)?.1 = paused;
30        Some(())
31    }
32
33    pub fn get(&self, name: &str) -> Option<&Vm> {
34        self.vms.get(name).map(|(vm, _)| vm)
35    }
36
37    pub fn get_mut(&mut self, name: &str) -> Option<&mut Vm> {
38        self.vms.get_mut(name).map(|(vm, _)| vm)
39    }
40
41    pub fn vms(&self) -> impl Iterator<Item = &Vm> {
42        self.vms.values().map(|(vm, _)| vm)
43    }
44
45    pub fn vms_mut(&mut self) -> impl Iterator<Item = &mut Vm> {
46        self.vms.values_mut().map(|(vm, _)| vm)
47    }
48
49    pub fn process_events(&mut self) -> Result<(), VmError> {
50        for (vm, paused) in self.vms.values_mut() {
51            if !*paused {
52                vm.process_events()?;
53            }
54        }
55        Ok(())
56    }
57}