kalker 2.2.1

A calculator that supports user-defined functions, variables and units, and can handle fairly ambiguous syntax.
use ansi_term::Colour::Red;
use kalk::{kalk_value::ScientificNotationFormat, parser};

pub(crate) const DEFAULT_PRECISION: u32 = 1024;

pub fn eval(
    parser: &mut parser::Context,
    input: &str,
    precision: u32,
    base: u8,
    format: ScientificNotationFormat,
    no_leading_equal: bool
) {
    match parser::eval(parser, input, precision) {
        Ok(Some(mut result)) => {
            if base != 10 && !result.set_radix(base) {
                print_err("Invalid base. Change it by typing eg. `base 10`.");

                return;
            }

            if precision == DEFAULT_PRECISION {
                let mut result_str = result.to_string_pretty_format(format);
                if no_leading_equal {
                    result_str = result_str
                        .trim_start_matches('=')
                        .trim_start_matches('≈')
                        .trim_start()
                        .to_string();
                }

                println!("{}", result_str);

                return;
            }

            println!("{}", result.to_string_big())
        }
        Ok(None) => print!(""),
        Err(err) => print_err(&err.to_string()),
    }
}

pub fn print_err(msg: &str) {
    Red.paint(msg).to_string();
    eprintln!("{}", msg);
}