sql_tools 0.11.10

A rust crate meant to make SQL queries simple and communication between various SQL versions easy.
Documentation
use itertools::Itertools;

use crate::{data_types::SQLDataTypes, statements::insert::DatatypeIndices};

pub(crate) fn get_dt_indices(data: &Vec<Vec<SQLDataTypes>>) -> DatatypeIndices {
    let mut is_varchar: Vec<usize> = Vec::new();
    let mut is_float: Vec<usize> = Vec::new();
    let mut is_int: Vec<usize> = Vec::new();
    let mut is_date: Vec<usize> = Vec::new();

    if data.len() == 1 {
        match data[0][0] {
            SQLDataTypes::Varchar(_) => is_varchar.push(0),
            SQLDataTypes::Number(_) => is_int.push(0),
            SQLDataTypes::Float(_) => is_float.push(0),
            SQLDataTypes::Date(_) => is_date.push(0),
            SQLDataTypes::NULL => is_varchar.push(0),
        }
    } else {
        for y_idx in 1..data.len() {
            for x_idx in 0..data[y_idx].len() {
                let cell = &data[y_idx][x_idx];
                match cell {
                    SQLDataTypes::Varchar(_) => is_varchar.push(x_idx),
                    SQLDataTypes::Number(_) => is_int.push(x_idx),
                    SQLDataTypes::Float(_) => is_float.push(x_idx),
                    SQLDataTypes::Date(_) => is_date.push(x_idx),
                    SQLDataTypes::NULL => continue,
                }
            }
        }
    }

    DatatypeIndices {
        is_varchar,
        is_float,
        is_int,
        is_date,
    }
    .find_uniques()
}

impl DatatypeIndices {
    pub(crate) fn find_uniques(mut self) -> Self {
        let is_varchar = self.is_varchar.into_iter().unique().collect::<Vec<usize>>();
        for x_idx in is_varchar.iter() {
            if self.is_float.contains(x_idx) {
                self.is_float.retain(|v| *v != *x_idx);
            } else if self.is_int.contains(x_idx) {
                self.is_int.retain(|v| *v != *x_idx);
            } else if self.is_date.contains(x_idx) {
                self.is_date.retain(|v| *v != *x_idx);
            } else {
                continue;
            }
        }
        let is_float = self.is_float.into_iter().unique().collect::<Vec<usize>>();
        for x_idx in is_float.iter() {
            if self.is_int.contains(x_idx) {
                self.is_int.retain(|v| *v != *x_idx);
            } else if self.is_date.contains(x_idx) {
                self.is_date.retain(|v| *v != *x_idx);
            } else {
                continue;
            }
        }
        let is_int = self.is_int.into_iter().unique().collect::<Vec<usize>>();
        for x_idx in is_int.iter() {
            if self.is_date.contains(x_idx) {
                self.is_date.retain(|v| *v != *x_idx);
            } else {
                continue;
            }
        }
        let is_date = self.is_date.into_iter().unique().collect::<Vec<usize>>();
        Self {
            is_varchar,
            is_float,
            is_int,
            is_date,
        }
    }
}