From 267eb73f7dc4ea88c8be2c106d43176f0b41680e Mon Sep 17 00:00:00 2001 From: Christopher Prohm Date: Mon, 23 Feb 2026 23:11:44 +0100 Subject: [PATCH 1/2] Allow to build bool from integers --- .../internal/serialization/bool_builder.rs | 40 +++++++++ .../src/test_with_arrow/impls/arrow_bool.rs | 88 +++++++++++++++++++ serde_arrow/src/test_with_arrow/impls/mod.rs | 1 + .../src/test_with_arrow/impls/primitives.rs | 24 ----- 4 files changed, 129 insertions(+), 24 deletions(-) create mode 100644 serde_arrow/src/test_with_arrow/impls/arrow_bool.rs diff --git a/serde_arrow/src/internal/serialization/bool_builder.rs b/serde_arrow/src/internal/serialization/bool_builder.rs index 01ffd589..e3011f1c 100644 --- a/serde_arrow/src/internal/serialization/bool_builder.rs +++ b/serde_arrow/src/internal/serialization/bool_builder.rs @@ -95,6 +95,14 @@ impl<'a> Serializer for &'a mut BoolBuilder { 'a, BoolBuilder; override serialize_none, override serialize_bool, + override serialize_i8, + override serialize_i16, + override serialize_i32, + override serialize_i64, + override serialize_u8, + override serialize_u16, + override serialize_u32, + override serialize_u64, ); fn serialize_none(self) -> Result<()> { @@ -110,4 +118,36 @@ impl<'a> Serializer for &'a mut BoolBuilder { self.array.len += 1; Ok(()) } + + fn serialize_i8(self, v: i8) -> Result<()> { + self.serialize_bool(v != 0) + } + + fn serialize_i16(self, v: i16) -> Result<()> { + self.serialize_bool(v != 0) + } + + fn serialize_i32(self, v: i32) -> Result<()> { + self.serialize_bool(v != 0) + } + + fn serialize_i64(self, v: i64) -> Result<()> { + self.serialize_bool(v != 0) + } + + fn serialize_u8(self, v: u8) -> Result<()> { + self.serialize_bool(v != 0) + } + + fn serialize_u16(self, v: u16) -> Result<()> { + self.serialize_bool(v != 0) + } + + fn serialize_u32(self, v: u32) -> Result<()> { + self.serialize_bool(v != 0) + } + + fn serialize_u64(self, v: u64) -> Result<()> { + self.serialize_bool(v != 0) + } } diff --git a/serde_arrow/src/test_with_arrow/impls/arrow_bool.rs b/serde_arrow/src/test_with_arrow/impls/arrow_bool.rs new file mode 100644 index 00000000..657d2ce1 --- /dev/null +++ b/serde_arrow/src/test_with_arrow/impls/arrow_bool.rs @@ -0,0 +1,88 @@ +use serde_json::json; + +use crate::internal::{schema::TracingOptions, utils::Item}; + +use super::utils::Test; + +#[test] +fn bool() { + let items = &[Item(true), Item(false)]; + Test::new() + .with_schema(json!([{"name": "item", "data_type": "Bool"}])) + .trace_schema_from_samples(items, TracingOptions::default()) + .trace_schema_from_type::>(TracingOptions::default()) + .serialize(items) + .deserialize(items) + .check_nulls(&[&[false, false]]); +} + +#[test] +fn nullable_bool() { + let items = &[Item(Some(true)), Item(None), Item(Some(false))]; + Test::new() + .with_schema(json!([{"name": "item", "data_type": "Bool", "nullable": true}])) + .trace_schema_from_samples(items, TracingOptions::default()) + .trace_schema_from_type::>>(TracingOptions::default()) + .serialize(items) + .deserialize(items) + .check_nulls(&[&[false, true, false]]); +} + +fn test_bool_from_int(zero: T, nonzero: T) { + Test::new() + .with_schema(json!([{"name": "item", "data_type": "Bool"}])) + .serialize(&[Item(zero), Item(nonzero)]) + .deserialize(&[Item(false), Item(true)]); +} + +#[test] +fn bool_from_i8() { + test_bool_from_int(0_i8, 1_i8); + test_bool_from_int(0_i8, 32_i8); + test_bool_from_int(0_i8, -1_i8); +} + +#[test] +fn bool_from_i16() { + test_bool_from_int(0_i16, 1_i16); + test_bool_from_int(0_i16, 32_i16); + test_bool_from_int(0_i16, -1_i16); +} + +#[test] +fn bool_from_i32() { + test_bool_from_int(0_i32, 1_i32); + test_bool_from_int(0_i32, 32_i32); + test_bool_from_int(0_i32, -1_i32); +} + +#[test] +fn bool_from_i64() { + test_bool_from_int(0_i64, 1_i64); + test_bool_from_int(0_i64, 32_i64); + test_bool_from_int(0_i64, -1_i64); +} + +#[test] +fn bool_from_u8() { + test_bool_from_int(0_u8, 1_u8); + test_bool_from_int(0_u8, 32_u8); +} + +#[test] +fn bool_from_u16() { + test_bool_from_int(0_u16, 1_u16); + test_bool_from_int(0_u16, 32_u16); +} + +#[test] +fn bool_from_u32() { + test_bool_from_int(0_u32, 1_u32); + test_bool_from_int(0_u32, 32_u32); +} + +#[test] +fn bool_from_u64() { + test_bool_from_int(0_u64, 1_u64); + test_bool_from_int(0_u64, 32_u64); +} diff --git a/serde_arrow/src/test_with_arrow/impls/mod.rs b/serde_arrow/src/test_with_arrow/impls/mod.rs index e58e49e7..fc86ca22 100644 --- a/serde_arrow/src/test_with_arrow/impls/mod.rs +++ b/serde_arrow/src/test_with_arrow/impls/mod.rs @@ -5,6 +5,7 @@ mod utils; mod arrow_binary; #[cfg(has_arrow_bytes_view_support)] mod arrow_binary_view; +mod arrow_bool; mod arrow_date; mod arrow_decimal; mod arrow_dictionary; diff --git a/serde_arrow/src/test_with_arrow/impls/primitives.rs b/serde_arrow/src/test_with_arrow/impls/primitives.rs index 9a174701..1bded810 100644 --- a/serde_arrow/src/test_with_arrow/impls/primitives.rs +++ b/serde_arrow/src/test_with_arrow/impls/primitives.rs @@ -20,30 +20,6 @@ fn null() { // nulls = [true, true, true], } -#[test] -fn bool() { - let items = &[Item(true), Item(false)]; - Test::new() - .with_schema(json!([{"name": "item", "data_type": "Bool"}])) - .trace_schema_from_samples(items, TracingOptions::default()) - .trace_schema_from_type::>(TracingOptions::default()) - .serialize(items) - .deserialize(items) - .check_nulls(&[&[false, false]]); -} - -#[test] -fn nullable_bool() { - let items = &[Item(Some(true)), Item(None), Item(Some(false))]; - Test::new() - .with_schema(json!([{"name": "item", "data_type": "Bool", "nullable": true}])) - .trace_schema_from_samples(items, TracingOptions::default()) - .trace_schema_from_type::>>(TracingOptions::default()) - .serialize(items) - .deserialize(items) - .check_nulls(&[&[false, true, false]]); -} - #[test] fn u8() { let items: &[Item] = &[Item(1), Item(2), Item(3), Item(4)]; From ea41968ad796a89442bef7b71c9c72912d202d9d Mon Sep 17 00:00:00 2001 From: Christopher Prohm Date: Mon, 23 Feb 2026 23:13:07 +0100 Subject: [PATCH 2/2] Update changelog --- Changes.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Changes.md b/Changes.md index 43633b91..799741db 100644 --- a/Changes.md +++ b/Changes.md @@ -1,5 +1,9 @@ # Change log +## 0.14.1 (development) + +- Allow to build bools from integers. Nonzero integers are mapped to true + ## 0.14.0 - Add `arrow=58` support