arrow_json/reader/
boolean_array.rs1use std::sync::Arc;
19
20use arrow_array::ArrayRef;
21use arrow_array::builder::BooleanBuilder;
22use arrow_schema::ArrowError;
23
24use crate::reader::tape::{Tape, TapeElement};
25use crate::reader::{ArrayDecoder, DecoderContext};
26
27#[derive(Default)]
28pub struct BooleanArrayDecoder {
29 ignore_type_conflicts: bool,
30}
31impl BooleanArrayDecoder {
32 pub fn new(ctx: &DecoderContext) -> Self {
33 Self {
34 ignore_type_conflicts: ctx.ignore_type_conflicts(),
35 }
36 }
37}
38
39impl ArrayDecoder for BooleanArrayDecoder {
40 fn decode(&mut self, tape: &Tape<'_>, pos: &[u32]) -> Result<ArrayRef, ArrowError> {
41 let mut builder = BooleanBuilder::with_capacity(pos.len());
42 for p in pos {
43 match tape.get(*p) {
44 TapeElement::Null => builder.append_null(),
45 TapeElement::True => builder.append_value(true),
46 TapeElement::False => builder.append_value(false),
47 _ if self.ignore_type_conflicts => builder.append_null(),
48 _ => return Err(tape.error(*p, "boolean")),
49 }
50 }
51
52 Ok(Arc::new(builder.finish()))
53 }
54}