use std::fmt::Display;
use crate::domain::finding::Finding;
use crate::error::AppError;
pub fn line(text: impl Display) {
println!("{text}");
}
pub fn raw(bytes: &[u8]) {
use std::io::Write;
let _ = std::io::stdout().write_all(bytes);
}
pub fn json(value: &impl serde::Serialize) -> Result<(), AppError> {
let text = serde_json::to_string_pretty(value).map_err(anyhow::Error::from)?;
println!("{text}");
Ok(())
}
pub fn findings(findings: &[Finding]) {
for finding in findings {
println!("{finding}");
}
}
pub fn error_envelope(error: &AppError) {
if matches!(error, AppError::Violations { .. }) {
return;
}
let envelope = serde_json::json!({
"ok": false,
"error": {
"kind": error.kind(),
"message": error.to_string(),
"exit_code": error.exit_code(),
}
});
eprintln!("{envelope}");
}