fjall_cli/command/keyspace_command/
insert_command.rs1use 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}