1use std::sync::Arc;
2use tokio::sync::Mutex;
3
4use crate::wit::balius::app::kv as wit;
5
6pub use wit::{Host as CustomKv, KvError, Payload};
7
8#[derive(Clone)]
9pub enum Kv {
10 Mock,
11 Custom(Arc<Mutex<dyn wit::Host + Send + Sync>>),
12}
13
14#[async_trait::async_trait]
15impl wit::Host for Kv {
16 async fn get_value(&mut self, key: String) -> Result<Payload, KvError> {
17 match self {
18 Self::Mock => todo!(),
19 Self::Custom(kv) => {
20 let mut lock = kv.lock().await;
21 lock.get_value(key).await
22 }
23 }
24 }
25
26 async fn set_value(&mut self, key: String, value: Payload) -> Result<(), KvError> {
27 match self {
28 Self::Mock => {
29 println!("{}:{}", key, hex::encode(value));
30 Ok(())
31 }
32 Self::Custom(kv) => {
33 let mut lock = kv.lock().await;
34 lock.set_value(key, value).await
35 }
36 }
37 }
38
39 async fn list_values(&mut self, prefix: String) -> Result<Vec<String>, KvError> {
40 match self {
41 Self::Mock => todo!(),
42 Self::Custom(kv) => {
43 let mut lock = kv.lock().await;
44 lock.list_values(prefix).await
45 }
46 }
47 }
48}