use clap::Subcommand;
use crate::client;
use crate::config::ProjectConfig;
#[derive(Debug, thiserror::Error)]
pub enum Error {
#[error(transparent)]
Client(#[from] crate::client::ClientError),
}
type Result<T> = std::result::Result<T, Error>;
#[derive(Debug, clap::Args)]
pub struct CompressionArgs {
#[arg(long, env = "BOATRAMP_SERVER", global = true)]
server: Option<String>,
#[arg(long, env = "BOATRAMP_SITE", global = true)]
site: Option<String>,
#[command(subcommand)]
command: CompressionCommand,
}
#[derive(Debug, Subcommand)]
enum CompressionCommand {
Show,
On {
#[arg(long)]
min_size: Option<u64>,
},
Off,
}
#[derive(Debug, serde::Serialize)]
#[serde(tag = "result", rename_all = "snake_case")]
pub enum CompressionOutput {
Show {
site: String,
enabled: bool,
min_size: u64,
},
On { site: String, min_size: u64 },
Off { site: String },
}
impl crate::output::Rendered for CompressionOutput {
fn render_human(&self, w: &mut dyn std::io::Write) -> std::io::Result<()> {
match self {
Self::Show {
site,
enabled,
min_size,
} => {
if *enabled {
writeln!(w, "compression: on for {site} (min_size {min_size} bytes)")
} else {
writeln!(w, "compression: off for {site}")
}
}
Self::On { site, min_size } => {
writeln!(w, "compression on for {site} (min_size {min_size} bytes)")
}
Self::Off { site } => writeln!(w, "compression off for {site}"),
}
}
}
pub async fn run(args: CompressionArgs, config: &ProjectConfig) -> Result<CompressionOutput> {
let (server, site) = client::resolve_target(args.server, args.site, config)?;
let cp = client::ControlPlane::new(
server,
client::http_client(client::token(config).as_deref()),
client::resolve_project(config),
);
let mut site_config = cp.fetch_site_config(&site).await?;
let out = match args.command {
CompressionCommand::Show => {
let c = &site_config.compression;
return Ok(CompressionOutput::Show {
enabled: c.enabled,
min_size: c.min_size,
site,
});
}
CompressionCommand::On { min_size } => {
site_config.compression.enabled = true;
if let Some(n) = min_size {
site_config.compression.min_size = n;
}
CompressionOutput::On {
site: site.clone(),
min_size: site_config.compression.min_size,
}
}
CompressionCommand::Off => {
site_config.compression.enabled = false;
CompressionOutput::Off { site: site.clone() }
}
};
cp.put_site_config(&site, &site_config).await?;
Ok(out)
}