mrubyedge_cli/subcommands/
run.rs

1use 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    /// Dump instruction sequences
10    #[arg(long)]
11    pub dump_insns: bool,
12
13    /// Ruby source file or mrb binary to run
14    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}