use std::sync::Arc;
use sim_kernel::{CapabilityName, Cx, Expr, Result, Symbol, Value};
use sim_lib_server::ServerAddress;
use crate::{
ComponentKind, ModelRunner, components::AgentComponent, components::ComponentBackend,
components::RunnerBackend, components::component_value, installed_codecs,
};
pub struct ExternalRunnerSpec {
pub symbol: Symbol,
pub model: String,
pub capabilities: Vec<CapabilityName>,
pub spec: Vec<(Symbol, Expr)>,
pub runner: Arc<dyn ModelRunner>,
}
pub fn external_runner_value(cx: &mut Cx, spec: ExternalRunnerSpec) -> Result<Value> {
let mut component_spec = vec![
(
Symbol::new("backend"),
Expr::Symbol(Symbol::new("external")),
),
(Symbol::new("model"), Expr::String(spec.model)),
];
component_spec.extend(spec.spec);
component_value(
cx,
AgentComponent {
symbol: spec.symbol,
kind: ComponentKind::Runner,
capabilities: spec.capabilities,
address: ServerAddress::Local,
codecs: installed_codecs(cx),
spec: component_spec,
backend: ComponentBackend::Runner(RunnerBackend::External {
runner: spec.runner,
}),
},
)
}