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
use crate::Instructions;
use std::cell::RefCell;
use std::rc::Rc;

pub const BOOL_TRUE: Object = Object::Bool(true);
pub const BOOL_FALSE: Object = Object::Bool(false);
pub const NULL: Object = Object::Null;

#[derive(Debug, Clone, PartialEq)]
pub enum Object {
    String(String),
    Number(f64),
    Bool(bool),
    Null,
    Array(Rc<RefCell<Vec<Object>>>),
    Function(Instructions, usize, usize),
}

impl Object {
    pub fn to_bool(&self) -> bool {
        match self {
            Object::Bool(b) => *b,
            _ => todo!()
        }
    }

    pub fn to_usize(&self) -> usize {
        match self {
            Object::Number(n) => *n as usize,
            _ => todo!()
        }
    }

    pub fn some(self) -> Option<Self> {
        Some(self)
    }
}