Skip to main content

dial/failure/
solutions.rs

1use crate::errors::Result;
2use crate::{TRUST_DECREMENT, TRUST_INCREMENT, TRUST_THRESHOLD};
3use chrono::Local;
4use rusqlite::Connection;
5
6#[derive(Debug, Clone)]
7pub struct Solution {
8    pub id: i64,
9    pub pattern_id: i64,
10    pub description: String,
11    pub code_example: Option<String>,
12    pub confidence: f64,
13    pub success_count: i64,
14    pub failure_count: i64,
15    pub created_at: String,
16    pub last_used_at: Option<String>,
17}
18
19impl Solution {
20    pub fn from_row(row: &rusqlite::Row) -> rusqlite::Result<Self> {
21        Ok(Solution {
22            id: row.get("id")?,
23            pattern_id: row.get("pattern_id")?,
24            description: row.get("description")?,
25            code_example: row.get("code_example")?,
26            confidence: row.get("confidence")?,
27            success_count: row.get("success_count")?,
28            failure_count: row.get("failure_count")?,
29            created_at: row.get("created_at")?,
30            last_used_at: row.get("last_used_at")?,
31        })
32    }
33
34    pub fn is_trusted(&self) -> bool {
35        self.confidence >= TRUST_THRESHOLD
36    }
37}
38
39pub fn find_trusted_solutions(conn: &Connection, pattern_id: i64) -> Result<Vec<Solution>> {
40    let mut stmt = conn.prepare(
41        "SELECT id, pattern_id, description, code_example, confidence, success_count, failure_count, created_at, last_used_at
42         FROM solutions
43         WHERE pattern_id = ?1 AND confidence >= ?2
44         ORDER BY confidence DESC",
45    )?;
46
47    let solutions = stmt
48        .query_map(rusqlite::params![pattern_id, TRUST_THRESHOLD], |row| {
49            Solution::from_row(row)
50        })?
51        .collect::<std::result::Result<Vec<_>, _>>()?;
52
53    Ok(solutions)
54}
55
56pub fn record_solution(
57    conn: &Connection,
58    pattern_id: i64,
59    description: &str,
60    code_example: Option<&str>,
61) -> Result<i64> {
62    conn.execute(
63        "INSERT INTO solutions (pattern_id, description, code_example)
64         VALUES (?1, ?2, ?3)",
65        rusqlite::params![pattern_id, description, code_example],
66    )?;
67    Ok(conn.last_insert_rowid())
68}
69
70pub fn apply_solution_success(conn: &Connection, solution_id: i64) -> Result<()> {
71    let now = Local::now().to_rfc3339();
72    conn.execute(
73        "UPDATE solutions
74         SET confidence = MIN(1.0, confidence + ?1),
75             success_count = success_count + 1,
76             last_used_at = ?2
77         WHERE id = ?3",
78        rusqlite::params![TRUST_INCREMENT, now, solution_id],
79    )?;
80    Ok(())
81}
82
83pub fn apply_solution_failure(conn: &Connection, solution_id: i64) -> Result<()> {
84    let now = Local::now().to_rfc3339();
85    conn.execute(
86        "UPDATE solutions
87         SET confidence = MAX(0.0, confidence - ?1),
88             failure_count = failure_count + 1,
89             last_used_at = ?2
90         WHERE id = ?3",
91        rusqlite::params![TRUST_DECREMENT, now, solution_id],
92    )?;
93    Ok(())
94}