use anyhow::Result;
use clap::{Args, Subcommand};
use super::proxy::StoreProxy;
#[derive(Args)]
pub struct ConfigArgs {
#[command(subcommand)]
pub command: ConfigCommand,
}
const CONFIG_KEYS: &[&str] = &["audit.write_durability", "enforcement.retention"];
#[derive(Subcommand)]
pub enum ConfigCommand {
Get {
key: String,
},
Set {
key: String,
value: String,
},
Dump,
}
pub async fn run(args: ConfigArgs) -> Result<()> {
let cwd = std::env::current_dir()?;
let proxy = StoreProxy::open(&cwd).await?;
let result = match args.command {
ConfigCommand::Get { ref key } => run_get(&proxy, key).await,
ConfigCommand::Set { ref key, ref value } => run_set(&proxy, key, value).await,
ConfigCommand::Dump => run_dump(&proxy).await,
};
proxy.close().await?;
result
}
async fn run_get(proxy: &StoreProxy, key: &str) -> Result<()> {
let value = proxy.config_get(key).await?;
println!("{value}");
Ok(())
}
async fn run_dump(proxy: &StoreProxy) -> Result<()> {
for key in CONFIG_KEYS {
match proxy.config_get(key).await {
Ok(value) => println!("{key} = {value}"),
Err(e) => println!("{key} = <unavailable: {e}>"),
}
}
Ok(())
}
async fn run_set(proxy: &StoreProxy, key: &str, value: &str) -> Result<()> {
let old = proxy.config_set(key, value).await?;
match key {
"audit.write_durability" => {
if old == value {
println!("audit.write_durability is already {value}");
} else if old.is_empty() {
println!("audit.write_durability: {value}");
} else {
println!("audit.write_durability: {old} → {value}");
}
}
"enforcement.retention" => {
println!("enforcement.retention: {value} days");
}
_ => {}
}
Ok(())
}