diff --git a/.changeset/sheets-append-require-values.md b/.changeset/sheets-append-require-values.md new file mode 100644 index 00000000..9833c73d --- /dev/null +++ b/.changeset/sheets-append-require-values.md @@ -0,0 +1,5 @@ +--- +"@googleworkspace/cli": patch +--- + +Require row data when using `gws sheets +append`. diff --git a/crates/google-workspace-cli/src/helpers/sheets.rs b/crates/google-workspace-cli/src/helpers/sheets.rs index 4357edec..43b4a3c4 100644 --- a/crates/google-workspace-cli/src/helpers/sheets.rs +++ b/crates/google-workspace-cli/src/helpers/sheets.rs @@ -43,13 +43,17 @@ impl Helper for SheetsHelper { Arg::new("values") .long("values") .help("Comma-separated values (simple strings)") - .value_name("VALUES"), + .value_name("VALUES") + .required_unless_present("json-values") + .conflicts_with("json-values"), ) .arg( Arg::new("json-values") .long("json-values") .help("JSON array of rows, e.g. '[[\"a\",\"b\"],[\"c\",\"d\"]]'") - .value_name("JSON"), + .value_name("JSON") + .required_unless_present("values") + .conflicts_with("values"), ) .arg( Arg::new("range") @@ -522,4 +526,43 @@ mod tests { assert!(subcommands.contains(&"+append")); assert!(subcommands.contains(&"+read")); } + + #[test] + fn test_append_requires_values_or_json_values() { + let helper = SheetsHelper; + let cmd = helper.inject_commands( + Command::new("sheets"), + &crate::discovery::RestDescription::default(), + ); + + let err = cmd + .try_get_matches_from(["sheets", "+append", "--spreadsheet", "123"]) + .unwrap_err(); + + assert_eq!(err.kind(), clap::error::ErrorKind::MissingRequiredArgument); + } + + #[test] + fn test_append_rejects_values_and_json_values_together() { + let helper = SheetsHelper; + let cmd = helper.inject_commands( + Command::new("sheets"), + &crate::discovery::RestDescription::default(), + ); + + let err = cmd + .try_get_matches_from([ + "sheets", + "+append", + "--spreadsheet", + "123", + "--values", + "a,b", + "--json-values", + r#"["c","d"]"#, + ]) + .unwrap_err(); + + assert_eq!(err.kind(), clap::error::ErrorKind::ArgumentConflict); + } }