use crate::Error;
use serde::Deserialize;
use serde::Serialize;
use serde_json::Value as JsonValue;
#[derive(Serialize, Debug)]
pub struct CliOutput {
pub status: CliStatus,
pub result: JsonValue,
}
impl CliOutput {
pub(crate) fn with_result(result: Result<JsonValue, Error>) -> Self {
let (status, result) = match result {
Ok(result) => (CliStatus::Success, result),
Err(err) => {
let result = match serde_json::to_value(err) {
Ok(json_val) => json_val,
Err(e) => {
panic!("[modelator] CLI error serialization failed: {:?}", e)
}
};
(CliStatus::Error, result)
}
};
Self { status, result }
}
pub fn exit(self) {
let pretty = match serde_json::to_string_pretty(&self) {
Ok(pretty) => pretty,
Err(e) => panic!("[modelator] CLI output serialization failed: {:?}", e),
};
println!("{}", pretty);
if self.status == CliStatus::Error {
std::process::exit(1);
} else {
std::process::exit(0);
}
}
}
#[derive(Serialize, Debug, PartialEq, Eq, Clone, Copy, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum CliStatus {
Success,
Error,
}