From be17e25beed4115e56e444c3eb3047a42127e640 Mon Sep 17 00:00:00 2001 From: Alex Auvolat Date: Sat, 25 Jul 2026 15:24:31 +0200 Subject: [PATCH] CLI: `garage json-api`: allow payload to be omitted more often --- src/garage/cli/remote/mod.rs | 31 ++++++++++++++++++++++--------- src/garage/cli/structs.rs | 3 +-- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/garage/cli/remote/mod.rs b/src/garage/cli/remote/mod.rs index 3d88abf1..355dfbc6 100644 --- a/src/garage/cli/remote/mod.rs +++ b/src/garage/cli/remote/mod.rs @@ -110,16 +110,29 @@ impl Cli { Ok(resp.success.into_iter().next().unwrap().1) } - pub async fn cmd_json_api(&self, endpoint: String, payload: String) -> Result<(), Error> { - let payload: serde_json::Value = if payload == "-" { - serde_json::from_reader(&std::io::stdin())? - } else { - serde_json::from_str(&payload)? - }; + pub async fn cmd_json_api( + &self, + endpoint: String, + payload: Option, + ) -> Result<(), Error> { + let request: AdminApiRequest = if let Some(payload) = payload { + let payload: serde_json::Value = if payload == "-" { + serde_json::from_reader(&std::io::stdin())? + } else { + serde_json::from_str(&payload)? + }; - let request: AdminApiRequest = serde_json::from_value(serde_json::json!({ - endpoint.clone(): payload, - }))?; + serde_json::from_value(serde_json::json!({ + endpoint.clone(): payload, + }))? + } else { + serde_json::from_value(serde_json::json!({ + endpoint.clone(): null, + })) + .or(serde_json::from_value(serde_json::json!({ + endpoint.clone(): {}, + })))? + }; let resp = match self .proxy_rpc_endpoint diff --git a/src/garage/cli/structs.rs b/src/garage/cli/structs.rs index a96aa03f..ae87b12f 100644 --- a/src/garage/cli/structs.rs +++ b/src/garage/cli/structs.rs @@ -78,8 +78,7 @@ pub enum Command { /// The admin API endpoint to invoke, e.g. `GetClusterStatus` endpoint: String, /// The JSON payload, or `-` to read from `stdin` - #[structopt(default_value = "null")] - payload: String, + payload: Option, }, /// Generate completions for a shell