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, 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": t.priority,
33                })
34            })
35            .collect();
36        println!("{}", serde_json::to_string(&summary)?);
37    } else {
38        let c = crate::color::stdout_theme();
39        for t in &tasks {
40            println!(
41                "{}{:<12}{} {}P{:<3}{} {}",
42                c.green, t.id, c.reset, c.red, t.priority, c.reset, t.title
43            );
44        }
45    }
46
47    Ok(())
48}