jlrs 0.23.0

jlrs provides bindings to the Julia C API that enable Julia code to be called from Rust and more.
Documentation
#[cfg(feature = "local-rt")]
pub(crate) mod tests {
    use jlrs::{
        data::{
            managed::array::data::accessor::Accessor, types::construct_type::UnionTypeConstructor,
        },
        prelude::*,
    };

    use crate::util::JULIA;

    fn union_data() {
        JULIA.with(|handle| {
            handle.borrow_mut().with_stack(|mut stack| {
                stack.scope(|mut frame| unsafe {
                    let arr = Value::eval_string(&mut frame, "Union{Int, Float64}[1 2.0]").unwrap();
                    let arr = arr
                        .cast::<TypedArray<UnionTypeConstructor<isize, f64>>>()
                        .unwrap();
                    let accessor = arr.union_data();

                    assert_eq!(accessor.get::<isize, _>([0, 0]).unwrap().unwrap(), 1);
                    assert_eq!(accessor.get::<f64, _>([0, 1]).unwrap().unwrap(), 2.0);
                })
            });
        });
    }

    fn union_data_get_unchecked() {
        JULIA.with(|handle| {
            handle.borrow_mut().with_stack(|mut stack| {
                stack.scope(|mut frame| unsafe {
                    let arr = Value::eval_string(&mut frame, "Union{Int, Float64}[1 2.0]").unwrap();
                    let arr = arr
                        .cast::<TypedArray<UnionTypeConstructor<isize, f64>>>()
                        .unwrap();
                    let accessor = arr.union_data();

                    assert_eq!(accessor.get_unchecked::<isize, _>([0, 0]), 1);
                    assert_eq!(accessor.get_unchecked::<f64, _>([0, 1]), 2.0);
                })
            });
        });
    }

    fn union_data_get_value() {
        JULIA.with(|handle| {
            handle.borrow_mut().with_stack(|mut stack| {
                stack.scope(|mut frame| unsafe {
                    let arr = Value::eval_string(&mut frame, "Union{Int, Float64}[1 2.0]").unwrap();
                    let arr = arr
                        .cast::<TypedArray<UnionTypeConstructor<isize, f64>>>()
                        .unwrap();
                    let accessor = arr.union_data();

                    assert_eq!(
                        accessor
                            .get_value(&mut frame, [0, 0])
                            .unwrap()
                            .unwrap()
                            .unbox::<isize>()
                            .unwrap(),
                        1
                    );
                    assert_eq!(
                        accessor
                            .get_value(&mut frame, [0, 1])
                            .unwrap()
                            .unwrap()
                            .unbox::<f64>()
                            .unwrap(),
                        2.0
                    );
                })
            });
        });
    }

    fn union_data_get_value_unchecked() {
        JULIA.with(|handle| {
            handle.borrow_mut().with_stack(|mut stack| {
                stack.scope(|mut frame| unsafe {
                    let arr = Value::eval_string(&mut frame, "Union{Int, Float64}[1 2.0]").unwrap();
                    let arr = arr
                        .cast::<TypedArray<UnionTypeConstructor<isize, f64>>>()
                        .unwrap();
                    let accessor = arr.union_data();

                    assert_eq!(
                        accessor
                            .get_value_unchecked(&mut frame, [0, 0])
                            .unbox::<isize>()
                            .unwrap(),
                        1
                    );
                    assert_eq!(
                        accessor
                            .get_value_unchecked(&mut frame, [0, 1])
                            .unbox::<f64>()
                            .unwrap(),
                        2.0
                    );
                })
            });
        });
    }

    fn try_union_data() {
        JULIA.with(|handle| {
            handle.borrow_mut().with_stack(|mut stack| {
                stack.scope(|mut frame| unsafe {
                    let arr = Value::eval_string(&mut frame, "Union{Int, Float64}[1 2.0]").unwrap();
                    let arr = arr
                        .cast::<TypedArray<UnionTypeConstructor<isize, f64>>>()
                        .unwrap();
                    let accessor = arr.try_union_data();
                    assert!(accessor.is_ok());
                })
            });
        });
    }

    fn try_union_data_err() {
        JULIA.with(|handle| {
            handle.borrow_mut().with_stack(|mut stack| {
                stack.scope(|mut frame| unsafe {
                    let arr = Value::eval_string(&mut frame, "Int[1 2]").unwrap();
                    let arr = arr.cast::<Array>().unwrap();
                    let accessor = arr.try_union_data();
                    assert!(accessor.is_err());
                })
            });
        });
    }

    fn union_data_unchecked() {
        JULIA.with(|handle| {
            handle.borrow_mut().with_stack(|mut stack| {
                stack.scope(|mut frame| unsafe {
                    let arr = Value::eval_string(&mut frame, "Union{Int, Float64}[1 2.0]").unwrap();
                    let arr = arr.cast::<Array>().unwrap();
                    let accessor = arr.union_data_unchecked();

                    assert_eq!(accessor.get::<isize, _>([0, 0]).unwrap().unwrap(), 1);
                    assert_eq!(accessor.get::<f64, _>([0, 1]).unwrap().unwrap(), 2.0);
                })
            });
        });
    }

    pub(crate) fn array_union_data_tests() {
        union_data();
        union_data_get_unchecked();

        union_data_get_value();
        union_data_get_value_unchecked();

        try_union_data();
        try_union_data_err();
        union_data_unchecked();
    }
}