use crate::storage::{SledStorage, Storage};
use anyhow::Result;
use clap::{Args, Parser, Subcommand};
#[derive(Debug, Parser)]
#[command(author, version, about)]
pub struct Cli {
#[command(subcommand)]
pub command: Option<Command>,
}
#[derive(Debug, Subcommand)]
pub enum Command {
Put(PutArgs),
Get(GetArgs),
List,
Delete(DeleteArgs),
}
#[derive(Debug, Args)]
pub struct PutArgs {
key: String,
value: String, }
#[derive(Debug, Args)]
pub struct GetArgs {
key: String,
}
#[derive(Debug, Args)]
pub struct DeleteArgs {
key: String,
#[command(flatten)]
delete_flags: DeleteFlags,
}
#[derive(Debug, Args)]
#[group(required = true, multiple = false)]
struct DeleteFlags {
#[arg(long, short('n'), default_value_t = true)]
dry_run: bool,
#[arg(long, short('f'))]
force: bool,
}
impl Command {
pub fn run(&self) -> Result<()> {
match self {
Command::Put(args) => put(args),
Command::Get(args) => get(args),
Command::List => list(),
Command::Delete(args) => delete(args),
}
}
}
const DEV_PATH: &str = "/tmp/sled-dev";
fn put(args: &PutArgs) -> Result<()> {
let storage = SledStorage::new(DEV_PATH)?;
storage.put(&args.key, &args.value)
}
fn get(args: &GetArgs) -> Result<()> {
let storage = SledStorage::new(DEV_PATH)?;
let result = storage.get(&args.key)?;
let output = match result {
Some(value) => format!("{value}"),
None => String::from("No value found"), };
println!("{output}");
Ok(())
}
fn list() -> Result<()> {
let storage = SledStorage::new(DEV_PATH)?;
for key in storage.list()? {
println!("{key}");
}
Ok(())
}
fn delete(args: &DeleteArgs) -> Result<()> {
if args.delete_flags.force {
let storage = SledStorage::new(DEV_PATH)?;
storage.delete(&args.key)?;
} else {
println!("would delete secret with name {}", args.key);
}
Ok(())
}