Skip to main content

fjall_cli/command/keyspace_command/
insert_command.rs

1use crate::{ByteEncoding, ByteEncodingDecodeError};
2use errgonomic::handle;
3use fjall::{Database, KeyspaceCreateOptions};
4use std::process::ExitCode;
5use thiserror::Error;
6
7#[derive(clap::Parser, Clone, Debug)]
8pub struct InsertCommand {
9    #[arg(value_name = "KEY")]
10    key: String,
11
12    #[arg(value_name = "VALUE")]
13    value: String,
14
15    #[arg(long, value_enum, default_value_t = ByteEncoding::String)]
16    key_encoding: ByteEncoding,
17
18    #[arg(long, value_enum, default_value_t = ByteEncoding::String)]
19    value_encoding: ByteEncoding,
20}
21
22impl InsertCommand {
23    pub async fn run(self, db: &Database, keyspace: impl Into<String>) -> Result<ExitCode, InsertCommandRunError> {
24        use InsertCommandRunError::*;
25        let keyspace = keyspace.into();
26        let Self {
27            key,
28            value,
29            key_encoding,
30            value_encoding,
31        } = self;
32        let key_bytes = handle!(key_encoding.decode(&key), DecodeKeyBytesFailed, key, key_encoding);
33        let value_bytes = handle!(value_encoding.decode(&value), DecodeValueBytesFailed, value, value_encoding);
34        let keyspace_handle = handle!(db.keyspace(&keyspace, KeyspaceCreateOptions::default), KeyspaceFailed, keyspace);
35        handle!(keyspace_handle.insert(key_bytes, value_bytes), InsertFailed, keyspace);
36        Ok(ExitCode::SUCCESS)
37    }
38}
39
40#[derive(Error, Debug)]
41pub enum InsertCommandRunError {
42    #[error("failed to decode key '{key}' with encoding '{key_encoding}'")]
43    DecodeKeyBytesFailed { source: ByteEncodingDecodeError, key: String, key_encoding: ByteEncoding },
44
45    #[error("failed to decode value '{value}' with encoding '{value_encoding}'")]
46    DecodeValueBytesFailed { source: ByteEncodingDecodeError, value: String, value_encoding: ByteEncoding },
47
48    #[error("failed to open keyspace '{keyspace}'")]
49    KeyspaceFailed { source: fjall::Error, keyspace: String },
50
51    #[error("failed to insert value into keyspace '{keyspace}'")]
52    InsertFailed { source: fjall::Error, keyspace: String },
53}