1
use std::collections::BTreeMap;
2

            
3
use serde::{Deserialize, Serialize};
4
use serde_json::json;
5

            
6
use crate::core::{
7
    protocol::request_validation::{DbOrUser, NameValidationError, OwnerValidationError},
8
    types::MySQLDatabase,
9
};
10

            
11
pub type CreateDatabasesRequest = Vec<MySQLDatabase>;
12

            
13
pub type CreateDatabasesResponse = BTreeMap<MySQLDatabase, Result<(), CreateDatabaseError>>;
14

            
15
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
16
pub enum CreateDatabaseError {
17
    SanitizationError(NameValidationError),
18
    OwnershipError(OwnerValidationError),
19
    DatabaseAlreadyExists,
20
    MySqlError(String),
21
}
22

            
23
pub fn print_create_databases_output_status(output: &CreateDatabasesResponse) {
24
    for (database_name, result) in output {
25
        match result {
26
            Ok(()) => {
27
                println!("Database '{}' created successfully.", database_name);
28
            }
29
            Err(err) => {
30
                println!("{}", err.to_error_message(database_name));
31
                println!("Skipping...");
32
            }
33
        }
34
        println!();
35
    }
36
}
37

            
38
pub fn print_create_databases_output_status_json(output: &CreateDatabasesResponse) {
39
    let value = output
40
        .iter()
41
        .map(|(name, result)| match result {
42
            Ok(()) => (name.to_string(), json!({ "status": "success" })),
43
            Err(err) => (
44
                name.to_string(),
45
                json!({
46
                  "status": "error",
47
                  "error": err.to_error_message(name),
48
                }),
49
            ),
50
        })
51
        .collect::<serde_json::Map<_, _>>();
52
    println!(
53
        "{}",
54
        serde_json::to_string_pretty(&value)
55
            .unwrap_or("Failed to serialize result to JSON".to_string())
56
    );
57
}
58

            
59
impl CreateDatabaseError {
60
    pub fn to_error_message(&self, database_name: &MySQLDatabase) -> String {
61
        match self {
62
            CreateDatabaseError::SanitizationError(err) => {
63
                err.to_error_message(database_name, DbOrUser::Database)
64
            }
65
            CreateDatabaseError::OwnershipError(err) => {
66
                err.to_error_message(database_name, DbOrUser::Database)
67
            }
68
            CreateDatabaseError::DatabaseAlreadyExists => {
69
                format!("Database {} already exists.", database_name)
70
            }
71
            CreateDatabaseError::MySqlError(err) => {
72
                format!("MySQL error: {}", err)
73
            }
74
        }
75
    }
76
}