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}