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::AccessorMut,
            types::construct_type::UnionTypeConstructor,
        },
        prelude::*,
    };

    use crate::util::JULIA;

    fn union_data_mut() {
        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 mut arr = arr
                        .cast::<TypedArray<UnionTypeConstructor<isize, f64>>>()
                        .unwrap();
                    let accessor = arr.union_data_mut();

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

    fn union_data_mut_set() {
        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 mut arr = arr
                        .cast::<TypedArray<UnionTypeConstructor<isize, f64>>>()
                        .unwrap();
                    let mut accessor = arr.union_data_mut();

                    assert!(
                        accessor
                            .set([0, 0], DataType::float64_type(&frame), 1.0f64)
                            .is_ok()
                    );
                    assert!(
                        accessor
                            .set([0, 1], DataType::int64_type(&frame), 2isize)
                            .is_ok()
                    );

                    assert_eq!(accessor.get::<f64, _>([0, 0]).unwrap().unwrap(), 1.0);
                    assert_eq!(accessor.get::<isize, _>([0, 1]).unwrap().unwrap(), 2);
                })
            });
        });
    }
    fn union_data_mut_set_err() {
        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 mut arr = arr
                        .cast::<TypedArray<UnionTypeConstructor<isize, f64>>>()
                        .unwrap();
                    let mut accessor = arr.union_data_mut();

                    assert!(
                        accessor
                            .set([0, 0], DataType::float32_type(&frame), 1.0f32)
                            .unwrap()
                            .is_err()
                    );
                })
            });
        });
    }

    fn union_data_mut_set_typed() {
        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 mut arr = arr
                        .cast::<TypedArray<UnionTypeConstructor<isize, f64>>>()
                        .unwrap();
                    let mut accessor = arr.union_data_mut();

                    assert!(accessor.set_typed::<f64, _>([0, 0], 1.0).is_ok());
                    assert!(accessor.set_typed::<isize, _>([0, 1], 2).is_ok());

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

    fn union_data_mut_set_typed_err() {
        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 mut arr = arr
                        .cast::<TypedArray<UnionTypeConstructor<isize, f64>>>()
                        .unwrap();
                    let mut accessor = arr.union_data_mut();

                    assert!(accessor.set_typed::<f32, _>([0, 0], 1.0).unwrap().is_err());
                })
            });
        });
    }

    fn union_data_mut_set_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 mut arr = arr
                        .cast::<TypedArray<UnionTypeConstructor<isize, f64>>>()
                        .unwrap();
                    let mut accessor = arr.union_data_mut();

                    accessor.set_unchecked([0, 0], DataType::float64_type(&frame), 1.0f64);
                    accessor.set_unchecked([0, 1], DataType::int64_type(&frame), 2isize);

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

    fn union_data_mut_set_typed_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 mut arr = arr
                        .cast::<TypedArray<UnionTypeConstructor<isize, f64>>>()
                        .unwrap();
                    let mut accessor = arr.union_data_mut();

                    accessor.set_typed_unchecked([0, 0], 1.0f64);
                    accessor.set_typed_unchecked([0, 1], 2isize);

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

    fn union_data_mut_set_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 mut arr = arr
                        .cast::<TypedArray<UnionTypeConstructor<isize, f64>>>()
                        .unwrap();
                    let mut accessor = arr.union_data_mut();

                    let v = Value::new(&mut frame, 1.0f64);
                    assert!(accessor.set_value(&mut frame, [0, 0], v).unwrap().is_ok());
                    assert_eq!(accessor.get::<f64, _>([0, 0]).unwrap().unwrap(), 1.0);
                })
            });
        });
    }

    fn union_data_mut_set_value_err() {
        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 mut arr = arr
                        .cast::<TypedArray<UnionTypeConstructor<isize, f64>>>()
                        .unwrap();
                    let mut accessor = arr.union_data_mut();

                    let v = Value::new(&mut frame, 1.0f32);
                    assert!(accessor.set_value(&mut frame, [0, 0], v).unwrap().is_err());
                })
            });
        });
    }

    fn union_data_mut_set_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 mut arr = arr
                        .cast::<TypedArray<UnionTypeConstructor<isize, f64>>>()
                        .unwrap();
                    let mut accessor = arr.union_data_mut();

                    let v = Value::new(&mut frame, 1.0f64);
                    accessor.set_value_unchecked([0, 0], v);
                    assert_eq!(accessor.get::<f64, _>([0, 0]).unwrap().unwrap(), 1.0);
                })
            });
        });
    }

    fn try_union_data_mut() {
        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 mut arr = arr.cast::<Array>().unwrap();
                    let accessor = arr.try_union_data_mut();
                    assert!(accessor.is_ok());
                })
            });
        });
    }

    fn try_union_data_mut_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 mut arr = arr.cast::<Array>().unwrap();
                    let accessor = arr.try_union_data_mut();
                    assert!(accessor.is_err());
                })
            });
        });
    }

    fn union_data_mut_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 mut arr = arr
                        .cast::<TypedArray<UnionTypeConstructor<isize, f64>>>()
                        .unwrap();
                    let accessor = arr.union_data_mut_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_mut_tests() {
        union_data_mut();

        union_data_mut_set();
        union_data_mut_set_err();
        union_data_mut_set_unchecked();

        union_data_mut_set_typed();
        union_data_mut_set_typed_err();
        union_data_mut_set_typed_unchecked();

        union_data_mut_set_value();
        union_data_mut_set_value_err();
        union_data_mut_set_value_unchecked();

        try_union_data_mut();
        try_union_data_mut_err();
        union_data_mut_unchecked();
    }
}