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::*;