From 78014a1b436f0de44b35cca9cc55f3e6753b4576 Mon Sep 17 00:00:00 2001 From: bflatastic Date: Mon, 2 Nov 2026 11:08:28 +0700 Subject: [PATCH] Variables: Import Data Sets and Load Variable Library record their step through edit_variables --- crates/engine/src/cmd/variablecmds/csv.rs | 32 ++++++++----------- crates/engine/src/cmd/variablecmds/library.rs | 18 ++++------- 2 files changed, 21 insertions(+), 29 deletions(-) diff --git a/crates/engine/src/cmd/variablecmds/csv.rs b/crates/engine/src/cmd/variablecmds/csv.rs index f9e170c59..47376d78f 100644 --- a/crates/engine/src/cmd/variablecmds/csv.rs +++ b/crates/engine/src/cmd/variablecmds/csv.rs @@ -324,26 +324,22 @@ pub(super) fn dataset_import(s: &mut Session, p: &Value) -> Result { } let names: Vec = parsed.iter().map(|d| d.name.clone()).collect(); let new_variables: Vec = defined.iter().map(|v| v.name.clone()).collect(); - let mut vars = s.doc()?.doc.variables.clone(); - vars.variables.extend(defined); - let (mut imported, mut updated) = (0usize, 0usize); - for row in parsed { - if let Some(existing) = vars.datasets.iter_mut().find(|x| x.name == row.name) { - *existing = row; - updated += 1; - } else { - vars.datasets.push(row); - imported += 1; - } - } // The import is one undo step, and an import that leaves the variables and data sets as they // were adds none. - if vars != s.doc()?.doc.variables { - s.edit("Import Data Sets", |d, _| { - d.variables = vars; - Ok(()) - })?; - } + let (imported, updated) = super::edit_variables(s, "Import Data Sets", |vars| { + vars.variables.extend(defined); + let (mut imported, mut updated) = (0usize, 0usize); + for row in parsed { + if let Some(existing) = vars.datasets.iter_mut().find(|x| x.name == row.name) { + *existing = row; + updated += 1; + } else { + vars.datasets.push(row); + imported += 1; + } + } + Ok((imported, updated)) + })?; Ok(json!({"imported": imported, "updated": updated, "names": names, "defined": new_variables})) } diff --git a/crates/engine/src/cmd/variablecmds/library.rs b/crates/engine/src/cmd/variablecmds/library.rs index cdd2ba4d0..7e57b2375 100644 --- a/crates/engine/src/cmd/variablecmds/library.rs +++ b/crates/engine/src/cmd/variablecmds/library.rs @@ -269,18 +269,14 @@ pub(super) fn load_library(s: &mut Session, p: &Value) -> Result { } let added: Vec = lib.text.iter().map(|n| Variable { name: n.clone(), kind: VariableKind::Text }).collect(); let names: Vec = lib.datasets.iter().map(|d| d.name.clone()).collect(); - let mut vars = s.doc()?.doc.variables.clone(); - vars.prune(&deleted); - vars.variables.extend(added); - vars.datasets = lib.datasets; - vars.active_dataset = None; // A load that leaves the variables and data sets as they were adds no undo step. - if vars != s.doc()?.doc.variables { - s.edit("Load Variable Library", |d, _| { - d.variables = vars; - Ok(()) - })?; - } + super::edit_variables(s, "Load Variable Library", |vars| { + vars.prune(&deleted); + vars.variables.extend(added); + vars.datasets = lib.datasets; + vars.active_dataset = None; + Ok(()) + })?; // A highlight of a variable that is gone highlights nothing. let st = s.doc_mut()?; st.drop_stale_variables_highlight();