#[cfg(test)]
#[path = "./runtime_test.rs"]
mod runtime_test;
use crate::types::command::Commands;
use crate::types::env::Env;
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>>),
}
#[derive(Clone)]
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,
pub env: Env,
}
impl Runtime {
pub fn new(context: Context, env: Option<Env>) -> Runtime {
Runtime {
instructions: None,
label_to_line: HashMap::new(),
context,
env: match env {
Some(value) => value,
None => Env::default(),
},
}
}
}