Skip to main content

remem/memory/scope_cleanup/
merge.rs

1use anyhow::Result;
2use rusqlite::Connection;
3use serde::Serialize;
4
5use super::audit::{load_memory_audit_rows, DuplicateCluster};
6use super::mutate::ObjectMutation;
7use super::plan::{apply_memory_cleanup_plan, build_preference_cleanup_plan};
8use super::preference_cluster::preference_clusters;
9
10#[derive(Debug, Clone)]
11pub struct MergePreferencesRequest<'a> {
12    pub project: &'a str,
13    pub dry_run: bool,
14    pub confirm: bool,
15}
16
17#[derive(Debug, Clone, Serialize)]
18pub struct MergePreferencesResult {
19    pub dry_run: bool,
20    pub project: String,
21    pub clusters: Vec<DuplicateCluster>,
22    pub affected: Vec<ObjectMutation>,
23}
24
25pub fn merge_preferences(
26    conn: &Connection,
27    req: &MergePreferencesRequest<'_>,
28) -> Result<MergePreferencesResult> {
29    let dry_run = req.dry_run || !req.confirm;
30    let memories = load_memory_audit_rows(conn, req.project)?;
31    let clusters = preference_clusters(&memories, req.project);
32    let mut affected = Vec::new();
33    if dry_run || clusters.is_empty() {
34        return Ok(MergePreferencesResult {
35            dry_run,
36            project: req.project.to_string(),
37            clusters,
38            affected,
39        });
40    }
41
42    let plan = build_preference_cleanup_plan(conn, req.project)?;
43    affected = apply_memory_cleanup_plan(conn, &plan)?.affected;
44    Ok(MergePreferencesResult {
45        dry_run,
46        project: req.project.to_string(),
47        clusters,
48        affected,
49    })
50}