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();