use std::time::Duration;
use serde::{Deserialize, Serialize};
use super::fact_extractor::ExtractedFact;
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct DreamMetrics {
pub sessions_processed: usize,
pub messages_summarized: usize,
pub facts_extracted: usize,
pub tokens_before: usize,
pub tokens_after: usize,
pub contradictions_found: usize,
#[serde(with = "humantime_serde_compat")]
pub duration: Duration,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct DreamReport {
pub metrics: DreamMetrics,
pub summaries_created: Vec<String>,
pub facts: Vec<ExtractedFact>,
pub errors: Vec<String>,
}
mod humantime_serde_compat {
use std::time::Duration;
use serde::{Deserialize, Deserializer, Serialize, Serializer};
pub fn serialize<S: Serializer>(d: &Duration, s: S) -> Result<S::Ok, S::Error> {
d.as_secs_f64().serialize(s)
}
pub fn deserialize<'de, D: Deserializer<'de>>(d: D) -> Result<Duration, D::Error> {
let secs = f64::deserialize(d)?;
Ok(Duration::from_secs_f64(secs))
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_dream_metrics_default() {
let m = DreamMetrics::default();
assert_eq!(m.sessions_processed, 0);
assert_eq!(m.messages_summarized, 0);
assert_eq!(m.facts_extracted, 0);
assert_eq!(m.tokens_before, 0);
assert_eq!(m.tokens_after, 0);
assert_eq!(m.contradictions_found, 0);
assert_eq!(m.duration, Duration::ZERO);
}
#[test]
fn test_dream_report_default() {
let r = DreamReport::default();
assert!(r.summaries_created.is_empty());
assert!(r.facts.is_empty());
assert!(r.errors.is_empty());
}
#[test]
fn test_metrics_serde_roundtrip() {
let m = DreamMetrics {
sessions_processed: 3,
messages_summarized: 42,
facts_extracted: 7,
tokens_before: 100_000,
tokens_after: 20_000,
contradictions_found: 1,
duration: Duration::from_millis(1234),
};
let json = serde_json::to_string(&m).unwrap();
let m2: DreamMetrics = serde_json::from_str(&json).unwrap();
assert_eq!(m2.sessions_processed, 3);
assert_eq!(m2.messages_summarized, 42);
assert_eq!(m2.facts_extracted, 7);
assert!((m2.duration.as_secs_f64() - 1.234).abs() < 0.001);
}
}