use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
#[derive(Debug, Serialize, Deserialize, Clone, Default, PartialEq)]
pub struct ExplainPolicy {
pub policy_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub policy_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub action: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub risk_level: Option<String>,
#[serde(default)]
pub allow_override: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub policy_description: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Clone, Default, PartialEq)]
pub struct ExplainRule {
pub policy_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub rule_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub rule_text: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub matched_on: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Clone, Default, PartialEq)]
pub struct DecisionExplanation {
pub decision_id: String,
pub timestamp: DateTime<Utc>,
#[serde(default)]
pub policy_matches: Vec<ExplainPolicy>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub matched_rules: Vec<ExplainRule>,
pub decision: String,
pub reason: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub risk_level: Option<String>,
#[serde(default)]
pub override_available: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub override_existing_id: Option<String>,
#[serde(default)]
pub historical_hit_count_session: i64,
#[serde(skip_serializing_if = "Option::is_none")]
pub policy_source_link: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tool_signature: Option<String>,
}
#[derive(Debug, Serialize, Deserialize, Clone, Default, PartialEq)]
pub struct DecisionSummary {
pub decision_id: String,
pub timestamp: DateTime<Utc>,
pub decision: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub policy_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tool_signature: Option<String>,
}
#[derive(Debug, Clone, Default, PartialEq)]
pub struct ListDecisionsOptions {
pub since: Option<DateTime<Utc>>,
pub decision: Option<String>,
pub policy_id: Option<String>,
pub tool_signature: Option<String>,
pub limit: Option<u32>,
}
#[derive(Debug, Serialize, Deserialize, Clone, Default, PartialEq)]
pub struct UpgradeInfo {
pub tier: String,
pub wording: String,
pub compare_url: String,
pub buy_url: String,
}
#[derive(Debug, Serialize, Deserialize, Clone, Default, PartialEq)]
pub struct RateLimitEnvelope {
pub error: String,
pub limit_type: String,
pub tier: String,
pub limit: u32,
pub remaining: u32,
pub upgrade: UpgradeInfo,
}