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 DropDatabasesRequest = Vec<MySQLDatabase>;
12

            
13
pub type DropDatabasesResponse = BTreeMap<MySQLDatabase, Result<(), DropDatabaseError>>;
14

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

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

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

            
62
impl DropDatabaseError {
63
    pub fn to_error_message(&self, database_name: &MySQLDatabase) -> String {
64
        match self {
65
            DropDatabaseError::SanitizationError(err) => {
66
                err.to_error_message(database_name, DbOrUser::Database)
67
            }
68
            DropDatabaseError::OwnershipError(err) => {
69
                err.to_error_message(database_name, DbOrUser::Database)
70
            }
71
            DropDatabaseError::DatabaseDoesNotExist => {
72
                format!("Database {} does not exist.", database_name)
73
            }
74
            DropDatabaseError::MySqlError(err) => {
75
                format!("MySQL error: {}", err)
76
            }
77
        }
78
    }
79
}