use colored::Colorize;
pub fn format_and_print_response(value: &serde_json::Value) {
let pretty = serde_json::to_string_pretty(value).unwrap_or_else(|_| value.to_string());
colorize_and_print_json(&pretty);
}
fn colorize_and_print_json(json_str: &str) {
for line in json_str.lines() {
let trimmed = line.trim();
if matches!(trimmed, "{" | "}" | "[" | "]" | "," | "}," | "],") {
println!("{}", line.white().bold());
continue;
}
if let Some(colon_pos) = line.find(':') {
let key = &line[..colon_pos];
let value = line[colon_pos + 1..].trim();
print!("{}", key.cyan().bold());
print!(":");
if value.ends_with('{') || value.ends_with('[') {
let without_bracket = value.trim_end_matches(['{', '[']);
if !without_bracket.is_empty() {
print!("{without_bracket}");
}
let bracket = &value[without_bracket.len()..];
println!("{}", bracket.white().bold());
continue;
}
if value.ends_with('}')
|| value.ends_with(']')
|| value.ends_with("},")
|| value.ends_with("],")
{
let last_bracket = value.rfind(['}', ']']).unwrap_or(value.len());
if last_bracket > 0 {
let before = &value[..last_bracket];
let bracket_part = &value[last_bracket..];
print_colorized_value(before);
print!("{}", bracket_part.white().bold());
println!();
} else {
println!("{}", value.white().bold());
}
continue;
}
print_colorized_value_ln(value);
} else {
print_colorized_value_ln(line);
}
}
}
fn print_colorized_value_ln(value: &str) {
print_colorized_value(value);
println!();
}
fn print_colorized_value(value: &str) {
let trimmed = value.trim();
if (trimmed.starts_with('"') && trimmed.ends_with('"'))
|| (trimmed.starts_with('"') && trimmed.ends_with("\","))
{
print!("{}", value.green());
} else if matches!(trimmed, "true" | "false" | "true," | "false,") {
print!("{}", value.magenta());
} else if matches!(trimmed, "null" | "null,") {
print!("{}", value.red());
} else if trimmed.starts_with('{') || trimmed.starts_with('[') {
print!("{}", value.white().bold());
} else {
print!("{}", value.yellow());
}
}