1
use std::collections::BTreeMap;
2

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

            
7
use crate::core::{
8
    protocol::request_validation::ValidationError,
9
    types::{DbOrUser, MySQLDatabase},
10
};
11

            
12
pub type DropDatabasesRequest = Vec<MySQLDatabase>;
13

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

            
16
#[derive(Error, Debug, Clone, PartialEq, Serialize, Deserialize)]
17
pub enum DropDatabaseError {
18
    #[error("Validation error: {0}")]
19
    ValidationError(#[from] ValidationError),
20

            
21
    #[error("Database does not exist")]
22
    DatabaseDoesNotExist,
23

            
24
    #[error("MySQL error: {0}")]
25
    MySqlError(String),
26
}
27

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

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

            
68
impl DropDatabaseError {
69
    #[must_use]
70
    pub fn to_error_message(&self, database_name: &MySQLDatabase) -> String {
71
        match self {
72
            DropDatabaseError::ValidationError(err) => {
73
                err.to_error_message(&DbOrUser::Database(database_name.clone()))
74
            }
75
            DropDatabaseError::DatabaseDoesNotExist => {
76
                format!("Database {database_name} does not exist.")
77
            }
78
            DropDatabaseError::MySqlError(err) => {
79
                format!("MySQL error: {err}")
80
            }
81
        }
82
    }
83

            
84
    #[must_use]
85
    pub fn error_type(&self) -> String {
86
        match self {
87
            DropDatabaseError::ValidationError(err) => err.error_type(),
88
            DropDatabaseError::DatabaseDoesNotExist => "database-does-not-exist".to_string(),
89
            DropDatabaseError::MySqlError(_) => "mysql-error".to_string(),
90
        }
91
    }
92
}