use crate::step::TaskStep;
use crate::task::{JobInstanceState, Task, TaskStepState};
use crate::workflow::Workflow;
use crate::workflow_instance::WorkflowInstance;
use anyhow::*;
use rion::Rion;
use serde::{Deserialize, Serialize};
use serde_json::{json, Value};
use std::collections::HashMap;
#[derive(PartialEq, Eq, Serialize, Deserialize, Clone, Debug, Default)]
pub struct JobTaskContext {
pub current_state: TaskStepState,
pub state: JobInstanceState,
}
pub fn resolve_variables(template: &str, ctx: TaskContext) -> Result<String> {
let result = Rion::resolve_var_str(template, &ctx)?;
Ok(result)
}
pub fn extract_step_input<T>(properties: &Value) -> Result<T>
where
T: serde::de::DeserializeOwned,
{
let value = serde_json::from_value::<HashMap<String, Value>>(properties.clone())?;
let d = json!({});
let raw_input = value.get("input").unwrap_or(&d).clone();
let input = serde_json::from_value::<T>(raw_input)?;
Ok(input)
}
pub fn extract_step_output<T>(properties: &Value) -> Result<T>
where
T: serde::de::DeserializeOwned,
{
let value = serde_json::from_value::<HashMap<String, Value>>(properties.clone())?;
let d = json!({});
let raw_input = value.get("output").unwrap_or(&d).clone();
let output = serde_json::from_value::<T>(raw_input)?;
Ok(output)
}
pub fn convert_step_property<T>(value: &Value) -> Result<T>
where
T: serde::de::DeserializeOwned,
{
let output = serde_json::from_value::<T>(value.clone())?;
Ok(output)
}
pub fn extract_step_input_output<I, O>(properties: &Value) -> Result<(I, O)>
where
I: serde::de::DeserializeOwned,
O: serde::de::DeserializeOwned,
{
let output = extract_step_output::<O>(properties)?;
let input = extract_step_input::<I>(properties)?;
Ok((input, output))
}
#[derive(PartialEq, Eq, Serialize, Deserialize, Clone, Debug)]
pub struct TaskContext {
pub previous_task_id: Option<String>,
pub current_task_id: Option<String>,
pub next_task_id: Option<String>,
pub steps: HashMap<String, TaskStepState>,
pub env: HashMap<String, String>,
pub input: HashMap<String, Value>,
pub job: WorkflowInstance,
pub step: TaskStep,
pub workflow: Workflow,
pub task: Task,
}
impl TaskContext {
pub fn to_json(&self) -> Value {
serde_json::to_value(self.clone()).unwrap_or_default()
}
pub fn resolve_variables(&self, template: String) -> Result<String> {
resolve_variables(template.as_str(), self.clone())
}
pub fn resolve_input_variables<T>(&self, template: HashMap<String, Value>) -> Result<T>
where
T: Serialize + serde::de::DeserializeOwned,
{
let j_str = serde_json::to_string::<HashMap<String, Value>>(&template)?;
let val = Rion::resolve_var_str(j_str.as_str(), &self.clone())?;
let output = serde_json::from_str::<T>(val.as_str())?;
Ok(output)
}
pub fn value_to_output<T>(value: T) -> Result<HashMap<String, Value>>
where
T: Serialize + serde::de::DeserializeOwned,
{
let raw_value = serde_json::to_value(value)?;
let output = serde_json::from_value::<HashMap<String, Value>>(raw_value)?;
Ok(output)
}
}