use crate::reality::{RealityConfig, RealityLevel};
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use serde_json::Value;
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DebugContext {
pub reality: RealityContext,
pub contract: ContractContext,
pub scenario: ScenarioContext,
pub persona: PersonaContext,
pub chaos: ChaosContext,
pub collected_at: DateTime<Utc>,
}
impl DebugContext {
pub fn new() -> Self {
Self {
reality: RealityContext::default(),
contract: ContractContext::default(),
scenario: ScenarioContext::default(),
persona: PersonaContext::default(),
chaos: ChaosContext::default(),
collected_at: Utc::now(),
}
}
}
impl Default for DebugContext {
fn default() -> Self {
Self::new()
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RealityContext {
pub level: Option<RealityLevel>,
pub level_name: Option<String>,
pub chaos_enabled: bool,
pub chaos_error_rate: f64,
pub chaos_delay_rate: f64,
pub latency_base_ms: u64,
pub latency_jitter_ms: u64,
pub mockai_enabled: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub full_config: Option<RealityConfig>,
}
impl Default for RealityContext {
fn default() -> Self {
Self {
level: None,
level_name: None,
chaos_enabled: false,
chaos_error_rate: 0.0,
chaos_delay_rate: 0.0,
latency_base_ms: 0,
latency_jitter_ms: 0,
mockai_enabled: false,
full_config: None,
}
}
}
impl RealityContext {
pub fn from_config(config: &RealityConfig) -> Self {
Self {
level: Some(config.level),
level_name: Some(config.level.name().to_string()),
chaos_enabled: config.chaos.enabled,
chaos_error_rate: config.chaos.error_rate,
chaos_delay_rate: config.chaos.delay_rate,
latency_base_ms: config.latency.base_ms,
latency_jitter_ms: config.latency.jitter_ms,
mockai_enabled: config.mockai.enabled,
full_config: Some(config.clone()),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ContractContext {
pub validation_enabled: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub validation_result: Option<ContractValidationResult>,
pub enforcement_mode: String,
pub drift_history: Vec<DriftHistoryEntry>,
pub active_contracts: Vec<String>,
pub validation_errors: Vec<String>,
}
impl Default for ContractContext {
fn default() -> Self {
Self {
validation_enabled: false,
validation_result: None,
enforcement_mode: "disabled".to_string(),
drift_history: Vec::new(),
active_contracts: Vec::new(),
validation_errors: Vec::new(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ContractValidationResult {
pub passed: bool,
pub errors: Vec<String>,
pub warnings: Vec<String>,
pub contract_details: Value,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DriftHistoryEntry {
pub detected_at: DateTime<Utc>,
pub endpoint: String,
pub drift_type: String,
pub description: String,
pub details: Value,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ScenarioContext {
#[serde(skip_serializing_if = "Option::is_none")]
pub active_scenario: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub current_state: Option<String>,
pub available_transitions: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub scenario_config: Option<Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct PersonaContext {
#[serde(skip_serializing_if = "Option::is_none")]
pub active_persona_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub active_persona_name: Option<String>,
pub traits: HashMap<String, String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub domain: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub backstory: Option<String>,
pub relationships: HashMap<String, Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub lifecycle_state: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ChaosContext {
pub enabled: bool,
pub active_rules: Vec<ChaosRule>,
#[serde(skip_serializing_if = "Option::is_none")]
pub failure_injection: Option<FailureInjectionConfig>,
pub tags: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ChaosRule {
pub name: String,
pub rule_type: String,
pub enabled: bool,
pub config: Value,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FailureInjectionConfig {
pub enabled: bool,
pub http_error_probability: f64,
pub timeout_errors: bool,
pub timeout_ms: u64,
pub tag_configs: HashMap<String, Value>,
}