use crate::cli::Format;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) enum DisplayMode {
Tui,
Output(Format),
}
pub(crate) fn resolve_display_mode(
tui: bool,
format: Option<Format>,
stdout_is_tty: bool,
) -> DisplayMode {
if tui {
return DisplayMode::Tui;
}
if let Some(format) = format {
return DisplayMode::Output(format);
}
if stdout_is_tty {
DisplayMode::Tui
} else {
DisplayMode::Output(Format::Md)
}
}
#[cfg(test)]
mod tests {
use super::*;
use pretty_assertions::assert_eq;
use rstest::rstest;
#[rstest]
#[case::should_choose_tui_when_tui_flag_is_set_and_stdout_is_a_terminal(
true,
None,
true,
DisplayMode::Tui
)]
#[case::should_choose_tui_when_tui_flag_is_set_and_stdout_is_not_a_terminal(
true,
None,
false,
DisplayMode::Tui
)]
#[case::should_choose_explicit_format_over_terminal_stdout(
false,
Some(Format::Json),
true,
DisplayMode::Output(Format::Json)
)]
#[case::should_choose_explicit_format_over_non_terminal_stdout(
false,
Some(Format::Md),
false,
DisplayMode::Output(Format::Md)
)]
#[case::should_default_to_tui_when_neither_flag_is_set_and_stdout_is_a_terminal(
false,
None,
true,
DisplayMode::Tui
)]
#[case::should_default_to_markdown_when_neither_flag_is_set_and_stdout_is_not_a_terminal(
false,
None,
false,
DisplayMode::Output(Format::Md)
)]
fn resolve_display_mode_cases(
#[case] tui: bool,
#[case] format: Option<Format>,
#[case] stdout_is_tty: bool,
#[case] expected: DisplayMode,
) {
let actual = resolve_display_mode(tui, format, stdout_is_tty);
assert_eq!(expected, actual);
}
}