val 0.3.6

An arbitrary precision calculator language
Documentation
use {
  clap::Parser,
  rustyline::error::ReadlineError,
  std::{backtrace::BacktraceStatus, process, thread},
  val::arguments::Arguments,
};

fn main() {
  let arguments = Arguments::parse();

  let stack_size = arguments.stack_size * 1024 * 1024;

  let result = thread::Builder::new()
    .stack_size(stack_size)
    .spawn(move || arguments.run())
    .unwrap()
    .join();

  if let Err(error) =
    result.unwrap_or_else(|_| Err(anyhow::anyhow!("Thread panicked")))
  {
    if let Some(error) = error.downcast_ref::<ReadlineError>() {
      if matches!(error, ReadlineError::Eof | ReadlineError::Interrupted) {
        return;
      }
    }

    eprintln!("error: {error}");

    for (i, error) in error.chain().skip(1).enumerate() {
      if i == 0 {
        eprintln!();
        eprintln!("because:");
      }

      eprintln!("- {error}");
    }

    let backtrace = error.backtrace();

    if backtrace.status() == BacktraceStatus::Captured {
      eprintln!("backtrace:");
      eprintln!("{backtrace}");
    }

    process::exit(1);
  }
}