From efdc17248cbf8336f28c377a301752604fb6db74 Mon Sep 17 00:00:00 2001 From: Bryan Newbold Date: Tue, 9 Feb 2021 22:37:45 -0800 Subject: add colored JSON output for some commands --- fatcat-cli/src/entities.rs | 5 +++++ fatcat-cli/src/main.rs | 25 ++++++++++++++----------- 2 files changed, 19 insertions(+), 11 deletions(-) (limited to 'fatcat-cli/src') diff --git a/fatcat-cli/src/entities.rs b/fatcat-cli/src/entities.rs index d61f6dc..5e4ac06 100644 --- a/fatcat-cli/src/entities.rs +++ b/fatcat-cli/src/entities.rs @@ -124,6 +124,7 @@ pub fn entity_model_from_json_str( pub trait ApiModelSer { fn to_json_string(&self) -> Result; + fn to_json_value(&self) -> Result; fn to_toml_string(&self) -> Result; } @@ -132,6 +133,10 @@ impl ApiModelSer for T { Ok(serde_json::to_string(self)?) } + fn to_json_value(&self) -> Result { + Ok(serde_json::to_value(self)?) + } + fn to_toml_string(&self) -> Result { Ok(toml::Value::try_from(self)?.to_string()) } diff --git a/fatcat-cli/src/main.rs b/fatcat-cli/src/main.rs index 3b0d382..3b4a81b 100644 --- a/fatcat-cli/src/main.rs +++ b/fatcat-cli/src/main.rs @@ -1,6 +1,5 @@ use crate::{path_or_stdin, BatchGrouper, BatchOp}; use anyhow::{anyhow, Context, Result}; -use fatcat_cli::ApiModelSer; use fatcat_cli::*; #[allow(unused_imports)] use log::{self, debug, info}; @@ -8,6 +7,7 @@ use std::io::Write; use std::path::PathBuf; use structopt::StructOpt; use termcolor::{Color, ColorChoice, ColorSpec, StandardStream, WriteColor}; +use colored_json::to_colored_json_auto; #[derive(StructOpt)] #[structopt(rename_all = "kebab-case", about = "CLI interface to Fatcat API")] @@ -285,6 +285,9 @@ fn main() -> Result<()> { debug!("Args parsed, starting up"); + #[cfg(windows)] + colored_json::enable_ansi_support(); + if let Err(err) = run(opt) { // Be graceful about some errors if let Some(io_err) = err.root_cause().downcast_ref::() { @@ -323,7 +326,7 @@ fn run(opt: Opt) -> Result<()> { if toml { writeln!(&mut std::io::stdout(), "{}", result.to_toml_string()?)? } else if json || true { - writeln!(&mut std::io::stdout(), "{}", result.to_json_string()?)? + writeln!(&mut std::io::stdout(), "{}", to_colored_json_auto(&result.to_json_value()?)?)? } } Command::Create { @@ -333,7 +336,7 @@ fn run(opt: Opt) -> Result<()> { } => { let json_str = read_entity_file(input_path)?; let ee = api_client.create_entity_from_json(entity_type, &json_str, editgroup_id)?; - println!("{}", serde_json::to_string(&ee)?); + writeln!(&mut std::io::stdout(), "{}", to_colored_json_auto(&serde_json::to_value(&ee)?)?)? } Command::Update { specifier, @@ -357,7 +360,7 @@ fn run(opt: Opt) -> Result<()> { }; let ee = api_client.update_entity_from_json(exact_specifier, &json_str, editgroup_id)?; - println!("{}", serde_json::to_string(&ee)?); + writeln!(&mut std::io::stdout(), "{}", to_colored_json_auto(&serde_json::to_value(&ee)?)?)? } Command::Edit { specifier, @@ -373,7 +376,7 @@ fn run(opt: Opt) -> Result<()> { json, editing_command, )?; - println!("{}", serde_json::to_string(&ee)?); + writeln!(&mut std::io::stdout(), "{}", to_colored_json_auto(&serde_json::to_value(&ee)?)?)? } Command::Changelog { limit, json } => { let resp = api_client @@ -598,25 +601,25 @@ fn run(opt: Opt) -> Result<()> { cmd: EditgroupCommand::Create { description }, } => { let eg = api_client.create_editgroup(Some(description))?; - println!("{}", serde_json::to_string(&eg)?) + writeln!(&mut std::io::stdout(), "{}", to_colored_json_auto(&serde_json::to_value(&eg)?)?)? } Command::Editgroup { cmd: EditgroupCommand::Accept { editgroup_id }, } => { let msg = api_client.accept_editgroup(editgroup_id.clone())?; - println!("{}", serde_json::to_string(&msg)?); + writeln!(&mut std::io::stdout(), "{}", to_colored_json_auto(&serde_json::to_value(&msg)?)?)? } Command::Editgroup { cmd: EditgroupCommand::Submit { editgroup_id }, } => { - let eg = api_client.update_editgroup_submit(editgroup_id, true)?; - println!("{}", eg.to_json_string()?); + let msg = api_client.update_editgroup_submit(editgroup_id, true)?; + writeln!(&mut std::io::stdout(), "{}", to_colored_json_auto(&serde_json::to_value(&msg)?)?)? } Command::Editgroup { cmd: EditgroupCommand::Unsubmit { editgroup_id }, } => { - let eg = api_client.update_editgroup_submit(editgroup_id, false)?; - println!("{}", eg.to_json_string()?); + let msg = api_client.update_editgroup_submit(editgroup_id, false)?; + writeln!(&mut std::io::stdout(), "{}", to_colored_json_auto(&serde_json::to_value(&msg)?)?)? } Command::Status { json } => { let status = ClientStatus::generate(&mut api_client)?; -- cgit v1.2.3