use thiserror::Error;

use crate::{builtins, types};

pub(crate) extern "C" fn quit() {
    std::process::exit(0);
}

pub(crate) extern "C" fn pow(x: types::Value, y: types::Value) -> types::Value {
    match builtins::pow(x, y) {
        Some(res) => res,
        None => {
            eprintln!("BAD POW");
            std::process::exit(1);
        }
    }
}

#[derive(Debug, Error)]
#[repr(i64)]
pub(crate) enum CompiledExecutionError {
    #[error("An error occured! Clac exiting.")]
    Error,
}

pub(crate) extern "C" fn error(err: CompiledExecutionError) {
    eprintln!("{}", err);
    std::process::exit(1);
}

pub(crate) extern "C" fn print_value(val: types::Value) {
    println!("{}", val)
}
