use crate::cursor::Cursor;
use crate::db_value::{DbValue, FromDbValue};
use crate::error::Error;
pub(crate) type RowData = Vec<Option<DbValue>>;
#[derive(Clone)]
pub struct Row {
column_values: RowData,
}
impl Row {
pub(crate) fn new(column_values: RowData) -> Row {
Row { column_values }
}
pub fn get<T>(&self, index: usize) -> Result<T, Error>
where
T: FromDbValue,
{
if index < self.column_values.len() {
<T>::from_db_value(&self.column_values[index])
} else {
Err(Error::invalid_column_index(index))
}
}
pub fn get_cursor(&mut self, index: usize) -> Result<Cursor, Error> {
if index < self.column_values.len() {
if let Some(db_value) = &mut self.column_values[index] {
match db_value {
DbValue::Cursor(cursor_opt) => {
Ok(cursor_opt.take().ok_or(Error::value_was_null())?)
}
_ => Err(Error::unsupported_conversion(
db_value.type_name(),
"cursor",
)),
}
} else {
Err(Error::value_was_null())
}
} else {
Err(Error::invalid_column_index(index))
}
}
}