1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#[cfg(test)]
#[path = "./runtime_test.rs"]
mod runtime_test;
use crate::types::command::Commands;
use crate::types::instruction::Instruction;
use std::any::Any;
use std::cell::RefCell;
use std::collections::{HashMap, HashSet};
use std::rc::Rc;
#[derive(Debug, Clone)]
pub enum StateValue {
Boolean(bool),
Number(isize),
UnsignedNumber(usize),
Number32Bit(i32),
UnsignedNumber32Bit(u32),
Number64Bit(i64),
UnsignedNumber64Bit(u64),
String(String),
ByteArray(Vec<u8>),
List(Vec<StateValue>),
Set(HashSet<String>),
SubState(HashMap<String, StateValue>),
Any(Rc<RefCell<dyn Any>>),
}
pub struct Context {
pub variables: HashMap<String, String>,
pub state: HashMap<String, StateValue>,
pub commands: Commands,
}
impl Context {
pub fn new() -> Context {
Context {
variables: HashMap::new(),
state: HashMap::new(),
commands: Commands::new(),
}
}
}
pub struct Runtime {
pub instructions: Option<Vec<Instruction>>,
pub label_to_line: HashMap<String, usize>,
pub context: Context,
}
impl Runtime {
pub fn new(context: Context) -> Runtime {
Runtime {
instructions: None,
label_to_line: HashMap::new(),
context,
}
}
}