Skip to content

Commit 60fbd5d

Browse files
committed
Preserve format as much as possible.
- Add a new line between the last table element and newelements when there were no previous elements. - Preserve the decor prefix of previous elements. Signed-off-by: David Calavera <david.calavera@gmail.com>
1 parent 7345d0c commit 60fbd5d

File tree

18 files changed

+92
-2
lines changed

18 files changed

+92
-2
lines changed

src/cargo/ops/cargo_new.rs

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -997,16 +997,59 @@ fn update_manifest_with_new_member(
997997
return Ok(());
998998
}
999999
}
1000+
let decor = if members.is_empty() {
1001+
None
1002+
} else {
1003+
members.get(members.len() - 1).map(|m| m.decor()).cloned()
1004+
};
10001005

10011006
let Some(toml_members) = workspace_document["workspace"]["members"].as_array_mut() else {
10021007
anyhow::bail!("[workspace.members] is not an array");
10031008
};
10041009

10051010
toml_members.push(relpath);
1011+
1012+
if let Some(decor) = decor {
1013+
if let Some(last) = toml_members
1014+
.get_mut(toml_members.len() - 1)
1015+
.map(|m| m.decor_mut())
1016+
{
1017+
if let Some(prefix) = decor.prefix() {
1018+
last.set_prefix(prefix.to_owned());
1019+
}
1020+
if let Some(suffix) = decor.suffix() {
1021+
last.set_suffix(suffix.to_owned());
1022+
}
1023+
}
1024+
}
10061025
} else {
1026+
let ws = workspace_document["workspace"]
1027+
.as_table_mut()
1028+
.with_context(|| format!("[workspace] is not a table"))?;
1029+
1030+
let mut last = None;
1031+
for (_, value) in ws.get_values() {
1032+
if !value.is_inline_table() {
1033+
last = Some(value.clone());
1034+
}
1035+
}
1036+
1037+
let assume_new_line = last.is_some();
1038+
let mut prefix = None;
1039+
if let Some(value) = last {
1040+
prefix = value.decor().prefix().cloned();
1041+
}
1042+
10071043
let mut array = Array::new();
10081044
array.push(relpath);
1009-
workspace_document["workspace"]["members"] = toml_edit::value(array);
1045+
if !assume_new_line {
1046+
array.decor_mut().set_suffix("\n");
1047+
}
1048+
if let Some(prefix) = prefix {
1049+
array.decor_mut().set_prefix(prefix);
1050+
}
1051+
1052+
ws.insert("members", toml_edit::value(array));
10101053
}
10111054

10121055
paths::write(&root_manifest_path, workspace_document.to_string())

0 commit comments

Comments
 (0)