use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
#[derive(Debug, Deserialize, JsonSchema)]
pub struct ScanParams {
#[serde(default)]
pub path: Option<String>,
#[serde(default)]
pub paths: Option<Vec<String>>,
#[serde(default)]
pub severity: Option<String>,
#[serde(default)]
pub diff: Option<bool>,
#[serde(default)]
pub max_results: Option<usize>,
}
impl ScanParams {
pub fn resolved_paths(&self) -> Vec<String> {
if let Some(p) = &self.path {
return vec![p.clone()];
}
if let Some(ps) = &self.paths {
if !ps.is_empty() {
return ps.clone();
}
}
vec![".".to_string()]
}
}
#[derive(Debug, Serialize)]
pub struct ScanResult {
pub total_findings: usize,
pub files_scanned: usize,
pub rules_loaded: usize,
pub findings: Vec<FindingOutput>,
}
#[derive(Debug, Serialize)]
pub struct FindingOutput {
pub rule_id: String,
pub rule_name: String,
pub severity: String,
pub file: String,
pub line: usize,
pub column: usize,
pub matched_text: String,
pub message: String,
pub description: String,
pub fix_hint: Option<String>,
pub cwe: Option<String>,
pub owasp: Option<String>,
pub references: Vec<String>,
pub context_before: Vec<String>,
pub context_after: Vec<String>,
}
#[derive(Debug, Deserialize, JsonSchema)]
pub struct ListRulesParams {
#[serde(default)]
pub language: Option<String>,
#[serde(default)]
pub severity: Option<String>,
#[serde(default)]
pub search: Option<String>,
}
#[derive(Debug, Serialize)]
pub struct ListRulesResult {
pub total: usize,
pub rules: Vec<RuleOutput>,
}
#[derive(Debug, Serialize)]
pub struct RuleOutput {
pub id: String,
pub name: String,
pub severity: String,
pub language: String,
pub description: String,
pub cwe: Option<String>,
pub owasp: Option<String>,
pub fix_hint: Option<String>,
pub references: Vec<String>,
}
#[derive(Debug, Deserialize, JsonSchema)]
pub struct ExplainFindingParams {
#[serde(alias = "file", alias = "filePath", alias = "file_path", alias = "target")]
pub path: String,
pub line: usize,
pub rule_id: String,
#[serde(default)]
pub ai_provider: Option<String>,
}
#[derive(Debug, Deserialize, JsonSchema)]
pub struct ReviewParams {
#[serde(alias = "file", alias = "filePath", alias = "file_path", alias = "target")]
pub path: String,
#[serde(default)]
pub ai_provider: Option<String>,
}
#[derive(Debug, Deserialize, JsonSchema)]
pub struct CheckDepsParams {
#[serde(default = "default_dot")]
pub path: String,
}
fn default_dot() -> String {
".".to_string()
}
#[derive(Debug, Serialize)]
pub struct CheckDepsResult {
pub files_checked: Vec<String>,
pub python_packages: Vec<String>,
pub npm_packages: Vec<String>,
pub npm_dev_packages: Vec<String>,
}