greentic_runner_host/engine/
registry.rs1use 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}