pub mod apply;
pub mod check;
pub mod evaluate;
pub mod sense;
pub mod verify_registry;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UpdateCandidate {
pub name: String,
pub current_version: String,
pub new_version: String,
pub tag: String,
pub checksums: HashMap<String, Option<String>>,
pub verified: HashMap<String, Option<bool>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub note: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CheckOutput {
pub updates: Vec<UpdateCandidate>,
#[serde(default)]
pub errors: Vec<String>,
#[serde(default)]
pub advisories: HashMap<String, Vec<Advisory>>,
pub tools_checked: usize,
pub updates_found: usize,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Advisory {
pub id: String,
pub severity: String,
pub summary: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
pub enum BumpLevel {
Patch,
Minor,
Major,
}
impl std::fmt::Display for BumpLevel {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Patch => f.write_str("patch"),
Self::Minor => f.write_str("minor"),
Self::Major => f.write_str("major"),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
pub enum Risk {
Low,
Medium,
High,
Critical,
}
impl std::fmt::Display for Risk {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Low => f.write_str("low"),
Self::Medium => f.write_str("medium"),
Self::High => f.write_str("high"),
Self::Critical => f.write_str("critical"),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum FindingType {
VersionBump,
AdvisoryFound,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SenseFinding {
pub tool: String,
#[serde(rename = "type")]
pub finding_type: FindingType,
pub current: String,
pub available: String,
pub bump: BumpLevel,
pub checksums_verified: bool,
pub advisories: Vec<Advisory>,
pub risk: Risk,
pub tier: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub note: Option<String>,
#[serde(default, skip_serializing_if = "HashMap::is_empty")]
pub checksums: HashMap<String, Option<String>>,
#[serde(default, skip_serializing_if = "HashMap::is_empty")]
pub verified: HashMap<String, Option<bool>>,
#[serde(default, skip_serializing_if = "String::is_empty")]
pub tag: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SenseReport {
pub findings: Vec<SenseFinding>,
pub tools_checked: usize,
#[serde(default)]
pub infrastructure_errors: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EvaluatedUpdate {
#[serde(flatten)]
pub candidate: UpdateCandidate,
pub evaluation: String,
#[serde(default)]
pub review_reasons: Vec<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub eval_reason: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EvaluateOutput {
pub evaluated: Vec<EvaluatedUpdate>,
pub summary: EvaluateSummary,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EvaluateSummary {
pub approved: usize,
pub flagged: usize,
pub rejected: usize,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ToolVerifyResult {
pub name: String,
pub valid: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub error: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub checksums_verified: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VerifyRegistryOutput {
pub tools_checked: usize,
pub valid: usize,
pub invalid: usize,
pub results: Vec<ToolVerifyResult>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ApplyOutput {
pub applied: Vec<AppliedUpdate>,
pub rejected_names: Vec<String>,
pub flagged_names: Vec<String>,
pub branch_hint: String,
pub commit_message: String,
pub mr_title: String,
pub mr_body: String,
pub auto_merge_eligible: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AppliedUpdate {
pub name: String,
pub old_version: String,
pub new_version: String,
pub file: String,
pub evaluation: String,
pub bump: String,
pub tier: String,
pub checksums_verified: bool,
}
pub use apply::apply;
pub use check::check;
pub use evaluate::evaluate;
pub use sense::sense;
pub use verify_registry::verify_registry;