ready.rs

 1use anyhow::Result;
 2use std::path::Path;
 3
 4use crate::db;
 5
 6pub fn run(root: &Path, json: bool) -> Result<()> {
 7    let conn = db::open(root)?;
 8
 9    let mut stmt = conn.prepare(
10        "SELECT id, title, description, type, priority, status, effort, parent, created, updated
11         FROM tasks
12         WHERE status = 'open'
13           AND id NOT IN (
14               SELECT b.task_id FROM blockers b
15               JOIN tasks t ON b.blocker_id = t.id
16               WHERE t.status != 'closed'
17           )
18         ORDER BY priority, created",
19    )?;
20
21    let tasks: Vec<db::Task> = stmt
22        .query_map([], db::row_to_task)?
23        .collect::<rusqlite::Result<_>>()?;
24
25    if json {
26        let summary: Vec<serde_json::Value> = tasks
27            .iter()
28            .map(|t| {
29                serde_json::json!({
30                    "id": t.id,
31                    "title": t.title,
32                    "priority": db::priority_label(t.priority),
33                    "effort": db::effort_label(t.effort),
34                })
35            })
36            .collect();
37        println!("{}", serde_json::to_string(&summary)?);
38    } else {
39        let c = crate::color::stdout_theme();
40        for t in &tasks {
41            println!(
42                "{}{:<12}{} {}{:<8}{} {}",
43                c.green,
44                t.id,
45                c.reset,
46                c.red,
47                db::priority_label(t.priority),
48                c.reset,
49                t.title
50            );
51        }
52    }
53
54    Ok(())
55}