Skip to main content

rain_engine_core/
skill_store.rs

1use crate::traits::SkillStore;
2use crate::types::SkillManifest;
3use async_trait::async_trait;
4use std::collections::HashMap;
5use std::sync::Arc;
6use tokio::sync::RwLock;
7
8type StoredSkill = (SkillManifest, Vec<u8>);
9type SkillMap = HashMap<String, StoredSkill>;
10
11pub struct InMemorySkillStore {
12    skills: Arc<RwLock<SkillMap>>,
13}
14
15impl InMemorySkillStore {
16    pub fn new() -> Self {
17        Self {
18            skills: Arc::new(RwLock::new(HashMap::new())),
19        }
20    }
21}
22
23impl Default for InMemorySkillStore {
24    fn default() -> Self {
25        Self::new()
26    }
27}
28
29#[async_trait]
30impl SkillStore for InMemorySkillStore {
31    async fn store_skill(
32        &self,
33        manifest: SkillManifest,
34        wasm_bytes: Vec<u8>,
35    ) -> Result<(), String> {
36        let mut skills = self.skills.write().await;
37        skills.insert(manifest.name.clone(), (manifest, wasm_bytes));
38        Ok(())
39    }
40
41    async fn list_skills(&self) -> Result<Vec<(SkillManifest, Vec<u8>)>, String> {
42        let skills = self.skills.read().await;
43        Ok(skills.values().cloned().collect())
44    }
45
46    async fn remove_skill(&self, name: &str) -> Result<(), String> {
47        let mut skills = self.skills.write().await;
48        skills.remove(name);
49        Ok(())
50    }
51}