From 83b941d7d93e93e1e7f6b1af33d059a949d76628 Mon Sep 17 00:00:00 2001 From: Tarek Elsayed <60650661+tareknaser@users.noreply.github.com> Date: Fri, 24 Nov 2023 18:48:58 +0200 Subject: [PATCH] Improve JSON Output for Upload and Remove Commands (#1389) Fix an issue where the JSON output for both the upload and remove commands in cargo contract was in an invalid format. Signed-off-by: Tarek --- CHANGELOG.md | 1 + crates/cargo-contract/src/cmd/remove.rs | 12 +++++++--- crates/cargo-contract/src/cmd/upload.rs | 32 ++++++++----------------- 3 files changed, 20 insertions(+), 25 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d1af9c38d..ee14b0869 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed - Do not allow to execute calls on immutable contract messages - [#1397](https://github.com/paritytech/cargo-contract/pull/1397) +- Improve JSON Output for Upload and Remove Commands - [#1389](https://github.com/paritytech/cargo-contract/pull/1389) ## [4.0.0-alpha] diff --git a/crates/cargo-contract/src/cmd/remove.rs b/crates/cargo-contract/src/cmd/remove.rs index eefecddf0..6acdd373c 100644 --- a/crates/cargo-contract/src/cmd/remove.rs +++ b/crates/cargo-contract/src/cmd/remove.rs @@ -62,7 +62,7 @@ impl RemoveCommand { .await?; let remove_result = remove_exec.remove_code().await?; let display_events = remove_result.display_events; - let output = if self.output_json() { + let output_events = if self.output_json() { display_events.to_json()? } else { display_events.display_events( @@ -70,13 +70,19 @@ impl RemoveCommand { remove_exec.token_metadata(), )? }; - println!("{output}"); if let Some(code_removed) = remove_result.code_removed { let remove_result = code_removed.code_hash; if self.output_json() { - println!("{}", &remove_result); + // Create a JSON object with the events and the removed code hash. + let json_object = serde_json::json!({ + "events": serde_json::from_str::(&output_events)?, + "code_hash": remove_result, + }); + let json_object = serde_json::to_string_pretty(&json_object)?; + println!("{}", json_object); } else { + println!("{}", output_events); name_value_println!("Code hash", format!("{remove_result:?}")); } Result::<(), ErrorVariant>::Ok(()) diff --git a/crates/cargo-contract/src/cmd/upload.rs b/crates/cargo-contract/src/cmd/upload.rs index 293ba0013..d6f075597 100644 --- a/crates/cargo-contract/src/cmd/upload.rs +++ b/crates/cargo-contract/src/cmd/upload.rs @@ -88,7 +88,7 @@ impl UploadCommand { } else { let upload_result = upload_exec.upload_code().await?; let display_events = upload_result.display_events; - let output = if self.output_json() { + let output_events = if self.output_json() { display_events.to_json()? } else { display_events.display_events( @@ -96,15 +96,18 @@ impl UploadCommand { upload_exec.token_metadata(), )? }; - println!("{output}"); if let Some(code_stored) = upload_result.code_stored { - let upload_result = CodeHashResult { - code_hash: format!("{:?}", code_stored.code_hash), - }; + let code_hash = code_stored.code_hash; if self.output_json() { - println!("{}", upload_result.to_json()?); + // Create a JSON object with the events and the code hash. + let json_object = serde_json::json!({ + "events": serde_json::from_str::(&output_events)?, + "code_hash": code_hash, + }); + println!("{}", serde_json::to_string_pretty(&json_object)?); } else { - upload_result.print(); + println!("{}", output_events); + name_value_println!("Code hash", format!("{:?}", code_hash)); } } else { let code_hash = hex::encode(code_hash); @@ -118,21 +121,6 @@ impl UploadCommand { } } -#[derive(serde::Serialize)] -pub struct CodeHashResult { - pub code_hash: String, -} - -impl CodeHashResult { - pub fn to_json(&self) -> Result { - Ok(serde_json::to_string_pretty(self)?) - } - - pub fn print(&self) { - name_value_println!("Code hash", format!("{:?}", self.code_hash)); - } -} - #[derive(serde::Serialize)] pub struct UploadDryRunResult { pub result: String,