qqq-cli 0.9.0

Local-first task queue for coding agent sessions
use super::{clean, field};
use serde_json::Value;

pub(super) fn render(value: &Value) -> String {
    let dry_run = value["dry_run"] == true;
    let count = value["count"].as_u64().unwrap_or(0);
    let action = if dry_run { "Validated" } else { "Imported" };
    let plural = if count == 1 { "task" } else { "tasks" };
    let suffix = if dry_run {
        " (dry-run; no tasks created)"
    } else {
        ""
    };
    let mut lines = vec![format!("{action} {count} {plural}{suffix}.")];
    for task in value["tasks"].as_array().into_iter().flatten() {
        if dry_run {
            let description = task["description"]
                .as_str()
                .unwrap_or("")
                .lines()
                .next()
                .unwrap_or("");
            let parent = if !task["parent"]["key"].is_null() {
                format!("key {}", field(&task["parent"], "key"))
            } else if !task["parent_id"].is_null() {
                format!("#{}", field(task, "parent_id"))
            } else {
                "none".to_owned()
            };
            let prerequisites = task["depends_on"]
                .as_array()
                .into_iter()
                .flatten()
                .map(|reference| {
                    if reference["id"].is_null() {
                        format!("key {}", field(reference, "key"))
                    } else {
                        format!("#{}", field(reference, "id"))
                    }
                })
                .collect::<Vec<_>>();
            let extras = if prerequisites.is_empty() {
                String::new()
            } else {
                format!("  Prerequisites: {}", prerequisites.join(", "))
            };
            lines.push(format!(
                "{}  Priority: {}  Parent: {}{extras}  {}",
                field(task, "key"),
                field(task, "priority"),
                parent,
                clean(description)
            ));
        } else {
            lines.push(format!("{} -> #{}", field(task, "key"), field(task, "id")));
        }
    }
    lines.join("\n")
}