From f2596d6e8944fefc77b85640a7fc7e49910f12ce Mon Sep 17 00:00:00 2001 From: Mykhailo Chalyi Date: Fri, 8 May 2026 00:24:17 -0500 Subject: [PATCH] fix(tool_def): reject bare array flags without values --- crates/bashkit/src/tool_def.rs | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/crates/bashkit/src/tool_def.rs b/crates/bashkit/src/tool_def.rs index cf38015c..cd7ace66 100644 --- a/crates/bashkit/src/tool_def.rs +++ b/crates/bashkit/src/tool_def.rs @@ -431,7 +431,7 @@ fn consume_array_value( flag_name: &str, ) -> std::result::Result { if *i >= args.len() || args[*i].starts_with("--") { - return Ok(ArrayInput::Items(Vec::new())); + return Err(format!("--{flag_name}: missing value")); } let next = &args[*i]; let trimmed = next.trim_start(); @@ -914,6 +914,35 @@ mod tests { assert_eq!(result["tags"], serde_json::json!(["abc"])); } + #[test] + fn test_parse_flags_array_missing_value_is_error() { + let schema = serde_json::json!({ + "type": "object", + "properties": {"tags": {"type": "array", "items": {"type": "string"}}} + }); + let args = vec!["--tags".to_string()]; + let err = parse_flags(&args, &schema).unwrap_err(); + assert_eq!(err, "--tags: missing value"); + } + + #[test] + fn test_parse_flags_array_missing_value_before_next_flag_is_error() { + let schema = serde_json::json!({ + "type": "object", + "properties": { + "tags": {"type": "array", "items": {"type": "string"}}, + "name": {"type": "string"} + } + }); + let args = vec![ + "--tags".to_string(), + "--name".to_string(), + "alice".to_string(), + ]; + let err = parse_flags(&args, &schema).unwrap_err(); + assert_eq!(err, "--tags: missing value"); + } + #[test] fn test_parse_flags_pair_object_single() { let schema = serde_json::json!({