ada-judge-cli 0.1.0

Cli for ada-judge
pub const DEFAULT_CHECKER: &str = r#"use std::env;
use std::fs;
use std::process::exit;

const OK: i32 = 0;
const WRONG_ANSWER: i32 = 1;
const _PRESENTATION_ERROR: i32 = 2;
const FAIL: i32 = 3;

fn die(code: i32, msg: &str) -> ! {
    eprintln!("{msg}");
    exit(code);
}

fn check(output: String, answer: String) {
    if output.trim_end() == answer.trim_end() {
        die(
            OK,
            &format!("OK: `{}` and `{}`", output.trim_end(), answer.trim_end()),
        )
    } else {
        die(
            WRONG_ANSWER,
            &format!(
                "Wrong answer: `{}` and `{}`",
                output.trim_end(),
                answer.trim_end()
            ),
        )
    }
}

fn main() {
    let args: Vec<String> = env::args().collect();

    if args.len() != 4 {
        die(FAIL, "Checker takes 4 arguments");
    }

    let _input_path = &args[1];
    let output_path = &args[2];
    let answer_path = &args[3];

    let output =
        fs::read_to_string(output_path).unwrap_or_else(|_| die(WRONG_ANSWER, "Cannot read output"));
    let answer =
        fs::read_to_string(answer_path).unwrap_or_else(|_| die(FAIL, "Cannot read answer"));

    check(output, answer);
}
"#;

pub const BASE_CONFIG: &str = r#"name = "<name>"
# owner_id = <owner id>
contest_id = <contest id>
problem_index = <problem index in contest>
time_limit_ms = 1000
memory_limit_mb = 64
checker_path = "checker"
tests_path = "tests"
"#;