greentic_runner_host/engine/
registry.rs

1use super::error::GResult;
2use async_trait::async_trait;
3use serde::{Deserialize, Serialize};
4use serde_json::Value;
5use std::collections::HashMap;
6use std::sync::Arc;
7
8#[derive(Clone, Debug, Serialize, Deserialize)]
9pub struct AdapterCall {
10    pub adapter: String,
11    pub operation: String,
12    pub payload: Value,
13}
14
15#[async_trait]
16pub trait Adapter: Send + Sync {
17    async fn call(&self, call: &AdapterCall) -> GResult<Value>;
18}
19
20#[derive(Default, Clone)]
21pub struct AdapterRegistry {
22    inner: HashMap<String, Arc<dyn Adapter>>,
23}
24
25impl AdapterRegistry {
26    pub fn register(&mut self, name: impl Into<String>, adapter: Box<dyn Adapter>) {
27        self.inner.insert(name.into(), Arc::from(adapter));
28    }
29
30    pub fn register_arc(&mut self, name: impl Into<String>, adapter: Arc<dyn Adapter>) {
31        self.inner.insert(name.into(), adapter);
32    }
33
34    pub fn get(&self, name: &str) -> Option<Arc<dyn Adapter>> {
35        self.inner.get(name).cloned()
36    }
37}