jsonpiler 0.11.0

a Json syntax programming language for Windows
Documentation
use crate::prelude::*;
built_in! {self, func, scope, gui;
  {"GUI", SPECIAL, Exact(1),
    init_gui => { self.gui_window(func, scope) },
    init_gui_a => { self.gui_window(func, scope) }
  }
}
impl Jsonpiler {
  fn gui_window(&mut self, func: &mut Pos<BuiltIn>, scope: &mut Scope) -> ErrOR<Json> {
    let name = func.arg()?.into_ident("render")?;
    let render_id = {
      let Some(u_d) = self.user_defined.get_mut(&name.val) else {
        return err!(name.pos, UndefinedFunc(name.val));
      };
      let render = u_d.val.clone();
      self.use_func(scope.id, render.dep.id);
      self.use_u_d(scope.id, render.dep.id, name.pos)?;
      if render.sig.params.len() != 5 {
        return err!(
          name.pos,
          ArityErr {
            name: "render".into(),
            expected: Exact(5),
            actual: len_u32(&render.sig.params)?
          }
        );
      }
      for (i, (_, param_type)) in render.sig.params.iter().enumerate() {
        if param_type != &IntT {
          let actual = name.pos.with(param_type.clone());
          return Err(type_err(fmt_args((i + 1) as u32, "render"), vec![IntT], actual));
        }
      }
      if render.sig.ret_type != IntT {
        let actual = name.pos.with(render.sig.ret_type.clone());
        return Err(type_err(fmt_ret_val("render"), vec![IntT], actual));
      }
      render.dep.id
    };
    if self.flags.a64 {
      scope.p_a(Bl(self.get_gui_a(scope.id, func.pos, &name.val, render_id)?))?;
    } else {
      scope.p_x(Call(self.get_gui_x(scope.id, func.pos, &name.val, render_id)?))?;
    }
    Ok(Null(Lit(())))
  }
}