use std::io::{self, Write};

use colored::Colorize;

use crate::moonblade::Program;
use crate::util;
use crate::CliResult;

static USAGE: &str = "
Debug command that can be used to evaluate a moonblade expression.

Usage:
    xan eval <expr>
    xan eval --help

Common options:
    -h, --help  Display this message
";

#[derive(Deserialize)]
struct Args {
    arg_expr: String,
}

pub fn run(argv: &[&str]) -> CliResult<()> {
    let args: Args = util::get_args(USAGE, argv)?;

    let dummy_record = csv::ByteRecord::new();

    let program = Program::parse(&args.arg_expr, &dummy_record)?;

    let value = program.run_with_record(0, &dummy_record)?;

    print!("{} ", "result".cyan());
    io::stdout().write_all(&value.serialize_as_bytes())?;
    println!();
    println!("{}   {}", "type".cyan(), value.type_of());

    Ok(())
}