1pub mod command;
7pub mod error;
8pub mod protocol;
9
10use std::{future::Future, marker::PhantomData};
11
12use crux_core::{Command, Request, command::RequestBuilder};
13
14pub use error::*;
15pub use protocol::*;
16
17pub struct KeyValue<Effect, Event> {
18 effect: PhantomData<Effect>,
20 event: PhantomData<Event>,
21}
22
23impl<Effect, Event> KeyValue<Effect, Event>
24where
25 Effect: Send + From<Request<KeyValueOperation>> + 'static,
26 Event: Send + 'static,
27{
28 pub fn get(
30 key: impl Into<String>,
31 ) -> RequestBuilder<Effect, Event, impl Future<Output = DataResult>> {
32 Command::request_from_shell(KeyValueOperation::Get { key: key.into() })
33 .map(KeyValueResult::unwrap_get)
34 }
35
36 pub fn set(
39 key: impl Into<String>,
40 value: Vec<u8>,
41 ) -> RequestBuilder<Effect, Event, impl Future<Output = DataResult>> {
42 Command::request_from_shell(KeyValueOperation::Set {
43 key: key.into(),
44 value,
45 })
46 .map(KeyValueResult::unwrap_set)
47 }
48
49 pub fn delete(
51 key: impl Into<String>,
52 ) -> RequestBuilder<Effect, Event, impl Future<Output = DataResult>> {
53 Command::request_from_shell(KeyValueOperation::Delete { key: key.into() })
54 .map(KeyValueResult::unwrap_delete)
55 }
56
57 pub fn exists(
59 key: impl Into<String>,
60 ) -> RequestBuilder<Effect, Event, impl Future<Output = StatusResult>> {
61 Command::request_from_shell(KeyValueOperation::Exists { key: key.into() })
62 .map(KeyValueResult::unwrap_exists)
63 }
64
65 pub fn list_keys(
75 prefix: impl Into<String>,
76 cursor: u64,
77 ) -> RequestBuilder<Effect, Event, impl Future<Output = ListResult>> {
78 Command::request_from_shell(KeyValueOperation::ListKeys {
79 prefix: prefix.into(),
80 cursor,
81 })
82 .map(KeyValueResult::unwrap_list_keys)
83 }
84}
85
86#[cfg(test)]
87mod tests;