use anyhow::{Context, Result};
use serde_json::json;
fn json_envelope(message: &str) -> Result<String> {
let value = json!({"status": "ok", "message": message});
serde_json::to_string(&value)
.context("Failed to serialize action result to JSON")
}
fn json_envelope_with_data<T: serde::Serialize>(
message: &str,
data: &T,
) -> Result<String> {
let data_value = serde_json::to_value(data)
.context("Failed to convert data payload to JSON")?;
let value =
json!({"status": "ok", "message": message, "data": data_value});
serde_json::to_string(&value)
.context("Failed to serialize action result to JSON")
}
pub fn print(message: &str, output_opt: Option<&str>) -> Result<()> {
match output_opt {
Some("json") => println!("{}", json_envelope(message)?),
_ => println!("{message}"),
}
Ok(())
}
pub fn print_with_data<T: serde::Serialize>(
message: &str,
data: &T,
output_opt: Option<&str>,
) -> Result<()> {
match output_opt {
Some("json") => {
println!("{}", json_envelope_with_data(message, data)?);
}
_ => {
println!("{message}");
println!(
"{}",
serde_json::to_string_pretty(data)
.context("Failed to pretty-print data payload")?
);
}
}
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
use serde_json::Value;
#[test]
fn json_envelope_has_status_and_message() {
let rendered = json_envelope("Group 'foo' added").unwrap();
let parsed: Value = serde_json::from_str(&rendered).unwrap();
assert_eq!(parsed["status"], "ok");
assert_eq!(parsed["message"], "Group 'foo' added");
}
#[test]
fn json_envelope_with_data_attaches_payload() {
let payload = json!({"id": "x3000c0s1b0", "enabled": true});
let rendered =
json_envelope_with_data("endpoint added", &payload).unwrap();
let parsed: Value = serde_json::from_str(&rendered).unwrap();
assert_eq!(parsed["status"], "ok");
assert_eq!(parsed["message"], "endpoint added");
assert_eq!(parsed["data"]["id"], "x3000c0s1b0");
assert_eq!(parsed["data"]["enabled"], true);
}
#[test]
fn print_text_mode_does_not_error() {
print("hello", None).unwrap();
print("hello", Some("table")).unwrap();
}
#[test]
fn print_json_mode_does_not_error() {
print("hello", Some("json")).unwrap();
}
}