1
use crate::core::{
2
    protocol::{
3
        CreateDatabaseError, CreateUserError, DropDatabaseError, DropUserError,
4
        ListPrivilegesError, ListUsersError, request_validation::ValidationError,
5
    },
6
    types::DbOrUser,
7
};
8

            
9
pub fn name_validation_error_to_error_message(db_or_user: &DbOrUser) -> String {
10
    let argv0 = std::env::args().next().unwrap_or_else(|| match db_or_user {
11
        DbOrUser::Database(_) => "mysql-dbadm".to_string(),
12
        DbOrUser::User(_) => "mysql-useradm".to_string(),
13
    });
14

            
15
    format!(
16
        concat!(
17
            "{}: {} name '{}' contains invalid characters.\n",
18
            "Only A-Z, a-z, 0-9, _ (underscore) and - (dash) permitted. Skipping.",
19
        ),
20
        argv0,
21
        db_or_user.capitalized_noun(),
22
        db_or_user.name(),
23
    )
24
}
25

            
26
pub fn authorization_error_message(db_or_user: &DbOrUser) -> String {
27
    format!(
28
        "You are not in charge of mysql-{}: '{}'.  Skipping.",
29
        db_or_user.lowercased_noun(),
30
        db_or_user.name(),
31
    )
32
}
33

            
34
pub fn handle_create_user_error(error: &CreateUserError, name: &str) {
35
    let argv0 = std::env::args()
36
        .next()
37
        .unwrap_or_else(|| "mysql-useradm".to_string());
38
    match error {
39
        CreateUserError::ValidationError(ValidationError::NameValidationError(_)) => {
40
            eprintln!(
41
                "{}",
42
                name_validation_error_to_error_message(&DbOrUser::User(name.into()))
43
            );
44
        }
45
        CreateUserError::ValidationError(ValidationError::AuthorizationError(_)) => {
46
            eprintln!(
47
                "{}",
48
                authorization_error_message(&DbOrUser::User(name.into()))
49
            );
50
        }
51
        CreateUserError::MySqlError(_) | CreateUserError::UserAlreadyExists => {
52
            eprintln!("{argv0}: Failed to create user '{name}'.");
53
        }
54
    }
55
}
56

            
57
pub fn handle_drop_user_error(error: &DropUserError, name: &str) {
58
    let argv0 = std::env::args()
59
        .next()
60
        .unwrap_or_else(|| "mysql-useradm".to_string());
61
    match error {
62
        DropUserError::ValidationError(ValidationError::NameValidationError(_)) => {
63
            eprintln!(
64
                "{}",
65
                name_validation_error_to_error_message(&DbOrUser::User(name.into()))
66
            );
67
        }
68
        DropUserError::ValidationError(ValidationError::AuthorizationError(_)) => {
69
            eprintln!(
70
                "{}",
71
                authorization_error_message(&DbOrUser::User(name.into()))
72
            );
73
        }
74
        DropUserError::MySqlError(_) | DropUserError::UserDoesNotExist => {
75
            eprintln!("{argv0}: Failed to delete user '{name}'.");
76
        }
77
    }
78
}
79

            
80
pub fn handle_list_users_error(error: &ListUsersError, name: &str) {
81
    let argv0 = std::env::args()
82
        .next()
83
        .unwrap_or_else(|| "mysql-useradm".to_string());
84
    match error {
85
        ListUsersError::ValidationError(ValidationError::NameValidationError(_)) => {
86
            eprintln!(
87
                "{}",
88
                name_validation_error_to_error_message(&DbOrUser::User(name.into()))
89
            );
90
        }
91
        ListUsersError::ValidationError(ValidationError::AuthorizationError(_)) => {
92
            eprintln!(
93
                "{}",
94
                authorization_error_message(&DbOrUser::User(name.into()))
95
            );
96
        }
97
        ListUsersError::UserDoesNotExist => {
98
            eprintln!("{argv0}: User '{name}' does not exist. You must create it first.",);
99
        }
100
        ListUsersError::MySqlError(_) => {
101
            eprintln!("{argv0}: Failed to look up password for user '{name}'");
102
        }
103
    }
104
}
105

            
106
// ----------------------------------------------------------------------------
107

            
108
pub fn handle_create_database_error(error: &CreateDatabaseError, name: &str) {
109
    let argv0 = std::env::args()
110
        .next()
111
        .unwrap_or_else(|| "mysql-dbadm".to_string());
112
    match error {
113
        CreateDatabaseError::ValidationError(ValidationError::NameValidationError(_)) => {
114
            eprintln!(
115
                "{}",
116
                name_validation_error_to_error_message(&DbOrUser::Database(name.into()))
117
            );
118
        }
119

            
120
        CreateDatabaseError::ValidationError(ValidationError::AuthorizationError(_)) => {
121
            eprintln!(
122
                "{}",
123
                authorization_error_message(&DbOrUser::Database(name.into()))
124
            );
125
        }
126
        CreateDatabaseError::MySqlError(_) => {
127
            eprintln!("{argv0}: Cannot create database '{name}'.");
128
        }
129
        CreateDatabaseError::DatabaseAlreadyExists => {
130
            eprintln!("{argv0}: Database '{name}' already exists.");
131
        }
132
    }
133
}
134

            
135
pub fn handle_drop_database_error(error: &DropDatabaseError, name: &str) {
136
    let argv0 = std::env::args()
137
        .next()
138
        .unwrap_or_else(|| "mysql-dbadm".to_string());
139
    match error {
140
        DropDatabaseError::ValidationError(ValidationError::NameValidationError(_)) => {
141
            eprintln!(
142
                "{}",
143
                name_validation_error_to_error_message(&DbOrUser::Database(name.into()))
144
            );
145
        }
146
        DropDatabaseError::ValidationError(ValidationError::AuthorizationError(_)) => {
147
            eprintln!(
148
                "{}",
149
                authorization_error_message(&DbOrUser::Database(name.into()))
150
            );
151
        }
152
        DropDatabaseError::MySqlError(_) => {
153
            eprintln!("{argv0}: Cannot drop database '{name}'.");
154
        }
155
        DropDatabaseError::DatabaseDoesNotExist => {
156
            eprintln!("{argv0}: Database '{name}' doesn't exist.");
157
        }
158
    }
159
}
160

            
161
pub fn format_show_database_error_message(error: &ListPrivilegesError, name: &str) -> String {
162
    let argv0 = std::env::args()
163
        .next()
164
        .unwrap_or_else(|| "mysql-dbadm".to_string());
165

            
166
    match error {
167
        ListPrivilegesError::ValidationError(ValidationError::NameValidationError(_)) => {
168
            name_validation_error_to_error_message(&DbOrUser::Database(name.into()))
169
        }
170
        ListPrivilegesError::ValidationError(ValidationError::AuthorizationError(_)) => {
171
            authorization_error_message(&DbOrUser::Database(name.into()))
172
        }
173
        ListPrivilegesError::MySqlError(err) => {
174
            format!("{argv0}: Failed to look up privileges for database '{name}': {err}")
175
        }
176
        ListPrivilegesError::DatabaseDoesNotExist => {
177
            format!("{argv0}: Database '{name}' doesn't exist.")
178
        }
179
    }
180
}