aboutsummaryrefslogtreecommitdiffstats
path: root/bytecode/src/main.rs
blob: 89e205a70bd3acce6c59d74b4ea101a02d2e07d4 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
mod bytecode;
mod data;
mod encoding;
mod heap;

use std::fs::File;

fn usage() {
    println!("Usage: bytecode <file>");
}

fn main() {
    let filepath = match std::env::args().nth(1) {
        Some(x) => x,
        None => {
            usage();
            std::process::exit(255);
        }
    };
    let prog = {
        let mut file = match File::open(filepath) {
            Ok(x) => x,
            Err(err) => {
                println!("Can't open file for reading: {}", err);
                std::process::exit(255);
            }
        };
        match encoding::decode(&mut file) {
            Ok(x) => x,
            Err(err) => {
                println!("Invalid bytecode: {}", err);
                std::process::exit(255);
            }
        }
    };
    let exit_code = match bytecode::eval(&prog) {
        Ok(x) => x,
        Err(err) => {
            println!("{}", err);
            std::process::exit(255);
        }
    };
    std::process::exit(i32::from(exit_code));
}