#![expect(clippy::print_stdout)]
use std::collections::BTreeMap;
use std::sync::Arc;
use quiver::arrow::array::{ArrayRef, StringArray};
use quiver::{Column, Quiver, Utf8};
#[derive(Quiver)]
struct Measurements {
#[quiver(metadata)]
metadata: BTreeMap<String, String>,
sensor: Column<Utf8>,
temperature: Column<Option<f64>>,
comment: ArrayRef,
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
let measurements = Measurements {
metadata: BTreeMap::from([("origin".to_owned(), "lab".to_owned())]),
sensor: Column::from_values(["kitchen", "bedroom", "attic"]),
temperature: Column::from_values([Some(22.1), None, Some(30.5)]),
comment: Arc::new(StringArray::from(vec!["cozy", "quiet", "spooky"])),
};
let batch = measurements.into_record_batch()?;
let temperatures = Measurements::COLUMN_TEMPERATURE.extract(&batch)?;
println!(
"max: {:?} °C",
temperatures.iter().flatten().max_by(f64::total_cmp)
);
let measurements = Measurements::from_record_batch(batch)?;
println!("origin: {:?}", measurements.metadata.get("origin"));
for (sensor, temperature) in
std::iter::zip(measurements.sensor.iter(), measurements.temperature.iter())
{
match temperature {
Some(temperature) => println!("{sensor}: {temperature} °C"),
None => println!("{sensor}: no reading"),
}
}
println!("comments: {:?}", measurements.comment);
Ok(())
}