use anyhow::{Error, Result, anyhow};
use serde::Deserialize;
use std::str::FromStr;
use strum::{Display, EnumIter, EnumString, VariantNames};
#[derive(Debug, Deserialize, Default, Clone, Display, EnumIter, VariantNames, PartialEq)]
#[non_exhaustive]
#[strum(serialize_all = "snake_case")]
#[serde(rename_all = "snake_case")]
pub(crate) enum StatsFormat {
#[default]
Compact,
Detailed,
Json,
Junit,
Markdown,
}
impl FromStr for StatsFormat {
type Err = Error;
fn from_str(format: &str) -> Result<Self, Self::Err> {
match format.to_lowercase().as_str() {
"compact" | "string" => Ok(StatsFormat::Compact),
"detailed" => Ok(StatsFormat::Detailed),
"json" => Ok(StatsFormat::Json),
"junit" => Ok(StatsFormat::Junit),
"markdown" | "md" => Ok(StatsFormat::Markdown),
_ => Err(anyhow!("Unknown format {format}")),
}
}
}
#[derive(
Debug, Deserialize, Default, Clone, Display, EnumIter, EnumString, VariantNames, PartialEq,
)]
#[non_exhaustive]
pub(crate) enum OutputMode {
#[serde(rename = "plain")]
#[strum(serialize = "plain", ascii_case_insensitive)]
Plain,
#[serde(rename = "color")]
#[strum(serialize = "color", ascii_case_insensitive)]
#[default]
Color,
#[serde(rename = "emoji")]
#[strum(serialize = "emoji", ascii_case_insensitive)]
Emoji,
#[serde(rename = "task")]
#[strum(serialize = "task", ascii_case_insensitive)]
Task,
}
impl OutputMode {
pub(crate) const fn is_plain(&self) -> bool {
matches!(self, OutputMode::Plain)
}
pub(crate) const fn is_emoji(&self) -> bool {
matches!(self, OutputMode::Emoji)
}
}