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
27
28
29
30
31
32
33
34
35
36
37
38
39
use gitql_ast::expression::Expression;
use gitql_core::environment::Environment;
use gitql_core::object::GitQLObject;
use gitql_core::object::Group;
use gitql_core::object::Row;

use crate::engine_evaluator::evaluate_expression;

/// DataProvider is a component that used to provide and map the data to the GitQL Engine
///
/// User should implement [`DataProvider`] trait for each data format for example files, logs, api
pub trait DataProvider {
    fn provide(
        &self,
        env: &mut Environment,
        table: &str,
        fields_names: &[String],
        titles: &[String],
        fields_values: &[Box<dyn Expression>],
        hidden_count: i64,
    ) -> Result<GitQLObject, String>;
}

pub fn select_values(
    env: &mut Environment,
    titles: &[String],
    fields_values: &[Box<dyn Expression>],
) -> Result<Group, String> {
    let mut group = Group { rows: vec![] };
    let mut values = Vec::with_capacity(fields_values.len());

    for value in fields_values.iter() {
        let evaluated = evaluate_expression(env, value, titles, &values)?;
        values.push(evaluated);
    }

    group.rows.push(Row { values });
    Ok(group)
}