1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
use gitql_ast::expression::Expression;
use gitql_core::environment::Environment;
use gitql_core::object::Row;

use crate::engine_evaluator::evaluate_expression;

#[inline(always)]
#[allow(clippy::borrowed_box)]
pub(crate) fn apply_filter_operation(
    env: &mut Environment,
    condition: &Box<dyn Expression>,
    titles: &[String],
    objects: &Vec<Row>,
) -> Result<Vec<Row>, String> {
    let mut rows: Vec<Row> = vec![];

    for object in objects {
        if evaluate_expression(env, condition, titles, &object.values)?.as_bool() {
            rows.push(Row {
                values: object.values.clone(),
            });
        }
    }

    Ok(rows)
}