show.rs

 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}