use arrow2::array::{Array, PrimitiveArray};
use arrow2::datatypes::Field;
use arrow2::error::Result;
use arrow2::ffi;
fn export(array: Box<dyn Array>) -> (ffi::ArrowArray, ffi::ArrowSchema) {
let field = Field::new("a", array.data_type().clone(), true);
(
ffi::export_array_to_c(array),
ffi::export_field_to_c(&field),
)
}
unsafe fn import(array: ffi::ArrowArray, schema: &ffi::ArrowSchema) -> Result<Box<dyn Array>> {
let field = ffi::import_field_from_c(schema)?;
ffi::import_array_from_c(array, field.data_type)
}
fn main() -> Result<()> {
let array = PrimitiveArray::<i32>::from([Some(1), None, Some(123)]).boxed();
let (array_ffi, schema_ffi) = export(array.clone());
let new_array = unsafe { import(array_ffi, &schema_ffi)? };
assert_eq!(array.as_ref(), new_array.as_ref());
Ok(())
}