use crate::client::Client;
use crate::output::Output;
use clap::Subcommand;
use serde_json::json;
#[derive(Subcommand, Debug, Clone)]
pub enum ExtensionCommand {
List,
Enable { name: String },
Disable { name: String },
Purge {
name: String,
#[arg(long)]
yes: bool,
},
Install { name: String },
}
pub(crate) async fn extension(
c: ExtensionCommand,
out: &Output,
client: &Client,
) -> anyhow::Result<()> {
match c {
ExtensionCommand::List => {
let res = client.get("/api/v1/extensions").await?;
out.data(res, "extensions")
}
ExtensionCommand::Enable { name } => {
let res = client
.post_raw(&format!("/api/v1/extensions/{name}/enable"), json!({}))
.await?;
out.data(res, "extension enabled")
}
ExtensionCommand::Disable { name } => {
let res = client
.post_raw(&format!("/api/v1/extensions/{name}/disable"), json!({}))
.await?;
out.data(res, "extension disabled")
}
ExtensionCommand::Purge { name, yes } => {
if !yes {
anyhow::bail!(
"purge is destructive — pass --yes to confirm (drops tables + removes media for '{name}')"
);
}
let res = client.delete(&format!("/api/v1/extensions/{name}")).await?;
out.data(res, "extension purged")
}
ExtensionCommand::Install { name } => {
let res = client
.post_raw("/api/v1/extensions/install", json!({ "name": name }))
.await?;
out.data(res, "extension install")
}
}
}