use crate::engine::error::ErrorInfo;
use crate::engine::message::{Change, Message};
use crate::engine::utils::{get_nested_value, set_nested_value};
use datalogic_rs::Engine as DatalogicEngine;
use datavalue::OwnedDataValue;
use serde_json::Value as JsonValue;
use std::sync::Arc;
pub struct TaskContext<'a> {
message: &'a mut Message,
datalogic: &'a Arc<DatalogicEngine>,
changes: Vec<Change>,
}
impl<'a> TaskContext<'a> {
pub fn new(message: &'a mut Message, datalogic: &'a Arc<DatalogicEngine>) -> Self {
Self {
message,
datalogic,
changes: Vec::new(),
}
}
#[inline]
pub fn message(&self) -> &Message {
self.message
}
#[inline]
pub fn message_mut(&mut self) -> &mut Message {
self.message
}
#[inline]
pub fn datalogic(&self) -> &Arc<DatalogicEngine> {
self.datalogic
}
#[inline]
pub fn data(&self) -> &OwnedDataValue {
self.message.data()
}
#[inline]
pub fn metadata(&self) -> &OwnedDataValue {
self.message.metadata()
}
#[inline]
pub fn temp_data(&self) -> &OwnedDataValue {
self.message.temp_data()
}
#[inline]
pub fn get(&self, path: &str) -> Option<&OwnedDataValue> {
get_nested_value(&self.message.context, path)
}
pub fn set(&mut self, path: &str, value: OwnedDataValue) {
if self.message.capture_changes {
let old_value = get_nested_value(&self.message.context, path)
.cloned()
.unwrap_or(OwnedDataValue::Null);
let new_value = value.clone();
self.changes.push(Change {
path: Arc::from(path),
old_value,
new_value,
});
}
set_nested_value(&mut self.message.context, path, value);
}
#[inline]
pub fn set_json(&mut self, path: &str, value: &JsonValue) {
self.set(path, OwnedDataValue::from(value));
}
#[inline]
pub fn add_error(&mut self, error: ErrorInfo) {
self.message.add_error(error);
}
#[inline]
pub fn into_changes(self) -> Vec<Change> {
self.changes
}
}