1use anyhow::Result;
2
3use crate::{
4 data::{Value, parse_typed_value},
5 expr,
6 schema::Schema,
7};
8
9pub fn parse_typed_row(schema: &Schema, raw: &[String]) -> Result<Vec<Option<Value>>> {
10 schema
11 .columns
12 .iter()
13 .enumerate()
14 .map(|(idx, column)| {
15 let value = raw.get(idx).map(|s| s.as_str()).unwrap_or("");
16 let normalized = column.normalize_value(value);
17 parse_typed_value(normalized.as_ref(), &column.datatype)
18 })
19 .collect()
20}
21
22pub fn evaluate_filter_expressions(
23 expressions: &[String],
24 headers: &[String],
25 raw_row: &[String],
26 typed_row: &[Option<Value>],
27 row_number: Option<usize>,
28) -> Result<bool> {
29 if expressions.is_empty() {
30 return Ok(true);
31 }
32 let context = expr::build_context(headers, raw_row, typed_row, row_number)?;
33 for expression in expressions {
34 if !expr::evaluate_expression_to_bool(expression, &context)? {
35 return Ok(false);
36 }
37 }
38 Ok(true)
39}