use serde::{Deserialize, Serialize};
use crate::model::NodeKind;
#[derive(Clone, Copy, Debug, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum Action {
Revalidate,
RecheckPolicy,
RequestReview,
Page,
}
#[derive(Clone, Copy, Debug, Deserialize, Serialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum Urgency {
Low,
Normal,
High,
Critical,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct AffectedNode {
pub id: String,
pub kind: NodeKind,
pub label: String,
pub depth: u32,
pub action: Action,
pub urgency: Urgency,
pub rationale: String,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct RemediationPlan {
pub incident_id: String,
pub affected_nodes: Vec<AffectedNode>,
pub summary: String,
}
impl RemediationPlan {
#[must_use]
pub fn affected(&self, kind: NodeKind) -> Vec<&AffectedNode> {
self.affected_nodes
.iter()
.filter(|n| n.kind == kind)
.collect()
}
#[must_use]
pub fn has_page(&self) -> bool {
self.affected_nodes
.iter()
.any(|n| matches!(n.action, Action::Page))
}
}