rain-engine-core 0.1.0

Provider-neutral event kernel for RainEngine
Documentation
use crate::traits::SkillStore;
use crate::types::SkillManifest;
use async_trait::async_trait;
use std::collections::HashMap;
use std::sync::Arc;
use tokio::sync::RwLock;

type StoredSkill = (SkillManifest, Vec<u8>);
type SkillMap = HashMap<String, StoredSkill>;

pub struct InMemorySkillStore {
    skills: Arc<RwLock<SkillMap>>,
}

impl InMemorySkillStore {
    pub fn new() -> Self {
        Self {
            skills: Arc::new(RwLock::new(HashMap::new())),
        }
    }
}

impl Default for InMemorySkillStore {
    fn default() -> Self {
        Self::new()
    }
}

#[async_trait]
impl SkillStore for InMemorySkillStore {
    async fn store_skill(
        &self,
        manifest: SkillManifest,
        wasm_bytes: Vec<u8>,
    ) -> Result<(), String> {
        let mut skills = self.skills.write().await;
        skills.insert(manifest.name.clone(), (manifest, wasm_bytes));
        Ok(())
    }

    async fn list_skills(&self) -> Result<Vec<(SkillManifest, Vec<u8>)>, String> {
        let skills = self.skills.read().await;
        Ok(skills.values().cloned().collect())
    }

    async fn remove_skill(&self, name: &str) -> Result<(), String> {
        let mut skills = self.skills.write().await;
        skills.remove(name);
        Ok(())
    }
}