reopen.rs

 1use anyhow::Result;
 2use std::path::Path;
 3
 4use crate::db;
 5
 6pub fn run(root: &Path, ids: &[String], json: bool) -> Result<()> {
 7    let store = db::open(root)?;
 8    let ts = db::now_utc();
 9
10    let mut reopened = Vec::new();
11    for raw in ids {
12        let id = db::resolve_task_id(&store, raw, false)?;
13        let id_key = id.as_str().to_string();
14        store.apply_and_persist(|doc| {
15            let tasks = doc.get_map("tasks");
16            if let Some(task) = db::get_task_map(&tasks, &id)? {
17                task.insert("status", db::status_label(db::Status::Open))?;
18                task.insert("updated_at", ts.clone())?;
19            }
20            Ok(())
21        })?;
22        reopened.push(id_key);
23    }
24
25    if json {
26        let out: Vec<_> = reopened
27            .iter()
28            .map(|id| serde_json::json!({"id": id, "status": "open"}))
29            .collect();
30        println!("{}", serde_json::to_string(&out)?);
31    } else {
32        let c = crate::color::stdout_theme();
33        for id in reopened {
34            println!("{}reopened{} {id}", c.green, c.reset);
35        }
36    }
37
38    Ok(())
39}