Skip to main content

fjall_cli/command/keyspace_command/
len_command.rs

1use errgonomic::{handle, handle_bool};
2use fjall::{Database, KeyspaceCreateOptions};
3use std::io;
4use std::io::Write;
5use std::process::ExitCode;
6use thiserror::Error;
7
8#[derive(clap::Parser, Clone, Debug)]
9pub struct LenCommand {}
10
11impl LenCommand {
12    pub async fn run(self, db: &Database, keyspace: impl Into<String>) -> Result<ExitCode, LenCommandRunError> {
13        use LenCommandRunError::*;
14        let keyspace = keyspace.into();
15        handle_bool!(!db.keyspace_exists(&keyspace), KeyspaceNotFound, keyspace);
16        let keyspace_handle = handle!(db.keyspace(&keyspace, KeyspaceCreateOptions::default), KeyspaceFailed, keyspace);
17        let len = handle!(keyspace_handle.len(), LenFailed, keyspace);
18        let mut stdout = io::stdout().lock();
19        handle!(writeln!(stdout, "{len}"), WriteFailed);
20        Ok(ExitCode::SUCCESS)
21    }
22}
23
24#[derive(Error, Debug)]
25pub enum LenCommandRunError {
26    #[error("keyspace '{keyspace}' not found")]
27    KeyspaceNotFound { keyspace: String },
28
29    #[error("failed to open keyspace '{keyspace}'")]
30    KeyspaceFailed { source: fjall::Error, keyspace: String },
31
32    #[error("failed to read length for keyspace '{keyspace}'")]
33    LenFailed { source: fjall::Error, keyspace: String },
34
35    #[error("failed to write keyspace length to stdout")]
36    WriteFailed { source: io::Error },
37}