devstart 0.7.0

Make me: make me run dev tasks without thinking
Documentation
use crate::alias::AliasMap;

use crate::shortcuts::Shortcuts;
use crate::tasks::TableEntry;
use crate::Task;
use owo_colors::OwoColorize;
use tabled::Style;
use tabled::Table;

#[must_use]
pub fn render(tasks: &[Task], aliases: &AliasMap, shortcuts: &Option<Shortcuts>) -> String {
    let mut out = String::new();
    let list = tasks
        .iter()
        .map(|t| TableEntry {
            task: if t.task == "unassigned" {
                "---".to_string()
            } else {
                format!(
                    "{} {}",
                    t.task.clone(),
                    aliases
                        .ntoa(&t.task)
                        .map(|a| format!("({a})"))
                        .unwrap_or_default()
                )
            },
            symbol: t.emoji.clone(),
            exec: t.exec.clone(),
            details: t.details.clone().unwrap_or_default(),
        })
        .collect::<Vec<_>>();

    out.push_str(&Table::new(&list).with(Style::rounded()).to_string());

    if let Some(shortcuts) = shortcuts.as_ref() {
        out.push('\n');
        if let Some(links) = shortcuts.links.as_ref() {
            if !links.is_empty() {
                out.push_str(&"links:\n".underline().to_string());
                for (k, v) in links {
                    out.push_str(&format!("  {} {}\n", k.yellow(), v.title.dimmed()));
                }
            }
        }

        if let Some(folders) = shortcuts.folders.as_ref() {
            if !folders.is_empty() {
                out.push_str(&"folders:\n".underline().to_string());
                for (k, v) in folders {
                    out.push_str(&format!("  {} {}\n", k.yellow(), v.title.dimmed()));
                }
            }
        }
    }
    out
}