use serde::Serialize;
use crate::{Location, Metadata, Result, Statement, Value};
pub(crate) mod error;
mod statement;
mod value;
pub use statement::*;
pub use value::*;
pub fn to_statement<T>(value: &T) -> Result<Statement>
where
T: Serialize,
{
let meta = Metadata::new(Location::new(0, 0));
let mut serializer = StatementSerializer::new(meta);
let result = value.serialize(&mut serializer)?;
Ok(result)
}
pub fn to_value<T>(value: &T) -> Result<Value>
where
T: Serialize,
{
let meta = Metadata::new(Location::new(0, 0));
let mut serializer = ValueSerializer::new(meta);
let result = value.serialize(&mut serializer)?;
Ok(result)
}
#[cfg(test)]
mod tests {
use indexmap::IndexMap;
use serde::{Deserialize, Serialize};
use super::*;
use crate::de::from_value;
#[derive(Debug, PartialEq, Deserialize, Serialize)]
struct TestConfig {
version: String,
debug: bool,
port: u16,
timeout: f64,
}
#[derive(Debug, PartialEq, Deserialize, Serialize)]
struct DatabaseConfig {
host: String,
port: u16,
ssl: bool,
}
#[derive(Debug, PartialEq, Deserialize, Serialize)]
struct AppConfig {
app_name: String,
database: DatabaseConfig,
features: Vec<String>,
}
#[test]
fn serialize_simple_values_works_correctly() {
let value = to_value(&"test".to_string()).expect("should serialize string");
if let crate::Data::String(s) = &value.data {
assert_eq!(s, "test");
} else {
panic!("Expected string value");
}
let value = to_value(&42i32).expect("should serialize integer");
if let crate::Data::I32(n) = &value.data {
assert_eq!(*n, 42);
} else {
panic!("Expected i32 value");
}
let value = to_value(&true).expect("should serialize boolean");
if let crate::Data::Bool(b) = &value.data {
assert!(*b);
} else {
panic!("Expected boolean value");
}
let value = to_value(&3.14f64).expect("should serialize float");
if let crate::Data::F64(f) = &value.data {
assert_eq!(*f, 3.14);
} else {
panic!("Expected f64 value");
}
}
#[test]
fn serialize_array_works_correctly() {
let array = vec![
"first".to_string(),
"second".to_string(),
"third".to_string(),
];
let value = to_value(&array).expect("should serialize array");
let deserialized: Vec<String> = from_value(&value).expect("should deserialize back");
assert_eq!(deserialized, array);
}
#[test]
fn serialize_map_works_correctly() {
let mut map = IndexMap::new();
map.insert("name".to_string(), "Alice".to_string());
map.insert("age".to_string(), "30".to_string());
let value = to_value(&map).expect("should serialize map");
let deserialized: IndexMap<String, String> =
from_value(&value).expect("should deserialize back");
assert_eq!(deserialized, map);
}
#[test]
fn roundtrip_serialization_works_correctly() {
let original = AppConfig {
app_name: "TestApp".to_string(),
database: DatabaseConfig {
host: "db.example.com".to_string(),
port: 3306,
ssl: false,
},
features: vec!["feature1".to_string(), "feature2".to_string()],
};
let value = to_value(&original).expect("should serialize");
let roundtrip: AppConfig = from_value(&value).expect("should deserialize");
assert_eq!(roundtrip, original);
}
}