mysqladm/client/commands/
drop_db.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_databases_output_status,
10            print_drop_databases_output_status_json,
11        },
12        types::MySQLDatabase,
13    },
14};
15
16#[derive(Parser, Debug, Clone)]
17pub struct DropDbArgs {
18    /// The name of the database(s) to drop
19    #[arg(num_args = 1..)]
20    name: Vec<MySQLDatabase>,
21
22    /// Print the information as JSON
23    #[arg(short, long)]
24    json: bool,
25}
26
27pub async fn drop_databases(
28    args: DropDbArgs,
29    mut server_connection: ClientToServerMessageStream,
30) -> anyhow::Result<()> {
31    if args.name.is_empty() {
32        anyhow::bail!("No database names provided");
33    }
34
35    let message = Request::DropDatabases(args.name.to_owned());
36    server_connection.send(message).await?;
37
38    let result = match server_connection.next().await {
39        Some(Ok(Response::DropDatabases(result))) => result,
40        response => return erroneous_server_response(response),
41    };
42
43    server_connection.send(Request::Exit).await?;
44
45    if args.json {
46        print_drop_databases_output_status_json(&result);
47    } else {
48        print_drop_databases_output_status(&result);
49    };
50
51    Ok(())
52}