mini-c-parser 0.1.4

minimal C language lexer & parser & executer from scratch
use super::Instruction;

use crate::program::variable::VariableData;

#[derive(Debug)]
pub struct GetArrayElement {}
impl Instruction for GetArrayElement {
    fn execute(&self, program: &mut crate::program::program::Program) {
        let src = program.registers[1].borrow().1.clone();
        let index = program.registers[0].borrow().1.to_u64();

        if let VariableData::Array(arrs) = src {
            let element = arrs[index as usize].clone();
            program.registers[0] = element;
        } else {
            panic!("GetArrayElement: src is not an array");
        }
    }
}

#[derive(Debug)]
pub struct GetStructElement {
    pub name: String,
}
impl Instruction for GetStructElement {
    fn execute(&self, program: &mut crate::program::program::Program) {
        let src = program.registers[0].borrow().1.clone();

        if let VariableData::Struct(structs) = src {
            let element = structs
                .fields
                .get(&self.name)
                .expect(format!("GetStructElement: field {} not found", self.name).as_str())
                .clone();
            program.registers[0] = element;
        } else {
            panic!("GetStructElement: src is not a struct");
        }
    }
}