rain_engine_core/
skill_store.rs1use 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}