#![allow(dead_code)]
use std::io::IsTerminal;
use std::sync::Arc;
use rich_rust::color::ColorSystem;
use rich_rust::console::Console;
use rich_rust::terminal;
use crate::{ColorMode, Config};
pub struct DemoConsole {
pub console: Arc<Console>,
pub links_enabled: bool,
}
#[must_use]
pub fn build_demo_console(cfg: &Config) -> DemoConsole {
let mut builder = Console::builder().theme(crate::theme::demo_theme());
if let Some(width) = cfg.width {
builder = builder.width(width);
}
if let Some(height) = cfg.height {
builder = builder.height(height);
}
if cfg.force_terminal {
builder = builder.force_terminal(true);
}
if let Some(emoji) = cfg.emoji {
builder = builder.emoji(emoji);
}
if let Some(safe_box) = cfg.safe_box {
builder = builder.safe_box(safe_box);
}
builder = apply_color_mode(builder, cfg.color_system, cfg.force_terminal);
let console = builder.build().shared();
let links_enabled = resolve_links_enabled(cfg);
DemoConsole {
console,
links_enabled,
}
}
fn apply_color_mode(
builder: rich_rust::console::ConsoleBuilder,
mode: ColorMode,
force_terminal: bool,
) -> rich_rust::console::ConsoleBuilder {
match mode {
ColorMode::Auto => {
builder.pipe_if(force_terminal, |b| b.force_terminal(true))
}
ColorMode::None => {
builder.force_terminal(false)
}
ColorMode::Standard => builder
.color_system(ColorSystem::Standard)
.pipe_if(force_terminal, |b| b.force_terminal(true)),
ColorMode::EightBit => builder
.color_system(ColorSystem::EightBit)
.pipe_if(force_terminal, |b| b.force_terminal(true)),
ColorMode::TrueColor => builder
.color_system(ColorSystem::TrueColor)
.pipe_if(force_terminal, |b| b.force_terminal(true)),
}
}
trait PipeIf: Sized {
fn pipe_if(self, cond: bool, f: impl FnOnce(Self) -> Self) -> Self;
}
impl PipeIf for rich_rust::console::ConsoleBuilder {
fn pipe_if(self, cond: bool, f: impl FnOnce(Self) -> Self) -> Self {
if cond { f(self) } else { self }
}
}
fn resolve_links_enabled(cfg: &Config) -> bool {
if let Some(links) = cfg.links {
return links;
}
let is_tty = cfg.force_terminal || std::io::stdout().is_terminal();
is_tty && !terminal::is_dumb_terminal() && cfg.interactive.unwrap_or(true)
}