Thanks to visit codestin.com
Credit goes to docs.rs

arrow2/array/binary/
data.rs

1use crate::array::{Arrow2Arrow, BinaryArray};
2use crate::bitmap::Bitmap;
3use crate::offset::{Offset, OffsetsBuffer};
4use arrow_data::{ArrayData, ArrayDataBuilder};
5
6impl<O: Offset> Arrow2Arrow for BinaryArray<O> {
7    fn to_data(&self) -> ArrayData {
8        let data_type = self.data_type.clone().into();
9        let builder = ArrayDataBuilder::new(data_type)
10            .len(self.offsets().len_proxy())
11            .buffers(vec![
12                self.offsets.clone().into_inner().into(),
13                self.values.clone().into(),
14            ])
15            .nulls(self.validity.as_ref().map(|b| b.clone().into()));
16
17        // Safety: Array is valid
18        unsafe { builder.build_unchecked() }
19    }
20
21    fn from_data(data: &ArrayData) -> Self {
22        let data_type = data.data_type().clone().into();
23
24        if data.is_empty() {
25            // Handle empty offsets
26            return Self::new_empty(data_type);
27        }
28
29        let buffers = data.buffers();
30
31        // Safety: ArrayData is valid
32        let mut offsets = unsafe { OffsetsBuffer::new_unchecked(buffers[0].clone().into()) };
33        offsets.slice(data.offset(), data.len() + 1);
34
35        Self {
36            data_type,
37            offsets,
38            values: buffers[1].clone().into(),
39            validity: data.nulls().map(|n| Bitmap::from_null_buffer(n.clone())),
40        }
41    }
42}