use serde::Serialize;
#[derive(Debug, Clone, Serialize, PartialEq)]
#[serde(untagged)]
pub enum Value {
Null,
Bool(bool),
Int(i64),
Float(f64),
Text(String),
Bytes(Vec<u8>),
Vector(Vec<f32>),
}
#[derive(Debug, Clone, Serialize)]
pub struct Row {
pub columns: Vec<Value>,
}
impl Row {
pub fn new(columns: Vec<Value>) -> Self {
Self { columns }
}
}
#[derive(Debug, Clone)]
pub struct Column {
pub name: String,
#[allow(dead_code)]
pub data_type: DataType,
}
impl Column {
pub fn new(name: impl Into<String>, data_type: DataType) -> Self {
Self {
name: name.into(),
data_type,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[allow(dead_code)]
pub enum DataType {
Bool,
Int,
Float,
Text,
Bytes,
Vector,
}
#[allow(dead_code)]
pub enum CommandResult {
Rows {
columns: Vec<Column>,
rows: Box<dyn Iterator<Item = Row>>,
},
Message(String),
AffectedRows(usize),
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_value_null() {
let v = Value::Null;
assert_eq!(serde_json::to_string(&v).unwrap(), "null");
}
#[test]
fn test_value_bool() {
let v = Value::Bool(true);
assert_eq!(serde_json::to_string(&v).unwrap(), "true");
}
#[test]
fn test_value_int() {
let v = Value::Int(42);
assert_eq!(serde_json::to_string(&v).unwrap(), "42");
}
#[test]
fn test_value_float() {
let v = Value::Float(1.23);
assert_eq!(serde_json::to_string(&v).unwrap(), "1.23");
}
#[test]
fn test_value_text() {
let v = Value::Text("hello".to_string());
assert_eq!(serde_json::to_string(&v).unwrap(), "\"hello\"");
}
#[test]
fn test_value_bytes() {
let v = Value::Bytes(vec![1, 2, 3]);
assert_eq!(serde_json::to_string(&v).unwrap(), "[1,2,3]");
}
#[test]
fn test_value_vector() {
let v = Value::Vector(vec![1.0, 2.0, 3.0]);
assert_eq!(serde_json::to_string(&v).unwrap(), "[1.0,2.0,3.0]");
}
#[test]
fn test_row_new() {
let row = Row::new(vec![Value::Int(1), Value::Text("test".to_string())]);
assert_eq!(row.columns.len(), 2);
}
#[test]
fn test_row_serialize() {
let row = Row::new(vec![Value::Int(1), Value::Text("test".to_string())]);
let json = serde_json::to_string(&row).unwrap();
assert_eq!(json, r#"{"columns":[1,"test"]}"#);
}
#[test]
fn test_column_new() {
let col = Column::new("name", DataType::Text);
assert_eq!(col.name, "name");
assert_eq!(col.data_type, DataType::Text);
}
#[test]
fn test_data_type_equality() {
assert_eq!(DataType::Int, DataType::Int);
assert_ne!(DataType::Int, DataType::Float);
}
}