use serde::{Deserialize, Serialize};
use crate::{model::{Graph, SId}, runtime::{instruction::{Instruction, Instructions}, proc::ProcEnv, Error, Val, Variable}};
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct NewObjIns {
pub parent: bool,
pub root: bool,
}
#[typetag::serde(name = "NewObjIns")]
impl Instruction for NewObjIns {
fn exec(&self, env: &mut ProcEnv, graph: &mut Graph) -> Result<Option<Instructions>, Error> {
if !self.parent && self.root {
let name = SId::default();
let nref = graph.insert_root(name);
env.stack.push(Variable::val(Val::Obj(nref)));
return Ok(None);
}
let mut parent = Some(env.self_ptr());
if let Some(ns) = env.new_stack.last() {
parent = Some(ns.clone());
}
if self.parent {
if let Some(prnt) = env.stack.pop() {
if let Some(prnt) = prnt.try_obj() {
parent = Some(prnt);
}
}
}
let id = SId::default();
let name = id.clone();
let nref = graph.insert_node_id(name, id, parent, false);
env.stack.push(Variable::val(Val::Obj(nref)));
Ok(None)
}
}