Skip to main content

compiler_example/
compiler-example.rs

1use rusty_javac::{CompilerConfig, compile};
2
3fn main() {
4    let args: Vec<String> = std::env::args().skip(1).collect();
5    if args.is_empty() {
6        print_usage();
7        std::process::exit(2);
8    }
9
10    let mut output_dir = "target/compiler-example".to_string();
11    let mut classpath: Vec<String> = Vec::new();
12    let mut sources: Vec<String> = Vec::new();
13    let mut i = 0;
14    while i < args.len() {
15        match args[i].as_str() {
16            "--output-dir" | "-o" => {
17                i += 1;
18                if i >= args.len() {
19                    eprintln!("error: --output-dir requires a value");
20                    std::process::exit(2);
21                }
22                output_dir = args[i].clone();
23                i += 1;
24            }
25            "--class-path" | "--classpath" | "-classpath" | "-cp" => {
26                i += 1;
27                if i >= args.len() {
28                    eprintln!("error: {} requires a value", args[i - 1]);
29                    std::process::exit(2);
30                }
31                classpath.push(args[i].clone());
32                i += 1;
33            }
34            arg => {
35                sources.push(arg.to_string());
36                i += 1;
37            }
38        }
39    }
40
41    if sources.is_empty() {
42        print_usage();
43        std::process::exit(2);
44    }
45
46    let mut config = CompilerConfig::new();
47    config.output_dir = output_dir;
48    config.classpath = classpath;
49    config.source_files = sources;
50
51    if let Err(errors) = compile(config) {
52        for error in errors {
53            eprintln!("{error}");
54        }
55        std::process::exit(1);
56    }
57}
58
59fn print_usage() {
60    eprintln!(
61        "usage: compiler-example [--output-dir <dir>] [--class-path <path>] <source1.java> <source2.java> ..."
62    );
63}