diff --git a/crates/engine/src/cmd/slide.rs b/crates/engine/src/cmd/slide.rs index 8ab3b3c3..8002aac9 100644 --- a/crates/engine/src/cmd/slide.rs +++ b/crates/engine/src/cmd/slide.rs @@ -373,7 +373,7 @@ fn select_slides(s: &mut Session, p: &Value) -> Result { } fn hide(s: &mut Session, p: &Value) -> Result { - let targets: Vec = match usize_param(p, "index") { + let targets: Vec = match opt_usize_param(p, "index", "slide.hide")? { Some(i) => vec![i], None => { let st = s.doc()?; @@ -442,7 +442,7 @@ pub fn apply_layout(doc: &mut Presentation, index: usize, layout: LayoutId) -> R fn set_layout(s: &mut Session, p: &Value) -> Result { let key = p.get("layout").cloned().ok_or_else(|| bad("slide.layout", "missing `layout`"))?; - let targets: Vec = match usize_param(p, "index") { + let targets: Vec = match opt_usize_param(p, "index", "slide.layout")? { Some(i) => vec![i], None => { let st = s.doc()?; diff --git a/crates/engine/src/tests.rs b/crates/engine/src/tests.rs index 28123a69..7e5d9930 100644 --- a/crates/engine/src/tests.rs +++ b/crates/engine/src/tests.rs @@ -4581,3 +4581,18 @@ fn format_color_on_a_selected_chart_sets_its_text_color() { s.execute("format.color", &json!({"color": "accent2"})).unwrap(); assert_eq!(chart_of(&s, id).text_color, Some(deckcraft_model::ColorRef::scheme(deckcraft_color::SchemeSlot::Accent2))); } + +#[test] +fn slide_hide_and_layout_reject_invalid_index() { + let mut s = session(); + s.execute("slide.new", &json!({})).unwrap(); + s.execute("slide.new", &json!({})).unwrap(); + s.execute("slide.selectSlides", &json!({"indices": [0]})).unwrap(); + for bad in [json!(-1), json!(1.5)] { + let e = s.execute("slide.hide", &json!({"index": bad})).unwrap_err().to_string(); + assert!(e.contains("not a valid index"), "{e}"); + let e = s.execute("slide.layout", &json!({"layout": "blank", "index": bad})).unwrap_err().to_string(); + assert!(e.contains("not a valid index"), "{e}"); + } + assert!(s.doc().unwrap().doc.slides.iter().all(|x| !x.hidden)); +}