use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use crate::{catalog::Identifier, spec::Schema};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct CreateDatabaseRequest {
pub name: String,
pub options: HashMap<String, String>,
}
impl CreateDatabaseRequest {
pub fn new(name: String, options: HashMap<String, String>) -> Self {
Self { name, options }
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct AlterDatabaseRequest {
pub removals: Vec<String>,
pub updates: HashMap<String, String>,
}
impl AlterDatabaseRequest {
pub fn new(removals: Vec<String>, updates: HashMap<String, String>) -> Self {
Self { removals, updates }
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct RenameTableRequest {
pub source: Identifier,
pub destination: Identifier,
}
impl RenameTableRequest {
pub fn new(source: Identifier, destination: Identifier) -> Self {
Self {
source,
destination,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct CreateTableRequest {
pub identifier: Identifier,
pub schema: Schema,
}
impl CreateTableRequest {
pub fn new(identifier: Identifier, schema: Schema) -> Self {
Self { identifier, schema }
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_create_database_request_serialization() {
let mut options = HashMap::new();
options.insert("key".to_string(), "value".to_string());
let req = CreateDatabaseRequest::new("test_db".to_string(), options);
let json = serde_json::to_string(&req).unwrap();
assert!(json.contains("\"name\":\"test_db\""));
assert!(json.contains("\"options\""));
}
#[test]
fn test_alter_database_request_serialization() {
let mut updates = HashMap::new();
updates.insert("key".to_string(), "new_value".to_string());
let req = AlterDatabaseRequest::new(vec!["old_key".to_string()], updates);
let json = serde_json::to_string(&req).unwrap();
assert!(json.contains("\"removals\":[\"old_key\"]"));
assert!(json.contains("\"updates\""));
}
#[test]
fn test_rename_table_request_serialization() {
let source = Identifier::new("db1".to_string(), "table1".to_string());
let destination = Identifier::new("db2".to_string(), "table2".to_string());
let req = RenameTableRequest::new(source, destination);
let json = serde_json::to_string(&req).unwrap();
assert!(json.contains("\"source\""));
assert!(json.contains("\"destination\""));
}
}