use owo_colors::{OwoColorize as _, Stream::Stdout};
use crate::domain::model::status::StatusCategory;
fn color_enabled() -> bool {
supports_color::on(supports_color::Stream::Stdout).is_some()
}
pub fn id(s: &str) -> String {
if color_enabled() {
s.if_supports_color(Stdout, |t| t.bold()).to_string()
} else {
s.to_string()
}
}
pub fn status(label: impl AsRef<str>, category: StatusCategory) -> String {
let label = label.as_ref();
match category {
StatusCategory::Queued => {
let text = format!("◯ {label}");
if color_enabled() {
text.if_supports_color(Stdout, |t| t.bright_black())
.to_string()
} else {
text
}
}
StatusCategory::Active => {
let text = format!("● {label}");
if color_enabled() {
text.if_supports_color(Stdout, |t| t.cyan()).to_string()
} else {
text
}
}
StatusCategory::Stalled => {
let text = format!("⏸ {label}");
if color_enabled() {
text.if_supports_color(Stdout, |t| t.yellow()).to_string()
} else {
text
}
}
StatusCategory::Resolved => {
let text = format!("✓ {label}");
if color_enabled() {
text.if_supports_color(Stdout, |t| t.green()).to_string()
} else {
text
}
}
StatusCategory::Cancelled => {
let text = format!("✗ {label}");
if color_enabled() {
text.if_supports_color(Stdout, |t| t.red()).to_string()
} else {
text
}
}
StatusCategory::Unknown => {
let text = format!("- {label}");
if color_enabled() {
text.if_supports_color(Stdout, |t| t.bright_black())
.to_string()
} else {
text
}
}
}
}
pub fn dr_status(s: crate::domain::model::decision_record::DrStatus) -> String {
use crate::domain::model::decision_record::DrStatus;
let category = match s {
DrStatus::Proposed => StatusCategory::Queued,
DrStatus::Accepted => StatusCategory::Resolved,
DrStatus::Rejected | DrStatus::Deprecated | DrStatus::Superseded => {
StatusCategory::Cancelled
}
};
status(s.as_str(), category)
}
pub fn section(s: &str) -> String {
if color_enabled() {
s.if_supports_color(Stdout, |t| t.bold()).to_string()
} else {
s.to_string()
}
}
pub fn separator(width: usize) -> String {
let line = "─".repeat(width);
if color_enabled() {
line.if_supports_color(Stdout, |t| t.bright_black())
.to_string()
} else {
line
}
}
pub fn label(s: &str) -> String {
if color_enabled() {
s.if_supports_color(Stdout, |t| t.bright_black())
.to_string()
} else {
s.to_string()
}
}
pub fn number(s: &str) -> String {
if color_enabled() {
s.if_supports_color(Stdout, |t| t.bold()).to_string()
} else {
s.to_string()
}
}
pub fn check_ok(path: &str) -> String {
if color_enabled() {
format!(
"{} {}",
"✓".if_supports_color(Stdout, |t| t.bright_black()),
path.if_supports_color(Stdout, |t| t.bright_black())
)
} else {
format!("ok {path}")
}
}
pub fn check_error(path: &str, message: &str) -> String {
if color_enabled() {
use owo_colors::OwoColorize as _;
let symbol = "✗".red().to_string();
let symbol = symbol.if_supports_color(Stdout, |t| t.bold()).to_string();
let path_s = path.if_supports_color(Stdout, |t| t.bold()).to_string();
format!("{symbol} {path_s}: {message}")
} else {
format!("error {path}: {message}")
}
}
pub fn check_warn(path: &str, message: &str) -> String {
if color_enabled() {
use owo_colors::OwoColorize as _;
let symbol = "⚠".yellow().to_string();
let symbol = symbol.if_supports_color(Stdout, |t| t.bold()).to_string();
format!("{symbol} {path}: {message}")
} else {
format!("warning {path}: {message}")
}
}
pub fn success(s: &str) -> String {
if color_enabled() {
s.if_supports_color(Stdout, |t| t.green()).to_string()
} else {
s.to_string()
}
}
pub fn noop(s: &str) -> String {
if color_enabled() {
s.if_supports_color(Stdout, |t| t.bright_black())
.to_string()
} else {
s.to_string()
}
}