use serde::{Deserialize, Serialize};
use tower_lsp::lsp_types::Range;
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct IrAnalyzeResponse {
pub findings: Vec<IrFinding>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub system_hazards: Vec<IrSystemHazard>,
pub file_count: i32,
pub elapsed_ms: i64,
#[serde(skip_serializing_if = "Option::is_none")]
pub graph_stats: Option<IrGraphStats>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct IrSystemHazard {
pub glossary_id: String,
pub aka: String,
pub file_path: String,
pub line: u32,
pub effective_severity: String,
pub one_line_impact: String,
pub destruction_path: Vec<String>,
pub finding_id: String,
#[serde(default)]
pub aggregate_risk: f64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub macro_goal: Option<String>,
#[serde(default)]
pub anchored_to_slo: bool,
#[serde(default, skip_serializing_if = "String::is_empty")]
pub tradeoff_gain: String,
#[serde(default, skip_serializing_if = "String::is_empty")]
pub tradeoff_risk: String,
#[serde(default, skip_serializing_if = "String::is_empty")]
pub finding_title: String,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct IrFinding {
pub rule_id: String,
pub title: String,
pub description: String,
pub severity: String,
pub dimension: String,
pub file_path: String,
pub line: u32,
pub column: u32,
#[serde(skip_serializing_if = "Option::is_none")]
pub end_line: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub end_column: Option<u32>,
pub message: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub patch_json: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub fix_preview: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub patch: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub byte_start: Option<usize>,
#[serde(skip_serializing_if = "Option::is_none")]
pub byte_end: Option<usize>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct IrGraphStats {
pub file_count: i32,
pub function_count: i32,
pub class_count: i32,
pub external_module_count: i32,
pub import_edge_count: i32,
pub contains_edge_count: i32,
pub uses_library_edge_count: i32,
pub total_nodes: i32,
pub total_edges: i32,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct FileCentrality {
pub path: String,
pub in_degree: i32,
pub out_degree: i32,
pub total_degree: i32,
pub library_usage: i32,
pub importance_score: i32,
}
#[derive(Debug, Clone)]
pub struct FunctionInfo {
pub name: String,
pub range: Range,
}