typed_arrow/bridge/
binary.rs

1//! Binary family bindings (Binary, `LargeBinary`, `FixedSizeBinary`).
2
3use arrow_array::{
4    builder::{BinaryBuilder, FixedSizeBinaryBuilder, LargeBinaryBuilder},
5    FixedSizeBinaryArray, LargeBinaryArray,
6};
7use arrow_schema::DataType;
8
9use super::ArrowBinding;
10
11// Binary / Vec<u8>
12impl ArrowBinding for Vec<u8> {
13    type Builder = BinaryBuilder;
14    type Array = arrow_array::BinaryArray;
15    fn data_type() -> DataType {
16        DataType::Binary
17    }
18    fn new_builder(capacity: usize) -> Self::Builder {
19        BinaryBuilder::with_capacity(capacity, 0)
20    }
21    fn append_value(b: &mut Self::Builder, v: &Self) {
22        b.append_value(v.as_slice());
23    }
24    fn append_null(b: &mut Self::Builder) {
25        b.append_null();
26    }
27    fn finish(mut b: Self::Builder) -> Self::Array {
28        b.finish()
29    }
30}
31
32// FixedSizeBinary: [u8; N]
33impl<const N: usize> super::ArrowBinding for [u8; N] {
34    type Builder = FixedSizeBinaryBuilder;
35    type Array = FixedSizeBinaryArray;
36    fn data_type() -> DataType {
37        DataType::FixedSizeBinary(i32::try_from(N).expect("width fits i32"))
38    }
39    fn new_builder(capacity: usize) -> Self::Builder {
40        FixedSizeBinaryBuilder::with_capacity(capacity, i32::try_from(N).expect("width fits i32"))
41    }
42    fn append_value(b: &mut Self::Builder, v: &Self) {
43        let _ = b.append_value(v);
44    }
45    fn append_null(b: &mut Self::Builder) {
46        b.append_null();
47    }
48    fn finish(mut b: Self::Builder) -> Self::Array {
49        b.finish()
50    }
51}
52
53/// Wrapper denoting Arrow `LargeBinary` values. Use when individual binary values
54/// can exceed 2GB or when 64-bit offsets are preferred.
55pub struct LargeBinary(Vec<u8>);
56
57impl LargeBinary {
58    /// Construct a new `LargeBinary` from the given bytes.
59    #[inline]
60    #[must_use]
61    pub fn new(value: Vec<u8>) -> Self {
62        Self(value)
63    }
64    /// Return the underlying bytes as a slice.
65    #[inline]
66    #[must_use]
67    pub fn as_slice(&self) -> &[u8] {
68        self.0.as_slice()
69    }
70    /// Consume and return the underlying byte vector.
71    #[inline]
72    #[must_use]
73    pub fn into_vec(self) -> Vec<u8> {
74        self.0
75    }
76}
77
78impl From<Vec<u8>> for LargeBinary {
79    #[inline]
80    fn from(value: Vec<u8>) -> Self {
81        Self::new(value)
82    }
83}
84
85impl ArrowBinding for LargeBinary {
86    type Builder = LargeBinaryBuilder;
87    type Array = LargeBinaryArray;
88    fn data_type() -> DataType {
89        DataType::LargeBinary
90    }
91    fn new_builder(capacity: usize) -> Self::Builder {
92        LargeBinaryBuilder::with_capacity(capacity, 0)
93    }
94    fn append_value(b: &mut Self::Builder, v: &Self) {
95        b.append_value(v.0.as_slice());
96    }
97    fn append_null(b: &mut Self::Builder) {
98        b.append_null();
99    }
100    fn finish(mut b: Self::Builder) -> Self::Array {
101        b.finish()
102    }
103}