mysqladm/client/commands/
drop_user.rs

1use clap::Parser;
2use futures_util::SinkExt;
3use tokio_stream::StreamExt;
4
5use crate::{
6    client::commands::erroneous_server_response,
7    core::{
8        protocol::{
9            ClientToServerMessageStream, Request, Response, print_drop_users_output_status,
10            print_drop_users_output_status_json,
11        },
12        types::MySQLUser,
13    },
14};
15
16#[derive(Parser, Debug, Clone)]
17pub struct DropUserArgs {
18    #[arg(num_args = 1..)]
19    username: Vec<MySQLUser>,
20
21    /// Print the information as JSON
22    #[arg(short, long)]
23    json: bool,
24}
25
26pub async fn drop_users(
27    args: DropUserArgs,
28    mut server_connection: ClientToServerMessageStream,
29) -> anyhow::Result<()> {
30    if args.username.is_empty() {
31        anyhow::bail!("No usernames provided");
32    }
33
34    let message = Request::DropUsers(args.username.to_owned());
35
36    if let Err(err) = server_connection.send(message).await {
37        server_connection.close().await.ok();
38        anyhow::bail!(err);
39    }
40
41    let result = match server_connection.next().await {
42        Some(Ok(Response::DropUsers(result))) => result,
43        response => return erroneous_server_response(response),
44    };
45
46    server_connection.send(Request::Exit).await?;
47
48    if args.json {
49        print_drop_users_output_status_json(&result);
50    } else {
51        print_drop_users_output_status(&result);
52    }
53
54    Ok(())
55}