use std::collections::HashMap;
use arora_behavior::interpreter_module::{
HALT, HALT_ARG, SPAWN, SPAWN_CALL_ARG, SPAWN_GRAPH, SPAWN_GRAPH_GRAPH_ARG,
SPAWN_GRAPH_POLICY_ARG, SPAWN_GRAPH_TYPE_ARG, SPAWN_GRAPH_VERSION_ARG, SPAWN_POLICY_ARG,
};
use arora_behavior::TaskId;
use arora_types::record::module::frozen::{Function, Parameter};
use arora_types::record::ty::{FrozenScalar, FrozenTy, PrimitiveKind};
use arora_types::record::{FrozenReference, Version};
use arora_types::{AroraType, SemanticVersion, Uuid};
pub(crate) fn all() -> Vec<(Uuid, &'static str, Function)> {
let string = || FrozenTy::from(PrimitiveKind::String);
vec![
(
SPAWN,
"spawn",
signature(
&[
(SPAWN_CALL_ARG, "call", dynamic()),
(SPAWN_POLICY_ARG, "policy", string()),
],
dynamic(),
),
),
(
SPAWN_GRAPH,
"spawn_graph",
signature(
&[
(SPAWN_GRAPH_TYPE_ARG, "graph_type", string()),
(SPAWN_GRAPH_VERSION_ARG, "graph_version", string()),
(SPAWN_GRAPH_GRAPH_ARG, "graph", dynamic()),
(SPAWN_GRAPH_POLICY_ARG, "policy", string()),
],
dynamic(),
),
),
(
HALT,
"halt",
signature(
&[(HALT_ARG, "task", task_id())],
FrozenTy::from(PrimitiveKind::Unit),
),
),
]
}
fn signature(parameters: &[(Uuid, &str, FrozenTy)], return_ty: FrozenTy) -> Function {
Function {
parameters: parameters
.iter()
.map(|(id, name, ty)| {
(
*id,
Parameter {
name: name.to_string(),
ty: ty.clone(),
mutable: false,
},
)
})
.collect::<HashMap<_, _>>(),
parameter_ordering: parameters.iter().map(|(id, _, _)| *id).collect(),
return_ty,
}
}
fn task_id() -> FrozenTy {
FrozenTy::FrozenScalar(FrozenScalar {
reference: FrozenReference {
id: TaskId::arora_type_id(),
version: TaskId::arora_type_version(),
},
})
}
fn dynamic() -> FrozenTy {
FrozenTy::FrozenScalar(FrozenScalar {
reference: FrozenReference {
id: *arora_types::ty::KEY_VALUE_ID,
version: Version::from(SemanticVersion {
major: 1,
minor: 0,
patch: 0,
}),
},
})
}