polars_arrow/ffi/
mod.rs

1//! contains FFI bindings to import and export [`Array`](crate::array::Array) via
2//! Arrow's [C Data Interface](https://arrow.apache.org/docs/format/CDataInterface.html)
3mod array;
4mod bridge;
5mod generated;
6pub mod mmap;
7mod schema;
8mod stream;
9
10pub(crate) use array::{try_from, ArrowArrayRef, InternalArrowArray};
11pub(crate) use bridge::align_to_c_data_interface;
12pub use generated::{ArrowArray, ArrowArrayStream, ArrowSchema};
13use polars_error::PolarsResult;
14pub use stream::{export_iterator, ArrowArrayStreamReader};
15
16use self::schema::to_field;
17use crate::array::Array;
18use crate::datatypes::{ArrowDataType, Field};
19
20/// Exports an [`Box<dyn Array>`] to the C data interface.
21pub fn export_array_to_c(array: Box<dyn Array>) -> ArrowArray {
22    ArrowArray::new(bridge::align_to_c_data_interface(array))
23}
24
25/// Exports a [`Field`] to the C data interface.
26pub fn export_field_to_c(field: &Field) -> ArrowSchema {
27    ArrowSchema::new(field)
28}
29
30/// Imports a [`Field`] from the C data interface.
31/// # Safety
32/// This function is intrinsically `unsafe` and relies on a [`ArrowSchema`]
33/// being valid according to the [C data interface](https://arrow.apache.org/docs/format/CDataInterface.html) (FFI).
34pub unsafe fn import_field_from_c(field: &ArrowSchema) -> PolarsResult<Field> {
35    to_field(field)
36}
37
38/// Imports an [`Array`] from the C data interface.
39/// # Safety
40/// This function is intrinsically `unsafe` and relies on a [`ArrowArray`]
41/// being valid according to the [C data interface](https://arrow.apache.org/docs/format/CDataInterface.html) (FFI).
42pub unsafe fn import_array_from_c(
43    array: ArrowArray,
44    dtype: ArrowDataType,
45) -> PolarsResult<Box<dyn Array>> {
46    try_from(InternalArrowArray::new(array, dtype))
47}