oxygengine_script_flow/
resource.rs1use crate::{
2 ast::Program,
3 vm::{Vm, VmError},
4};
5use std::collections::HashMap;
6
7#[derive(Default)]
8pub struct FlowScriptManager {
9 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}