use crate::schema::TableSchema;
use crate::Value;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Row {
values: Vec<Value>,
}
impl Row {
pub fn new(values: Vec<Value>) -> Self {
Self { values }
}
pub fn get(&self, index: usize) -> Option<&Value> {
self.values.get(index)
}
pub fn get_named(&self, schema: &TableSchema, name: &str) -> Option<&Value> {
schema
.column_index(name)
.and_then(|index| self.values.get(index))
}
pub fn values(&self) -> &[Value] {
&self.values
}
pub fn into_values(self) -> Vec<Value> {
self.values
}
pub fn len(&self) -> usize {
self.values.len()
}
pub fn is_empty(&self) -> bool {
self.values.is_empty()
}
pub fn iter(&self) -> std::slice::Iter<'_, Value> {
self.values.iter()
}
}
impl From<Vec<Value>> for Row {
fn from(values: Vec<Value>) -> Self {
Self::new(values)
}
}
impl From<Row> for Vec<Value> {
fn from(row: Row) -> Self {
row.values
}
}
#[macro_export]
macro_rules! row {
($($value:expr),* $(,)?) => {
$crate::Row::new(::std::vec![$(::std::convert::Into::into($value)),*])
};
}
#[cfg(test)]
mod tests {
use super::*;
use crate::{ColumnType, TableSchema};
fn schema() -> TableSchema {
TableSchema::builder("players")
.column("id", ColumnType::U64)
.column("zone_id", ColumnType::U64)
.column("health", ColumnType::I32)
.build()
.unwrap()
}
#[test]
fn builds_from_values() {
let row = Row::new(vec![Value::U64(1), Value::U64(10), Value::I32(100)]);
assert_eq!(row.len(), 3);
assert!(!row.is_empty());
assert_eq!(row.get(0), Some(&Value::U64(1)));
assert_eq!(row.get(9), None);
}
#[test]
fn converts_from_vec_and_back() {
let values = vec![Value::U64(1)];
let row: Row = values.clone().into();
assert_eq!(row.clone().into_values(), values);
assert_eq!(row.iter().count(), 1);
}
#[test]
fn gets_named_columns_through_schema() {
let schema = schema();
let row = row![1u64, 10u64, 100i32];
assert_eq!(row.get_named(&schema, "health"), Some(&Value::I32(100)));
assert_eq!(row.get_named(&schema, "missing"), None);
}
#[test]
fn row_macro_converts_types() {
let row = row![true, 10u64, 3.5f64];
assert_eq!(row.values(), &[Value::Bool(true), Value::U64(10), Value::F64(3.5)]);
}
}