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

    use crate::util::JULIA;

    #[derive(ValidField, ValidLayout, Debug, Clone, Typecheck, Unbox, ConstructType)]
    #[jlrs(julia_type = "Main.IWRL")]
    #[repr(C)]
    struct IWRL<'scope, 'data> {
        pub(crate) a: i8,
        pub(crate) b: Option<WeakValue<'scope, 'data>>,
    }

    #[derive(ValidField, ValidLayout, Debug, Clone, Typecheck, Unbox)]
    #[jlrs(julia_type = "Main.AIDE")]
    #[repr(C)]
    struct AIDE<'scope, 'data> {
        pub(crate) a: u8,
        pub(crate) b: Option<WeakValue<'scope, 'data>>,
    }

    #[derive(ConstructType, HasLayout)]
    #[jlrs(julia_type = "Main.AIDE", constructor_for = "AIDE", scope_lifetime = true, data_lifetime = true, layout_params = [], elided_params = ["T"], all_params = ["T"])]
    struct AIDETypeConstructor<T> {
        _t: ::std::marker::PhantomData<T>,
    }

    fn inline_data() {
        JULIA.with(|handle| {
            handle.borrow_mut().with_stack(|mut stack| {
                stack.scope(|mut frame| unsafe {
                    let arr = Value::eval_string(&mut frame, "IWRL[IWRL(1,1) IWRL(2,2)]").unwrap();
                    let arr = arr.cast::<TypedArray<IWRL>>().unwrap();
                    let accessor = arr.inline_data();

                    assert_eq!(accessor[[0, 0]].a, 1);
                    assert_eq!(accessor[[0, 1]].a, 2);
                })
            });
        });
    }

    fn inline_data_get() {
        JULIA.with(|handle| {
            handle.borrow_mut().with_stack(|mut stack| {
                stack.scope(|mut frame| unsafe {
                    let arr = Value::eval_string(&mut frame, "IWRL[IWRL(1,1) IWRL(2,2)]").unwrap();
                    let arr = arr.cast::<TypedArray<IWRL>>().unwrap();
                    let accessor = arr.inline_data();

                    assert!(accessor.get([0, 0]).is_some());
                    assert!(accessor.get([0, 1]).is_some());
                })
            });
        });
    }

    fn inline_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, "IWRL[IWRL(1,1) IWRL(2,2)]").unwrap();
                    let arr = arr.cast::<TypedArray<IWRL>>().unwrap();
                    let accessor = arr.inline_data();

                    assert_eq!(accessor.get_unchecked([0, 0]).a, 1);
                    assert_eq!(accessor.get_unchecked([0, 1]).a, 2);
                })
            });
        });
    }

    fn inline_data_as_slice() {
        JULIA.with(|handle| {
            handle.borrow_mut().with_stack(|mut stack| {
                stack.scope(|mut frame| unsafe {
                    let arr = Value::eval_string(&mut frame, "IWRL[IWRL(1,1) IWRL(2,2)]").unwrap();
                    let arr = arr.cast::<TypedArray<IWRL>>().unwrap();
                    let accessor = arr.inline_data();
                    let slice = accessor.as_slice();

                    assert_eq!(slice[0].a, 1);
                    assert_eq!(slice[1].a, 2);
                })
            });
        });
    }

    fn inline_data_into_slice() {
        JULIA.with(|handle| {
            handle.borrow_mut().with_stack(|mut stack| {
                stack.scope(|mut frame| unsafe {
                    let arr = Value::eval_string(&mut frame, "IWRL[IWRL(1,1) IWRL(2,2)]").unwrap();
                    let arr = arr.cast::<TypedArray<IWRL>>().unwrap();
                    let accessor = arr.inline_data();
                    let slice = accessor.into_slice();

                    assert_eq!(slice[0].a, 1);
                    assert_eq!(slice[1].a, 2);
                })
            });
        });
    }

    fn inline_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, "IWRL[IWRL(1,1) IWRL(2,2)]").unwrap();
                    let arr = arr.cast::<TypedArray<IWRL>>().unwrap();
                    let accessor = arr.inline_data();

                    assert_eq!(
                        accessor
                            .get_value(&mut frame, [0, 0])
                            .unwrap()
                            .unwrap()
                            .unbox::<IWRL>()
                            .unwrap()
                            .a,
                        1
                    );
                    assert_eq!(
                        accessor
                            .get_value(&mut frame, [0, 1])
                            .unwrap()
                            .unwrap()
                            .unbox::<IWRL>()
                            .unwrap()
                            .a,
                        2
                    );
                })
            });
        });
    }

    fn inline_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, "IWRL[IWRL(1,1) IWRL(2,2)]").unwrap();
                    let arr = arr.cast::<TypedArray<IWRL>>().unwrap();
                    let accessor = arr.inline_data();

                    assert_eq!(
                        accessor
                            .get_value_unchecked(&mut frame, [0, 0])
                            .unbox::<IWRL>()
                            .unwrap()
                            .a,
                        1
                    );
                    assert_eq!(
                        accessor
                            .get_value_unchecked(&mut frame, [0, 1])
                            .unbox::<IWRL>()
                            .unwrap()
                            .a,
                        2
                    );
                })
            });
        });
    }

    fn inline_data_with_layout() {
        JULIA.with(|handle| {
            handle.borrow_mut().with_stack(|mut stack| {
                stack.scope(|mut frame| unsafe {
                    let arr = Value::eval_string(
                        &mut frame,
                        "AIDE{true}[AIDE{true}(1,1) AIDE{true}(2,2)]",
                    )
                    .unwrap();
                    let arr = arr
                        .cast::<TypedArray<AIDETypeConstructor<ConstantBool<true>>>>()
                        .unwrap();
                    let accessor = arr.inline_data_with_layout();

                    assert_eq!(accessor.get([0, 0]).unwrap().a, 1);
                    assert_eq!(accessor.get([0, 1]).unwrap().a, 2);
                })
            });
        });
    }

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

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

    fn inline_data_unchecked() {
        JULIA.with(|handle| {
            handle.borrow_mut().with_stack(|mut stack| {
                stack.scope(|mut frame| unsafe {
                    let arr = Value::eval_string(&mut frame, "IWRL[IWRL(1,1) IWRL(2,2)]").unwrap();
                    let arr = arr.cast::<TypedArray<IWRL>>().unwrap();
                    let accessor = arr.inline_data_unchecked::<IWRL>();

                    assert_eq!(accessor[[0, 0]].a, 1);
                    assert_eq!(accessor[[0, 1]].a, 2);
                })
            });
        });
    }

    pub(crate) fn array_inline_data_tests() {
        JULIA.with(|handle| {
            handle.borrow_mut().with_stack(|mut stack| {
                stack.scope(|frame| unsafe {
                    Value::eval_string(&frame, "struct IWRL a::Int8; b end").unwrap();
                    Value::eval_string(&frame, "struct AIDE{T} a::UInt8; b end").unwrap();
                })
            });
        });

        inline_data();
        inline_data_get();
        inline_data_get_unchecked();
        inline_data_as_slice();
        inline_data_into_slice();

        inline_data_get_value();
        inline_data_get_value_unchecked();

        inline_data_with_layout();
        try_inline_data();
        try_inline_data_err();
        inline_data_unchecked();
    }
}