use super::context_bar::slot_bar;
use tui::{Color, Theme};
use utils::ReasoningEffort;
fn filled_slots(effort: Option<ReasoningEffort>, total: usize) -> usize {
effort.map_or(0, |e| e.ordinal() + 1).min(total)
}
pub(crate) fn reasoning_bar(effort: Option<ReasoningEffort>, total_levels: usize) -> String {
format!("reasoning {}", slot_bar(filled_slots(effort, total_levels), total_levels))
}
pub(crate) fn reasoning_color(effort: Option<ReasoningEffort>, total_levels: usize, theme: &Theme) -> Color {
let filled = filled_slots(effort, total_levels);
if total_levels == 0 || filled * 3 <= total_levels {
theme.text_secondary()
} else if filled * 3 <= total_levels * 2 {
theme.info()
} else {
theme.success()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn bar_none_3_slots() {
assert_eq!(reasoning_bar(None, 3), "reasoning [···]");
}
#[test]
fn bar_low_3_slots() {
assert_eq!(reasoning_bar(Some(ReasoningEffort::Low), 3), "reasoning [■··]");
}
#[test]
fn bar_medium_3_slots() {
assert_eq!(reasoning_bar(Some(ReasoningEffort::Medium), 3), "reasoning [■■·]");
}
#[test]
fn bar_high_3_slots() {
assert_eq!(reasoning_bar(Some(ReasoningEffort::High), 3), "reasoning [■■■]");
}
#[test]
fn bar_4_slots() {
assert_eq!(reasoning_bar(None, 4), "reasoning [····]");
assert_eq!(reasoning_bar(Some(ReasoningEffort::Low), 4), "reasoning [■···]");
assert_eq!(reasoning_bar(Some(ReasoningEffort::High), 4), "reasoning [■■■·]");
assert_eq!(reasoning_bar(Some(ReasoningEffort::Xhigh), 4), "reasoning [■■■■]");
}
#[test]
fn bar_xhigh_clamped_to_3_slots() {
assert_eq!(reasoning_bar(Some(ReasoningEffort::Xhigh), 3), "reasoning [■■■]");
}
#[test]
fn color_tiers_3_slots() {
let theme = Theme::default();
assert_eq!(reasoning_color(None, 3, &theme), theme.text_secondary());
assert_eq!(reasoning_color(Some(ReasoningEffort::Low), 3, &theme), theme.text_secondary());
assert_eq!(reasoning_color(Some(ReasoningEffort::Medium), 3, &theme), theme.info());
assert_eq!(reasoning_color(Some(ReasoningEffort::High), 3, &theme), theme.success());
}
#[test]
fn color_tiers_4_slots() {
let theme = Theme::default();
assert_eq!(reasoning_color(Some(ReasoningEffort::Low), 4, &theme), theme.text_secondary());
assert_eq!(reasoning_color(Some(ReasoningEffort::Medium), 4, &theme), theme.info());
assert_eq!(reasoning_color(Some(ReasoningEffort::High), 4, &theme), theme.success());
assert_eq!(reasoning_color(Some(ReasoningEffort::Xhigh), 4, &theme), theme.success());
}
}