mysqladm/core/protocol/commands/
drop_databases.rs

1use std::collections::BTreeMap;
2
3use serde::{Deserialize, Serialize};
4use serde_json::json;
5
6use crate::core::{
7    protocol::request_validation::{DbOrUser, NameValidationError, OwnerValidationError},
8    types::MySQLDatabase,
9};
10
11pub type DropDatabasesRequest = Vec<MySQLDatabase>;
12
13pub type DropDatabasesResponse = BTreeMap<MySQLDatabase, Result<(), DropDatabaseError>>;
14
15#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
16pub enum DropDatabaseError {
17    SanitizationError(NameValidationError),
18    OwnershipError(OwnerValidationError),
19    DatabaseDoesNotExist,
20    MySqlError(String),
21}
22
23pub 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
41pub 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
62impl 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}