jlrs 0.23.0

jlrs provides bindings to the Julia C API that enable Julia code to be called from Rust and more.
Documentation
mod util;
#[cfg(feature = "local-rt")]
mod tests {
    use jlrs::{error::JuliaResult, prelude::*};

    use super::util::JULIA;

    fn eval_string(string: &str, with_result: impl for<'f> FnOnce(JuliaResult<'f, 'static>)) {
        JULIA.with(|handle| {
            handle.borrow_mut().with_stack(|mut stack| {
                stack.scope(|mut frame| {
                    with_result(unsafe { Value::eval_string(&mut frame, string) });
                })
            });
        });
    }

    fn basic_math() {
        eval_string("Int32(2) + Int32(3)", |result| {
            assert_eq!(result.unwrap().unbox::<i32>().unwrap(), 5i32);
        });
    }

    fn runtime_error() {
        eval_string("[1, 2, 3][4]", |result| {
            assert_eq!(result.unwrap_err().datatype_name(), "BoundsError");
        });
    }

    fn syntax_error() {
        eval_string("asdf fdsa asdf fdsa", |result| {
            assert_eq!(result.unwrap_err().datatype_name(), "UndefVarError");
        });
    }

    fn define_then_use() {
        eval_string("increase(x) = x + Int32(1)", |result| {
            assert!(result.is_ok());
        });
        eval_string("increase(Int32(12))", |result| {
            assert_eq!(result.unwrap().unbox::<i32>().unwrap(), 13i32);
        });
        JULIA.with(|handle| {
            handle.borrow_mut().with_stack(|mut stack| {
                stack.scope(|mut frame| unsafe {
                    let func = Module::main(&frame)
                        .global(&frame, "increase")
                        .unwrap()
                        .as_managed();
                    let twelve = Value::new(&mut frame, 12i32);
                    let result = func.call(&mut frame, [twelve]);
                    assert_eq!(result.unwrap().unbox::<i32>().unwrap(), 13i32);
                })
            });
        });
    }

    fn print_error() {
        JULIA.with(|handle| {
            handle.borrow_mut().with_stack(|mut stack| {
                stack.scope(|mut frame| unsafe {
                    Value::eval_string(
                        &mut frame,
                        "ErrorException(\"This is an expected message\")",
                    )
                    .unwrap()
                    .print_error();
                })
            });
        });
    }

    #[test]
    fn eval_string_tests() {
        basic_math();
        runtime_error();
        syntax_error();
        define_then_use();
        print_error();
    }
}