use ratatui::text::Span;
use crate::model::task::{Metadata, Task, TaskState};
use crate::util::unicode;
pub(super) fn state_symbol(state: TaskState) -> &'static str {
match state {
TaskState::Todo => "[ ]",
TaskState::Active => "[>]",
TaskState::Blocked => "[-]",
TaskState::Done => "[x]",
TaskState::Parked => "[~]",
}
}
pub(super) fn abbreviated_id(id: &str) -> &str {
if let Some(dash_pos) = id.find('-') {
let after_prefix = &id[dash_pos + 1..];
if let Some(dot_pos) = after_prefix.find('.') {
return &after_prefix[dot_pos..];
}
}
id
}
pub(super) fn collect_metadata_list(
task: &Task,
f: impl Fn(&Metadata) -> Option<&Vec<String>>,
) -> Vec<String> {
let mut result = Vec::new();
for meta in &task.metadata {
if let Some(items) = f(meta) {
result.extend(items.clone());
}
}
result
}
pub(super) fn spans_width(spans: &[Span]) -> usize {
spans
.iter()
.map(|s| unicode::display_width(&s.content))
.sum()
}