use std::collections::BTreeMap;
use pointlock_expr::Scope;
use pointlock_ir::VerdictStatus;
use serde_json::{Map, Value};
pub(crate) struct ScopeSeed {
params: Map<String, Value>,
env: Vec<(String, Value)>,
}
impl ScopeSeed {
pub fn new(
params: Map<String, Value>,
device_id: &str,
platform: Option<&str>,
run_id: &str,
) -> Self {
let mut env = vec![
("deviceId".to_owned(), Value::String(device_id.to_owned())),
("runId".to_owned(), Value::String(run_id.to_owned())),
];
if let Some(platform) = platform {
env.push(("platform".to_owned(), Value::String(platform.to_owned())));
}
ScopeSeed { params, env }
}
pub fn scope(
&self,
outputs: &BTreeMap<String, Value>,
verdicts: &BTreeMap<String, (VerdictStatus, bool)>,
self_binding: Option<(&str, &Value)>,
) -> Scope {
let mut scope = Scope::new();
for (name, value) in &self.params {
scope.set_param(name.clone(), value.clone());
}
for (name, value) in &self.env {
scope.set_env(name.clone(), value.clone());
}
for (step_id, output) in outputs {
scope.set_step_output(step_id.clone(), output.clone());
}
for (step_id, (status, _degraded)) in verdicts {
let status = serde_json::to_value(status).expect("VerdictStatus serializes");
scope.set_step_verdict(step_id.clone(), status);
}
if let Some((step_id, value)) = self_binding {
scope.set_step_output(step_id.to_owned(), value.clone());
}
scope
}
}