sqlx-turso-driver 0.0.1

An asynchronous SQLx driver for embedded Turso databases
use crate::{Turso, TursoTypeInfo, TursoValue, TursoValueRef};
use sqlx_core::{
    column::{Column, ColumnIndex},
    error::Error,
    row::Row,
    value::Value,
};

#[derive(Debug, Clone)]
pub struct TursoColumn {
    pub(crate) ordinal: usize,
    pub(crate) name: String,
    pub(crate) type_info: TursoTypeInfo,
}
impl Column for TursoColumn {
    type Database = Turso;
    fn ordinal(&self) -> usize {
        self.ordinal
    }
    fn name(&self) -> &str {
        &self.name
    }
    fn type_info(&self) -> &TursoTypeInfo {
        &self.type_info
    }
}
#[derive(Debug)]
pub struct TursoRow {
    pub(crate) columns: Vec<TursoColumn>,
    pub(crate) values: Vec<TursoValue>,
}
impl TursoRow {
    pub(crate) fn from_engine(row: turso::Row, names: &[String]) -> Result<Self, Error> {
        let values = (0..row.column_count())
            .map(|index| {
                row.get_value(index)
                    .map(TursoValue)
                    .map_err(crate::error::engine_error)
            })
            .collect::<Result<Vec<_>, _>>()?;
        let columns = names
            .iter()
            .zip(&values)
            .enumerate()
            .map(|(ordinal, (name, value))| TursoColumn {
                ordinal,
                name: name.clone(),
                type_info: value.info(),
            })
            .collect();
        Ok(Self { columns, values })
    }
}
impl Row for TursoRow {
    type Database = Turso;
    fn columns(&self) -> &[TursoColumn] {
        &self.columns
    }
    fn try_get_raw<I: ColumnIndex<Self>>(&self, index: I) -> Result<TursoValueRef<'_>, Error> {
        Ok(self.values[index.index(self)?].as_ref())
    }
}
sqlx_core::impl_column_index_for_row!(TursoRow);

impl ColumnIndex<TursoRow> for &str {
    fn index(&self, row: &TursoRow) -> Result<usize, Error> {
        row.columns
            .iter()
            .position(|column| column.name == *self)
            .ok_or_else(|| Error::ColumnNotFound((*self).to_owned()))
    }
}