Skip to main content

run_josie/
run_josie.rs

1//! Run a .josie file: read → read_program → parse_program → execute_program.
2//!
3//! Usage: cargo run -p josie-core --example run_josie -- examples/hello.josie
4
5use josie_core::program::{execute_program, parse_program};
6use josie_core::{read_program, Operators};
7use std::env;
8use std::fs;
9use std::process;
10
11fn main() {
12    let path = match env::args().nth(1) {
13        Some(p) => p,
14        None => {
15            eprintln!("Usage: run_josie <path.josie>");
16            eprintln!("  e.g. cargo run -p josie-core --example run_josie -- examples/hello.josie");
17            process::exit(1);
18        }
19    };
20    let src = fs::read_to_string(&path).unwrap_or_else(|e| {
21        eprintln!("read {}: {}", path, e);
22        process::exit(1);
23    });
24    let doc = read_program(&src).unwrap_or_else(|e| {
25        eprintln!("parse {}: {:?}", path, e);
26        process::exit(1);
27    });
28    let program = parse_program(&doc).unwrap_or_else(|e| {
29        eprintln!("validate {}: {} ({})", path, e.code, e.message);
30        process::exit(1);
31    });
32    let operators = Operators::new();
33    let out = execute_program(&program, &operators).unwrap_or_else(|e| {
34        eprintln!("run {}: {} - {}", path, e.code, e.message);
35        process::exit(1);
36    });
37    println!("value: {}", serde_json::to_string_pretty(&out.value).unwrap());
38    let state_json = serde_json::json!({
39        "client": out.state.client,
40        "server": out.state.server,
41    });
42    println!("state: {}", serde_json::to_string_pretty(&state_json).unwrap());
43}