mirror of
https://github.com/storytold/gridcraft.git
synced 2026-10-30 05:37:00 -06:00
Model: a macro name with control characters is refused on every path
Only parse_macro refused a name holding a line break or other control character. Macros that came from the macros field of a JSON workbook were checked with check_limits alone, so a file could bring in a macro named "a\nb" that macro.save and macro.rename would refuse. The check now lives in Macro::check_limits, so every path applies it, and such a macro is dropped with the usual warning when the file is opened.
This commit is contained in:
@@ -30,9 +30,6 @@ pub fn parse_macro(v: &Json) -> Result<Macro, String> {
|
||||
let mut m: Macro = serde_json::from_value(v).map_err(|e| format!("This isn't a valid macro: {e}"))?;
|
||||
m.name = m.name.trim().to_string();
|
||||
m.check_limits()?;
|
||||
if m.name.chars().any(char::is_control) {
|
||||
return Err("A macro name can't hold line breaks or other control characters.".into());
|
||||
}
|
||||
check_size(&m)?;
|
||||
Ok(m)
|
||||
}
|
||||
|
||||
@@ -193,3 +193,16 @@ fn names() {
|
||||
assert_eq!(find(&wb, " MACRO1 "), Some(0));
|
||||
assert_eq!(find(&wb, "Macro2"), None);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn json_field_macros_get_the_name_check_too() {
|
||||
// A JSON workbook can't bring in a name that macro.save and macro.rename refuse.
|
||||
let mut wb = Workbook::new();
|
||||
wb.macros.push(Macro { name: "a\nb".into(), ..Macro::default() });
|
||||
wb.macros.push(Macro { name: "Fine".into(), ..Macro::default() });
|
||||
let bytes = crate::io::save_bytes(&wb, "ctl.json").unwrap();
|
||||
let (back, warnings) = crate::io::open_bytes("ctl.json", &bytes).unwrap();
|
||||
let names: Vec<&str> = back.macros.iter().map(|m| m.name.as_str()).collect();
|
||||
assert_eq!(names, ["Fine"]);
|
||||
assert!(warnings.len() == 1 && warnings[0].starts_with("1 macro "), "{warnings:?}");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user