1use anyhow::{bail, Result};
2use std::path::Path;
3
4use crate::db;
5
6pub fn run(root: &Path, id: &str, json: bool) -> Result<()> {
7 let conn = db::open(root)?;
8
9 let exists: bool = conn.query_row("SELECT COUNT(*) FROM tasks WHERE id = ?1", [id], |r| {
10 r.get::<_, i64>(0).map(|n| n > 0)
11 })?;
12
13 if !exists {
14 bail!("task {id} not found");
15 }
16
17 let detail = db::load_task_detail(&conn, id)?;
18
19 if json {
20 println!("{}", serde_json::to_string(&detail)?);
21 } else {
22 let c = crate::color::stdout_theme();
23 let t = &detail.task;
24 println!("{} id{} = {}", c.bold, c.reset, t.id);
25 println!("{} title{} = {}", c.bold, c.reset, t.title);
26 println!("{} status{} = {}", c.bold, c.reset, t.status);
27 println!(
28 "{} priority{} = {}",
29 c.bold,
30 c.reset,
31 db::priority_label(t.priority)
32 );
33 println!(
34 "{} effort{} = {}",
35 c.bold,
36 c.reset,
37 db::effort_label(t.effort)
38 );
39 println!("{} type{} = {}", c.bold, c.reset, t.task_type);
40 if !t.description.is_empty() {
41 println!("{} description{} = {}", c.bold, c.reset, t.description);
42 }
43 println!("{} created{} = {}", c.bold, c.reset, t.created);
44 println!("{} updated{} = {}", c.bold, c.reset, t.updated);
45 if !detail.labels.is_empty() {
46 println!(
47 "{} labels{} = {}",
48 c.bold,
49 c.reset,
50 detail.labels.join(",")
51 );
52 }
53 if !detail.blockers.is_empty() {
54 println!(
55 "{} blockers{} = {}",
56 c.bold,
57 c.reset,
58 detail.blockers.join(",")
59 );
60 }
61 }
62
63 Ok(())
64}