use std::sync::Arc;
use crate::error::OrmError;
use crate::value::{FromValue, Value};
#[derive(Debug, Clone)]
pub struct Row {
columns: Arc<[String]>,
values: Vec<Value>,
}
impl Row {
pub fn new(columns: Vec<String>, values: Vec<Value>) -> Self {
Self {
columns: Arc::from(columns),
values,
}
}
pub fn with_columns(columns: Arc<[String]>, values: Vec<Value>) -> Self {
Self { columns, values }
}
pub fn columns(&self) -> Arc<[String]> {
Arc::clone(&self.columns)
}
pub fn len(&self) -> usize {
self.values.len()
}
pub fn is_empty(&self) -> bool {
self.values.is_empty()
}
pub fn value_at(&self, index: usize) -> Option<&Value> {
self.values.get(index)
}
pub fn index_of(&self, name: &str) -> Option<usize> {
self.columns.iter().position(|column| column == name)
}
pub fn get<T: FromValue>(&self, name: &str) -> crate::Result<T> {
let index = self
.index_of(name)
.ok_or_else(|| OrmError::conversion(format!("no column named `{name}` in row")))?;
self.get_index(index)
}
pub fn get_index<T: FromValue>(&self, index: usize) -> crate::Result<T> {
let value = self
.values
.get(index)
.ok_or_else(|| OrmError::conversion(format!("column index {index} out of range")))?
.clone();
T::from_value(value)
}
}