balius-runtime 0.3.2

Runtime for run Headless dApps on UTxO-based blockchains
use std::sync::Arc;
use tokio::sync::Mutex;

use crate::wit::balius::app::kv as wit;

pub use wit::{Host as CustomKv, KvError, Payload};

#[derive(Clone)]
pub enum Kv {
    Mock,
    Custom(Arc<Mutex<dyn wit::Host + Send + Sync>>),
}

#[async_trait::async_trait]
impl wit::Host for Kv {
    async fn get_value(&mut self, key: String) -> Result<Payload, KvError> {
        match self {
            Self::Mock => todo!(),
            Self::Custom(kv) => {
                let mut lock = kv.lock().await;
                lock.get_value(key).await
            }
        }
    }

    async fn set_value(&mut self, key: String, value: Payload) -> Result<(), KvError> {
        match self {
            Self::Mock => {
                println!("{}:{}", key, hex::encode(value));
                Ok(())
            }
            Self::Custom(kv) => {
                let mut lock = kv.lock().await;
                lock.set_value(key, value).await
            }
        }
    }

    async fn list_values(&mut self, prefix: String) -> Result<Vec<String>, KvError> {
        match self {
            Self::Mock => todo!(),
            Self::Custom(kv) => {
                let mut lock = kv.lock().await;
                lock.list_values(prefix).await
            }
        }
    }
}