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::RankedArray, prelude::*};

    use crate::util::JULIA;

    fn ranked_array_new_for() {
        JULIA.with(|handle| {
            handle.borrow_mut().with_stack(|mut stack| {
                stack.scope(|mut frame| {
                    let dt = DataType::float32_type(&frame).as_value();
                    let arr = RankedArray::<2>::new_for(&mut frame, dt, [1, 2]);
                    assert!(arr.is_ok());

                    let arr = arr.unwrap();
                    assert_eq!(arr.n_dims(), 2);
                    assert_eq!(arr.element_type(), dt);
                });
            });
        });
    }

    fn ranked_array_new_for_unchecked() {
        JULIA.with(|handle| {
            handle.borrow_mut().with_stack(|mut stack| {
                stack.scope(|mut frame| {
                    let dt = DataType::float32_type(&frame).as_value();
                    let arr =
                        unsafe { RankedArray::<2>::new_for_unchecked(&mut frame, dt, [1, 2]) };
                    assert_eq!(arr.n_dims(), 2);
                    assert_eq!(arr.element_type(), dt);
                });
            });
        });
    }

    fn ranked_array_from_slice_for() {
        JULIA.with(|handle| {
            handle.borrow_mut().with_stack(|mut stack| {
                stack.scope(|mut frame| {
                    let dt = DataType::float32_type(&frame).as_value();
                    let mut data = vec![1f32, 2f32];
                    let data = data.as_mut_slice();
                    let arr = RankedArray::<2>::from_slice_for(&mut frame, dt, data, [1, 2]);
                    assert!(arr.is_ok());
                    let arr = arr.unwrap();
                    assert!(arr.is_ok());
                    let arr = arr.unwrap();

                    assert_eq!(arr.n_dims(), 2);
                    assert_eq!(arr.element_type(), dt);
                });
            });
        });
    }

    fn ranked_array_from_slice_for_type_err() {
        JULIA.with(|handle| {
            handle.borrow_mut().with_stack(|mut stack| {
                stack.scope(|mut frame| {
                    let dt = DataType::float64_type(&frame).as_value();
                    let mut data = vec![1f32, 2f32];
                    let data = data.as_mut_slice();
                    let arr = RankedArray::<2>::from_slice_for(&mut frame, dt, data, [1, 2]);
                    assert!(arr.is_err());
                });
            });
        });
    }

    fn ranked_array_from_slice_for_size_err() {
        JULIA.with(|handle| {
            handle.borrow_mut().with_stack(|mut stack| {
                stack.scope(|mut frame| {
                    let dt = DataType::float32_type(&frame).as_value();
                    let mut data = vec![1f32, 2f32];
                    let data = data.as_mut_slice();
                    let arr = RankedArray::<2>::from_slice_for(&mut frame, dt, data, [2, 2]);
                    assert!(arr.is_err());
                });
            });
        });
    }

    fn ranked_array_from_slice_for_unchecked() {
        JULIA.with(|handle| {
            handle.borrow_mut().with_stack(|mut stack| {
                stack.scope(|mut frame| {
                    let dt = DataType::float32_type(&frame).as_value();
                    let mut data = vec![1f32, 2f32];
                    let data = data.as_mut_slice();
                    let arr = unsafe {
                        RankedArray::<2>::from_slice_for_unchecked(&mut frame, dt, data, [1, 2])
                    };

                    assert_eq!(arr.n_dims(), 2);
                    assert_eq!(arr.element_type(), dt);
                });
            });
        });
    }

    fn ranked_array_from_vec_for() {
        JULIA.with(|handle| {
            handle.borrow_mut().with_stack(|mut stack| {
                stack.scope(|mut frame| {
                    let dt = DataType::float32_type(&frame).as_value();
                    let data = vec![1f32, 2f32];
                    let arr = RankedArray::<2>::from_vec_for(&mut frame, dt, data, [1, 2]);
                    assert!(arr.is_ok());
                    let arr = arr.unwrap();
                    assert!(arr.is_ok());
                    let arr = arr.unwrap();

                    assert_eq!(arr.n_dims(), 2);
                    assert_eq!(arr.element_type(), dt);
                });
            });
        });
    }

    fn ranked_array_from_vec_for_type_err() {
        JULIA.with(|handle| {
            handle.borrow_mut().with_stack(|mut stack| {
                stack.scope(|mut frame| {
                    let dt = DataType::float64_type(&frame).as_value();
                    let data = vec![1f32, 2f32];
                    let arr = RankedArray::<2>::from_vec_for(&mut frame, dt, data, [1, 2]);
                    assert!(arr.is_err());
                });
            });
        });
    }

    fn ranked_array_from_vec_for_size_err() {
        JULIA.with(|handle| {
            handle.borrow_mut().with_stack(|mut stack| {
                stack.scope(|mut frame| {
                    let dt = DataType::float32_type(&frame).as_value();
                    let data = vec![1f32, 2f32];
                    let arr = RankedArray::<2>::from_vec_for(&mut frame, dt, data, [2, 2]);
                    assert!(arr.is_err());
                });
            });
        });
    }

    fn ranked_array_from_vec_for_unchecked() {
        JULIA.with(|handle| {
            handle.borrow_mut().with_stack(|mut stack| {
                stack.scope(|mut frame| {
                    let dt = DataType::float32_type(&frame).as_value();
                    let data = vec![1f32, 2f32];
                    let arr = unsafe {
                        RankedArray::<2>::from_vec_for_unchecked(&mut frame, dt, data, [1, 2])
                    };

                    assert_eq!(arr.n_dims(), 2);
                    assert_eq!(arr.element_type(), dt);
                });
            });
        });
    }

    fn ranked_array_from_slice_cloned_for() {
        JULIA.with(|handle| {
            handle.borrow_mut().with_stack(|mut stack| {
                stack.scope(|mut frame| {
                    let dt = DataType::float32_type(&frame).as_value();
                    let mut data = vec![1f32, 2f32];
                    let data = data.as_mut_slice();
                    let arr = RankedArray::<2>::from_slice_cloned_for(&mut frame, dt, data, [1, 2]);
                    assert!(arr.is_ok());
                    let arr = arr.unwrap();
                    assert!(arr.is_ok());
                    let arr = arr.unwrap();

                    assert_eq!(arr.n_dims(), 2);
                    assert_eq!(arr.element_type(), dt);
                });
            });
        });
    }

    fn ranked_array_from_slice_cloned_for_type_err() {
        JULIA.with(|handle| {
            handle.borrow_mut().with_stack(|mut stack| {
                stack.scope(|mut frame| {
                    let dt = DataType::float64_type(&frame).as_value();
                    let mut data = vec![1f32, 2f32];
                    let data = data.as_mut_slice();
                    let arr = RankedArray::<2>::from_slice_cloned_for(&mut frame, dt, data, [1, 2]);
                    assert!(arr.is_err());
                });
            });
        });
    }

    fn ranked_array_from_slice_cloned_for_size_err() {
        JULIA.with(|handle| {
            handle.borrow_mut().with_stack(|mut stack| {
                stack.scope(|mut frame| {
                    let dt = DataType::float32_type(&frame).as_value();
                    let mut data = vec![1f32, 2f32];
                    let data = data.as_mut_slice();
                    let arr = RankedArray::<2>::from_slice_cloned_for(&mut frame, dt, data, [2, 2]);
                    assert!(arr.is_err());
                });
            });
        });
    }

    fn ranked_array_from_slice_cloned_for_unchecked() {
        JULIA.with(|handle| {
            handle.borrow_mut().with_stack(|mut stack| {
                stack.scope(|mut frame| {
                    let dt = DataType::float32_type(&frame).as_value();
                    let mut data = vec![1f32, 2f32];
                    let data = data.as_mut_slice();
                    let arr = unsafe {
                        RankedArray::<2>::from_slice_cloned_for_unchecked(
                            &mut frame,
                            dt,
                            data,
                            [1, 2],
                        )
                    };

                    assert_eq!(arr.n_dims(), 2);
                    assert_eq!(arr.element_type(), dt);
                });
            });
        });
    }

    pub(crate) fn ranked_array_constructors_tests() {
        ranked_array_new_for();
        ranked_array_new_for_unchecked();

        ranked_array_from_slice_for();
        ranked_array_from_slice_for_size_err();
        ranked_array_from_slice_for_type_err();
        ranked_array_from_slice_for_unchecked();

        ranked_array_from_vec_for();
        ranked_array_from_vec_for_size_err();
        ranked_array_from_vec_for_type_err();
        ranked_array_from_vec_for_unchecked();

        ranked_array_from_slice_cloned_for();
        ranked_array_from_slice_cloned_for_size_err();
        ranked_array_from_slice_cloned_for_type_err();
        ranked_array_from_slice_cloned_for_unchecked();
    }
}