use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use crate::error::WyrdError;
use super::ids::{RecordId, SessionId, SpanId, TraceId};
use super::media::MediaRef;
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, schemars::JsonSchema)]
#[serde(deny_unknown_fields)]
pub struct EvalRecordObservation {
pub record_id: RecordId,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub session_id: Option<SessionId>,
pub context: serde_json::Value,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub trace_id: Option<TraceId>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub span_id: Option<SpanId>,
pub created_at: DateTime<Utc>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub media: Option<Vec<MediaRef>>,
}
impl EvalRecordObservation {
pub fn validate(&self) -> Result<(), WyrdError> {
if self.span_id.is_some() && self.trace_id.is_none() {
return Err(WyrdError::Validation {
message: "eval_record_observation.span_id requires trace_id".to_string(),
details: serde_json::Value::Null,
});
}
Ok(())
}
}