Skip to main content

fjall_cli/
command.rs

1use errgonomic::{handle, map_err};
2use fjall::Database;
3use std::path::PathBuf;
4use std::process::ExitCode;
5use thiserror::Error;
6
7use Subcommand::*;
8
9#[derive(clap::Parser, Debug)]
10#[command(author, version, about, propagate_version = true)]
11pub struct Command {
12    #[arg(long, env = "FJALL_DB")]
13    db: PathBuf,
14
15    #[command(subcommand)]
16    subcommand: Subcommand,
17}
18
19#[derive(clap::Subcommand, Clone, Debug)]
20pub enum Subcommand {
21    Keyspace(KeyspaceCommand),
22    ListKeyspaceNames(ListKeyspaceNamesCommand),
23    KeyspaceCount(KeyspaceCountCommand),
24}
25
26impl Command {
27    pub async fn run(self) -> Result<ExitCode, CommandRunError> {
28        use CommandRunError::*;
29        let Self {
30            db: path,
31            subcommand,
32        } = self;
33        let db = handle!(Database::builder(&path).open(), OpenFailed, path);
34        map_err!(subcommand.run(&db).await, RunFailed)
35    }
36}
37
38impl Subcommand {
39    pub async fn run(self, db: &Database) -> Result<ExitCode, SubcommandRunError> {
40        use SubcommandRunError::*;
41        match self {
42            Keyspace(command) => map_err!(command.run(db).await, RunKeyspaceCommandFailed),
43            ListKeyspaceNames(command) => map_err!(command.run(db).await, RunListKeyspaceNamesCommandFailed),
44            KeyspaceCount(command) => map_err!(command.run(db).await, RunKeyspaceCountCommandFailed),
45        }
46    }
47}
48
49#[derive(Error, Debug)]
50pub enum CommandRunError {
51    #[error("failed to open database at '{path}'")]
52    OpenFailed { source: fjall::Error, path: PathBuf },
53
54    #[error("failed to run command")]
55    RunFailed { source: SubcommandRunError },
56}
57
58#[derive(Error, Debug)]
59pub enum SubcommandRunError {
60    #[error("failed to run keyspace command")]
61    RunKeyspaceCommandFailed { source: KeyspaceCommandRunError },
62
63    #[error("failed to run list-keyspace-names command")]
64    RunListKeyspaceNamesCommandFailed { source: ListKeyspaceNamesCommandRunError },
65
66    #[error("failed to run keyspace-count command")]
67    RunKeyspaceCountCommandFailed { source: KeyspaceCountCommandRunError },
68}
69
70mod keyspace_command;
71
72pub use keyspace_command::*;
73
74mod list_keyspace_names_command;
75
76pub use list_keyspace_names_command::*;
77
78mod keyspace_count_command;
79
80pub use keyspace_count_command::*;