use crate::error::{JsonnetError, Result};
use crate::pure_evaluator::PureEvaluator;
use crate::value::JsonnetValue;
use std::collections::HashMap;
use std::fs;
use std::path::Path;
pub struct Evaluator {
pure_evaluator: PureEvaluator,
tla_args: HashMap<String, String>,
ext_vars: HashMap<String, String>,
}
impl Default for Evaluator {
fn default() -> Self {
Self::new()
}
}
impl Evaluator {
pub fn new() -> Self {
Self {
pure_evaluator: PureEvaluator::new(),
tla_args: HashMap::new(),
ext_vars: HashMap::new(),
}
}
pub fn add_tla_code(&mut self, key: &str, value: &str) {
self.tla_args.insert(key.to_string(), value.to_string());
self.update_pure_evaluator();
}
pub fn add_tla_args(&mut self, args: HashMap<String, String>) {
self.tla_args.extend(args);
self.update_pure_evaluator();
}
pub fn load_ext_vars_from_file<P: AsRef<Path>>(&mut self, path: P) -> Result<()> {
let content = fs::read_to_string(path)
.map_err(|e| JsonnetError::io_error(format!("Failed to read ext vars file: {}", e)))?;
let vars: HashMap<String, String> = serde_json::from_str(&content)
.map_err(|e| JsonnetError::runtime_error(format!("Invalid ext vars JSON: {}", e)))?;
self.ext_vars.extend(vars);
self.update_pure_evaluator();
Ok(())
}
pub fn evaluate(&mut self, source: &str) -> Result<JsonnetValue> {
self.pure_evaluator.evaluate(source)
}
pub fn evaluate_file(&mut self, source: &str, _filename: &str) -> Result<JsonnetValue> {
self.evaluate(source)
}
pub fn evaluate_file_from_path<P: AsRef<Path>>(&mut self, path: P) -> Result<JsonnetValue> {
let source = fs::read_to_string(path)
.map_err(|e| JsonnetError::io_error(format!("Failed to read file: {}", e)))?;
self.evaluate(&source)
}
pub fn get_tla_args(&self) -> &HashMap<String, String> {
&self.tla_args
}
pub fn get_ext_vars(&self) -> &HashMap<String, String> {
&self.ext_vars
}
fn update_pure_evaluator(&mut self) {
self.pure_evaluator = PureEvaluator::with_config(
self.tla_args.clone(),
self.ext_vars.clone(),
);
}
}
pub mod pure {
use super::*;
pub fn evaluate(source: &str) -> Result<JsonnetValue> {
PureEvaluator::new().evaluate(source)
}
pub fn evaluate_with_tla(source: &str, tla_args: HashMap<String, String>) -> Result<JsonnetValue> {
PureEvaluator::with_tla_args(tla_args).evaluate(source)
}
}