use serde::{Deserialize, Serialize};
use serde_json::Value;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ExplainResult {
pub rule_name: String,
pub rule_version: Option<String>,
pub rule_tags: Vec<String>,
pub logic_snapshot: Value,
pub context_snapshot: Value,
pub result: Value,
pub evaluated_at: String,
pub engine: String,
}
impl ExplainResult {
pub(crate) fn new(
rule_name: String,
rule_version: Option<String>,
rule_tags: Vec<String>,
logic_snapshot: Value,
context_snapshot: Value,
result: Value,
) -> Self {
Self {
rule_name,
rule_version,
rule_tags,
logic_snapshot,
context_snapshot,
result,
evaluated_at: chrono_like_now(),
engine: format!("tempus-engine@{}", env!("CARGO_PKG_VERSION")),
}
}
}
fn chrono_like_now() -> String {
use std::time::{SystemTime, UNIX_EPOCH};
let secs = SystemTime::now()
.duration_since(UNIX_EPOCH)
.map(|d| d.as_secs())
.unwrap_or(0);
let s = secs % 60;
let m = (secs / 60) % 60;
let h = (secs / 3600) % 24;
let days = secs / 86400;
let year = 1970 + days / 365;
let day_of_year = days % 365;
let month = day_of_year / 30 + 1;
let day = day_of_year % 30 + 1;
format!(
"{:04}-{:02}-{:02}T{:02}:{:02}:{:02}Z",
year, month, day, h, m, s
)
}