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
use crate::{connection::types::Column, error::ParseError, types::Value};

pub trait FromQueryResultMapping<ModelData: super::ModelData>: Default {
    fn set_mapping_inner(&mut self, column: &Column, name: &str, index: usize);

    fn set_mapping(&mut self, column: &Column, name: &str, index: usize) {
        self.set_mapping_inner(
            column,
            name.strip_prefix(ModelData::TABLE_WITH_POINT)
                .unwrap_or(name),
            index,
        )
    }

    fn from_columns(columns: &[Column]) -> Self {
        let mut this = Self::default();
        for (i, column) in columns.iter().enumerate() {
            this.set_mapping(column, column.name(), i);
        }
        this
    }
}

pub trait FromQueryResult: super::ModelData + Sized {
    type Mapping: FromQueryResultMapping<Self>;

    fn from_mapping_and_row(
        mapping: &Self::Mapping,
        row: &mut Vec<Value>,
    ) -> std::result::Result<Self, ParseError>;
}