csv_managed/
rows.rs

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}