use super::ChunkId;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FixPattern {
pub id: ChunkId,
pub error_code: String,
pub decision_sequence: Vec<String>,
pub fix_diff: String,
pub success_count: u32,
pub attempt_count: u32,
pub metadata: HashMap<String, String>,
}
impl FixPattern {
#[must_use]
pub fn new(error_code: impl Into<String>, fix_diff: impl Into<String>) -> Self {
Self {
id: ChunkId::new(),
error_code: error_code.into(),
decision_sequence: Vec::new(),
fix_diff: fix_diff.into(),
success_count: 0,
attempt_count: 0,
metadata: HashMap::new(),
}
}
#[must_use]
pub fn with_decision(mut self, decision: impl Into<String>) -> Self {
self.decision_sequence.push(decision.into());
self
}
#[must_use]
pub fn with_decisions(mut self, decisions: Vec<String>) -> Self {
self.decision_sequence.extend(decisions);
self
}
pub fn record_success(&mut self) {
self.success_count += 1;
self.attempt_count += 1;
}
pub fn record_failure(&mut self) {
self.attempt_count += 1;
}
#[must_use]
pub fn success_rate(&self) -> f32 {
if self.attempt_count == 0 {
0.0
} else {
self.success_count as f32 / self.attempt_count as f32
}
}
#[must_use]
pub fn to_searchable_text(&self) -> String {
let decisions = self.decision_sequence.join(" ");
format!("{} {} {}", self.error_code, decisions, self.fix_diff)
}
}