mrubyedge_cli/subcommands/
run.rs1use clap::Args;
2use std::{fs::File, io::Read, path::PathBuf};
3
4use mruby_compiler2_sys as mrbc;
5use mrubyedge;
6
7#[derive(Args)]
8pub struct RunArgs {
9 #[arg(long)]
11 pub dump_insns: bool,
12
13 pub file: PathBuf,
15}
16
17pub fn execute(args: RunArgs) -> Result<(), Box<dyn std::error::Error>> {
18 let mut buf = Vec::new();
19 File::open(&args.file)?.read_to_end(&mut buf)?;
20 let is_mrb_direct = &buf[0..4] == &['R' as u8, 'I' as u8, 'T' as u8, 'E' as u8][..];
21 unsafe {
22 let mrb_bin = if is_mrb_direct {
23 buf.to_vec()
24 } else {
25 let buf = String::from_utf8(buf)?;
26 let mut ctx = mrbc::MRubyCompiler2Context::new();
27 if args.dump_insns {
28 ctx.dump_bytecode(&buf)?;
29 }
30 ctx.compile(&buf)?
31 };
32 let mut rite = mrubyedge::rite::load(&mrb_bin)?;
33 let mut vm = mrubyedge::yamrb::vm::VM::open(&mut rite);
34 vm.run()?;
35 }
36
37 Ok(())
38}