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()))
}
}