use serde::{Deserialize, Serialize};
use crate::value::SqlValue;
#[derive(Clone, Debug, Default, Deserialize, PartialEq, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct SqlResult {
pub affected_rows: i64,
#[serde(default)]
pub rows: Vec<SqlRow>,
}
#[derive(Clone, Debug, Default, Deserialize, PartialEq, Serialize)]
pub struct SqlRow {
pub values: Vec<SqlColumn>,
}
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
pub struct SqlColumn {
pub name: String,
pub value: SqlValue,
}
impl SqlResult {
pub const fn affected_rows(affected_rows: i64) -> Self {
Self {
affected_rows,
rows: Vec::new(),
}
}
pub fn rows(rows: Vec<SqlRow>) -> Self {
Self {
affected_rows: 0,
rows,
}
}
}
impl SqlRow {
pub fn new(values: Vec<SqlColumn>) -> Self {
Self { values }
}
}
impl SqlColumn {
pub fn new(name: impl Into<String>, value: SqlValue) -> Self {
Self {
name: name.into(),
value,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn result_deserializes_from_existing_wire_shape() {
let result: SqlResult = serde_json::from_value(serde_json::json!({
"affectedRows": 0,
"rows": [
{
"values": [
{"name": "id", "value": {"kind": "string", "value": "abc"}}
]
}
]
}))
.unwrap();
assert_eq!(
result,
SqlResult::rows(vec![SqlRow::new(vec![SqlColumn::new(
"id",
SqlValue::String("abc".to_string()),
)])])
);
}
#[test]
fn missing_rows_default_to_empty() {
let result: SqlResult = serde_json::from_value(serde_json::json!({
"affectedRows": 1
}))
.unwrap();
assert!(result.rows.is_empty());
}
}