Path: blob/main/crates/polars-arrow/src/io/ipc/read/array/primitive.rs
6940 views
use std::collections::VecDeque;1use std::io::{Read, Seek};23use polars_error::{PolarsResult, polars_err};45use super::super::read_basic::*;6use super::super::{Compression, IpcBuffer, Node};7use crate::array::PrimitiveArray;8use crate::datatypes::ArrowDataType;9use crate::io::ipc::read::array::{try_get_array_length, try_get_field_node};10use crate::types::NativeType;1112#[allow(clippy::too_many_arguments)]13pub fn read_primitive<T: NativeType, R: Read + Seek>(14field_nodes: &mut VecDeque<Node>,15dtype: ArrowDataType,16buffers: &mut VecDeque<IpcBuffer>,17reader: &mut R,18block_offset: u64,19is_little_endian: bool,20compression: Option<Compression>,21limit: Option<usize>,22scratch: &mut Vec<u8>,23) -> PolarsResult<PrimitiveArray<T>>24where25Vec<u8>: TryInto<T::Bytes>,26{27let field_node = try_get_field_node(field_nodes, &dtype)?;2829let validity = read_validity(30buffers,31field_node,32reader,33block_offset,34is_little_endian,35compression,36limit,37scratch,38)?;3940let length = try_get_array_length(field_node, limit)?;4142let values = read_buffer(43buffers,44length,45reader,46block_offset,47is_little_endian,48compression,49scratch,50)?;51PrimitiveArray::<T>::try_new(dtype, values, validity)52}5354pub fn skip_primitive(55field_nodes: &mut VecDeque<Node>,56buffers: &mut VecDeque<IpcBuffer>,57) -> PolarsResult<()> {58let _ = field_nodes.pop_front().ok_or_else(|| {59polars_err!(60oos = "IPC: unable to fetch the field for primitive. The file or stream is corrupted."61)62})?;6364let _ = buffers65.pop_front()66.ok_or_else(|| polars_err!(oos = "IPC: missing validity buffer."))?;67let _ = buffers68.pop_front()69.ok_or_else(|| polars_err!(oos = "IPC: missing values buffer."))?;70Ok(())71}727374