use clap::ValueEnum;
use core::fmt;
use serde::Serialize;
use thiserror::Error;
use crate::results;
#[derive(Error, Debug)]
pub(crate) enum ApplicationError {
#[error("Invalid input (expected {expected:?}, got {found:?}")]
InvalidArgument { expected: String, found: String },
#[error("Failed to prepare output in this format {err:?}")]
OutputFormatError { err: String },
}
#[derive(ValueEnum, Clone, Debug)]
pub(crate) enum OutputFormat {
Text,
Yaml,
Json,
}
#[derive(Serialize)]
#[serde(untagged)]
pub(crate) enum ApplicationOutput {
ComparisonStatement(results::ComparisonStatement),
OrderedVersionMap(results::OrderedVersionMap),
VersionExplaination(results::VersionExplaination),
FlatVersionsList(results::FlatVersionsList),
FilterTestResult(results::FilterTestResult),
}
impl From<results::ComparisonStatement> for ApplicationOutput {
fn from(value: results::ComparisonStatement) -> Self {
ApplicationOutput::ComparisonStatement(value)
}
}
impl From<results::OrderedVersionMap> for ApplicationOutput {
fn from(value: results::OrderedVersionMap) -> Self {
ApplicationOutput::OrderedVersionMap(value)
}
}
impl From<results::VersionExplaination> for ApplicationOutput {
fn from(value: results::VersionExplaination) -> Self {
ApplicationOutput::VersionExplaination(value)
}
}
impl From<results::FlatVersionsList> for ApplicationOutput {
fn from(value: results::FlatVersionsList) -> Self {
ApplicationOutput::FlatVersionsList(value)
}
}
impl From<results::FilterTestResult> for ApplicationOutput {
fn from(value: results::FilterTestResult) -> Self {
ApplicationOutput::FilterTestResult(value)
}
}
impl fmt::Display for ApplicationOutput {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
ApplicationOutput::ComparisonStatement(v) => {
write!(f, "{}", v)
}
ApplicationOutput::OrderedVersionMap(v) => {
write!(f, "{}", v)
}
ApplicationOutput::VersionExplaination(v) => {
write!(f, "{}", v)
}
ApplicationOutput::FlatVersionsList(v) => {
write!(f, "{}", v)
}
ApplicationOutput::FilterTestResult(v) => {
write!(f, "{}", v)
}
}
}
}