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}