#![allow(dead_code)]
use std::io::{self, Write};
use serde_json::json;
use crate::cli::GlobalArgs;
use relayburn_sdk::LedgerError;
pub const EXIT_LEDGER_ERROR: i32 = 3;
pub const EXIT_GENERIC_ERROR: i32 = 2;
pub const EXIT_NOT_YET_IMPLEMENTED: i32 = 1;
pub fn report_ledger_error(err: &LedgerError, globals: &GlobalArgs) -> i32 {
report(globals, &err.to_string(), EXIT_LEDGER_ERROR)
}
pub fn report_error<E: std::fmt::Display>(err: &E, globals: &GlobalArgs) -> i32 {
report(globals, &err.to_string(), EXIT_GENERIC_ERROR)
}
pub fn report_unimplemented(name: &str, globals: &GlobalArgs) -> i32 {
let message = format!("burn {name}: not yet implemented");
report(globals, &message, EXIT_NOT_YET_IMPLEMENTED)
}
pub fn report_advisory(message: &str, _globals: &GlobalArgs) {
let _ = writeln!(io::stderr(), "burn: warning: {message}");
}
fn report(globals: &GlobalArgs, message: &str, code: i32) -> i32 {
if globals.json {
let envelope = json!({ "error": message });
let _ = write_json_envelope(&envelope);
} else {
let _ = writeln!(io::stderr(), "burn: {message}");
}
code
}
fn write_json_envelope(value: &serde_json::Value) -> io::Result<()> {
let stdout = io::stdout();
let mut handle = stdout.lock();
serde_json::to_writer(&mut handle, value)
.map_err(io::Error::other)?;
handle.write_all(b"\n")?;
handle.flush()
}
#[cfg(test)]
mod tests {
use super::*;
fn json_globals() -> GlobalArgs {
GlobalArgs {
json: true,
ledger_path: None,
no_color: false,
}
}
fn human_globals() -> GlobalArgs {
GlobalArgs {
json: false,
ledger_path: None,
no_color: false,
}
}
#[test]
fn unimplemented_returns_exit_one() {
assert_eq!(
report_unimplemented("summary", &human_globals()),
EXIT_NOT_YET_IMPLEMENTED,
);
assert_eq!(
report_unimplemented("summary", &json_globals()),
EXIT_NOT_YET_IMPLEMENTED,
);
}
#[test]
fn generic_error_uses_exit_two() {
let err = std::io::Error::other("boom");
assert_eq!(report_error(&err, &human_globals()), EXIT_GENERIC_ERROR);
}
#[test]
fn ledger_error_uses_exit_three() {
let err = LedgerError::Other("ledger boom".into());
assert_eq!(
report_ledger_error(&err, &human_globals()),
EXIT_LEDGER_ERROR,
);
}
}