1use crate::storage::{SledStorage, Storage};
2use anyhow::Result;
3use clap::{Args, Parser, Subcommand};
4
5#[derive(Debug, Parser)]
6#[command(author, version, about)]
7pub struct Cli {
8 #[command(subcommand)]
9 pub command: Option<Command>,
10}
11
12#[derive(Debug, Subcommand)]
13pub enum Command {
14 Put(PutArgs),
16
17 Get(GetArgs),
19
20 List,
22
23 Delete(DeleteArgs),
25}
26
27#[derive(Debug, Args)]
28pub struct PutArgs {
29 key: String,
31
32 value: String, }
35
36#[derive(Debug, Args)]
37pub struct GetArgs {
38 key: String,
40}
41
42#[derive(Debug, Args)]
43pub struct DeleteArgs {
44 key: String,
46
47 #[command(flatten)]
49 delete_flags: DeleteFlags,
50}
51
52#[derive(Debug, Args)]
53#[group(required = true, multiple = false)]
54struct DeleteFlags {
55 #[arg(long, short('n'), default_value_t = true)]
57 dry_run: bool,
58
59 #[arg(long, short('f'))]
61 force: bool,
62}
63
64impl Command {
65 pub fn run(&self) -> Result<()> {
66 match self {
67 Command::Put(args) => put(args),
68 Command::Get(args) => get(args),
69 Command::List => list(),
70 Command::Delete(args) => delete(args),
71 }
72 }
73}
74
75const DEV_PATH: &str = "/tmp/sled-dev"; fn put(args: &PutArgs) -> Result<()> {
78 let storage = SledStorage::new(DEV_PATH)?;
79 storage.put(&args.key, &args.value)
80}
81
82fn get(args: &GetArgs) -> Result<()> {
83 let storage = SledStorage::new(DEV_PATH)?;
84 let result = storage.get(&args.key)?;
85 let output = match result {
86 Some(value) => format!("{value}"),
87 None => String::from("No value found"), };
89
90 println!("{output}");
91 Ok(())
92}
93
94fn list() -> Result<()> {
95 let storage = SledStorage::new(DEV_PATH)?;
96 for key in storage.list()? {
97 println!("{key}");
98 }
99 Ok(())
100}
101
102fn delete(args: &DeleteArgs) -> Result<()> {
103 if args.delete_flags.force {
104 let storage = SledStorage::new(DEV_PATH)?;
105 storage.delete(&args.key)?;
106 } else {
107 println!("would delete secret with name {}", args.key);
108 }
109 Ok(())
110}